青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

思勤無邪

上學時,因我年齡最小,個頭也最小,上課時,就像大猩猩堆里的猴一般。如今,這猴偶爾也把最近的一些情況寫在這里。

   :: 首頁 :: 聯系 :: 聚合  :: 管理
  132 Posts :: 1 Stories :: 178 Comments :: 0 Trackbacks

公告

     吾日常三省吾身,曰思、曰勤、曰無邪。

積分與排名

  • 積分 - 187701
  • 排名 - 140

最新隨筆

最新評論

閱讀排行榜

評論排行榜

網上看了篇文章,覺得很不錯,抄在下面。因原文沒注明作者,在這也不知道作者是誰了。

編程概述

編程術可以看作實用魔法的一個分支。編程魔法師用時間和精力做祭品,與生活在計算機中的精靈訂立契約,以換取駕馭代碼的能力。
---fmddlmyy

要提高編程水平,唯有多看多寫。這篇文章看似經驗之談,實質還是灌水。本次灌水,擬定了以下幾個主題:

§?????? 編程概述

§?????? 軟件開發中的方法論

§?????? 編程實踐

§?????? 嵌入式編程的特點

編程概述

本文將從不同角度討論 什么是編程 ,或者 什么是編程的本質問題 。這些討論并不是要得出什么定義,我們實際上是在表述各種編程思想,以期加深對編程的理解。

1 編程不是藝術

我們的世界是模糊的、連續的、不精確的,但軟件是精確、離散的、形式化的,這就注定了軟件不能完全描述現實世界。因此我們需要知道描述哪些部分,忽略哪些部分,這就是軟件的本質問題。
--- Tom Demarco

編程不是藝術。編程不追求完美,它的目的是解決問題。

和藝術上的 只能意會,不可言傳 相反,編程甚至不能忍受自然語言的模糊性,它要求問題被表述成可編譯、可運行的代碼,文字和圖表只是輔助交流的工具。

每個程序員有兩個面具:職業的和專業的。戴上職業面具后,程序員會用能找到的最好用的工具,以盡可能簡單的方式,在合理的成本內解決問題中必須解決的部分。

而戴上專業面具的程序員,會不厭其煩地學習各種編程知識(很多都不是職業需要的),積累經驗值,吸收可復用的模式和思想。他們會用大量時間去理解程序的表象和 CPU 的匯編代碼之間究竟發生了什么。他們有著探索未知領域和練功升級的強烈欲望。

他們在不斷接近技藝的完美,而這個技藝本身是以不談完美、但求有效的方式解決問題。他們付出了大量的努力,而這些努力的驅動力是好奇心和進取心。如同《魔法學徒》中描述的魔法師,一個魔法師所追求的東西只有志趣相投的魔法師才能理解,而不管他們出于哪個陣營。了解事物真相本身帶來的滿足就可以作為一切努力的回報,

2 控制復雜性

任何一個正在構建大型系統的人,天天面對的中心議題就是:如何剔除不必要的、人為的、自找的復雜部分,并控制好剩下的,無可逃避的復雜性。
--- Betrand Meyer

編程可以被看成一種管理工作,管理的對象是代碼,控制的對象是代碼的復雜性。

中國的傳統思維比較喜歡談本質,追求一種稱作 的東西。而在編程上,表象和本質同樣重要。所有程序說到底不過是一些匯編語句的組合,但了解這個本質在大多數場合都不能有助于解決實際問題。

寫代碼是為了解決實際問題。當代碼的數量增加到一定程度,對代碼自身的控制也會成為一個重要的問題。數量改變了本質。

管理的要訣是削弱、孤立被管理的對象, 使民無知 使民 ”“ 雞犬之聲相聞 至老死 不相往來 。每個被管理的對象在完成自身工作的前提下,對其它對象的了解應當盡可能少。通過盡量降低對象間的耦合程度來控制復雜性。

只有有效地控制復雜性,我們才能使用越來越大的信息塊,駕馭越來越多的代碼,用這些 0 1 的操作去實現前人沒有,甚至無法完成的工作。

3 復用

編程技藝的核心是代碼的復用。復用已有的知識是積累、提高的前提,否則就會像誰誰誰那樣每天推石頭上山,而不能累進。在上帝看來,重復是一種懲罰的手段。

編程這個職業知識更新比較快,可以學習的東西也很多。有些人覺得累,但有些人卻覺得其樂無窮,覺得從事這個職業是很幸運的事情。

編程的實質是建筑,根據應用的需求,不斷建筑更大的信息塊。我們所寫的所有程序,都可以被看作對語言的擴充。事實上,我們在不停地開發新的語言,我們所寫的每個函數、每個類都是在為現有語言增加新的功能。我們按照適合特定應用的模式,組合各種信息塊,完成實際的應用。這些信息塊有的是我們自己做的,有的是拿來的。

信息塊可以被組合的關鍵就是簡單、明確的接口。所以,我們應當針對接口編程,而不是針對應用編程。應用意味著變化和不可復用。將應用合理分解為模塊,定義好模塊間的接口,然后按照接口構建模塊。模塊分解的原則是:

§?????? 模塊的耦合程度盡可能得低(有人稱此為最少知識原則);

§?????? 接口盡可能簡單(有人稱此為接口隔離原則);

§?????? 如果將變化的因素封裝到模塊中,每個模塊應該只封裝一個因素(有人稱此為單一責任原則);

§?????? 使特定于應用的代碼盡可能得少

針對接口編程的好處有兩個方面:

§?????? 信息塊可以被復用;

§?????? 復雜性可以被更好地控制。

人們用各種方式復用知識,其實 C 語言本身又何嘗不是知識的復用呢?其它復用方式包括:庫函數、新的語言和編譯器、新的腳本、類庫、程序框架、設計模式、面向對象、面向組件、面向服務、面向方面、面向領域、各種開源代碼、開發環境提供的各種 Wizard 和糖衣、各種代碼生成工具等等。充分了解編程環境,善于復用各種資源,是程序員的基本功。

?

軟件開發中的方法論

?

1 項目管理的方法論

1.1 方法論

方法論的英文為 Methodology ,編程的方法論應該是指軟件開發的一整套方法、過程、規則、實踐、技術。不過我們一般提到的方法論都偏重于項目、過程和人員的管理。

Agile Software Development 》的作者 Alistair Cockburn 提出方法論具有以下要素:角色、個性、技能、團隊、技術、活動、過程、產品、里程碑、標準、質量、工具、團隊價值,它們的關系可以用一幅圖來表示:

?image001.jpg

雖然將這幅圖貼在這里,事實上我不了解這些要素及其關系的確切定義,對于這些不能精確描述的東西,我接受起來比較困難。

其實,項目管理的核心是溝通和反饋。只要能夠保證良好的溝通和即時的反饋,開發團隊即使并沒有采用先進的方法論,一樣可以成功。從另一個角度說,過程和工件能輔助,但不能保證開發人員、項目經理和客戶的良好交流。

1.2 重型方法

有的方法論規定了大量的中間文檔和復雜的過程管理。那些中間文檔被稱為 artifact ,或工件。需要大量 artifact 和軟件開發方法被稱作重型( Heavy Weight )方法。

這些復雜的方法來源于恐懼。

在中大型的項目中,項目經理往往遠離代碼,他們無法有效的了解目前的工程的進度、質量、成本等因素。為了克服未知的恐懼感,項目經理制定了大量的中間管理方法,希望能夠控制整個項目,最典型的莫過于要求開發人員頻繁地遞交各種報告。重型方法中的基本假設是過程(及各種 artifact )比個人可靠。

雖然很多輕型方法都將重型方法作為反面例子,但對于大多數大型項目,重型方法是管理所必需的。

1.3 輕型方法

為了解決重型方法存在的問題,業界出現了很多輕型( Light Weight )方法論。提出這些方法論的部分作者結成了一個聯盟:敏捷軟件開發。他們還有一個宣言:

§?????? Individuals and interactions over processes and tools.

§?????? Working software over comprehensive documentation.

§?????? Customer collaboration over contract negotiation.

§?????? Responding to change over following a plan.

在這些宣言后面還有很多原則。概括起來主要是:尊重個人,強調溝通和反饋,與客戶緊密合作,保持設計的簡單性等等。敏捷方法在重型方法論和無管理狀態之間尋求一個平衡點,希望用低成本的管理活動帶來最大的產出。

2 編程的方法論

作為程序員,我更感興趣的是可以指導編程的方法論。

2.1 測試驅動開發

2.1.1 未謀進,先謀退

開始一件事情之前,必須先明確什么時候可以停止。什么 止于至善 ,在編程工作中可以一腳踢開。我們必須明確要做什么,做到什么樣子就算完成了。

怎樣才算明確呢?最理想的方法是先寫一個測試程序,然后再編寫代碼,讓測試通過。測試程序規定了停止的必要條件。

測試程序是針對接口編寫的。要寫出測試程序,必須先定義好接口,然后針對接口編程。測試程序同時示范了接口的使用。

如果有一個運行很方便的測試程序,我們在維護代碼時,就放心得多。可以經常跑一跑,測試一下,以保證測試要求的功能還沒有被破壞。相反,如果沒有測試程序,我在修改代碼的 bug 時,心里就很不踏實,因為我不清楚我的修改是否會引入新的 bug

2.1.2 保持可運行,可調試的狀態

先寫測試程序 適合沒有 UI ,功能相對簡單的模塊。對于功能復雜的軟件系統,需要測試的方面很多,測試時間很長,在開發前就建立一個比較全面的測試,并且隨時使用,有時是不可能的。

但我們至少應該保證:寫任何程序,都要盡量保持在可運行、可調試的狀態。即使要為此寫一些額外的程序,都是值得的。在不能運行的情況下,編寫大量代碼是不可思議的事情。

2.1.3 可測試性

IC 設計上有一個 “Design For Test” 的說法,即 IC 的設計中必須要考慮到如何測試,留好測試的接口。軟件開發也是一樣的,我們寫每段代碼,都要考慮一下這段代碼是否可以測試,為了保證可測試性,必要的時候可以修改設計。

2.2 重構

《重構》這本書內容樸實、但對我個人影響很大。在了解 兩頂帽子 小步前進 的方法后,我敢于修改任何代碼,甚至是我不熟悉底層邏輯的代碼。

2.2.1 兩頂帽子

我們有兩頂帽子:一頂是不改變功能的前提下,改善現有現有程序的設計;另一頂是增加新的功能,以適應需求變化。我們在任意階段,應該只戴一頂帽子,絕對不能同時戴兩頂帽子。

在增加新功能的時候,往往需要先改進現有的代碼結構,使之能更好地適應變化。如果功能有較大變動,我們應該將這變動分解成盡可能小的步驟,并讓改進代碼和新增功能的小步驟交替進行。將原有代碼平滑地演變到新代碼,既增加了功能,又改善原有代碼的設計。

重構的正式定義應該是 在代碼寫好之后改進它的設計 。但對我而言,重構的思想已經融入了我的開發過程。在開發中,我同樣按照 兩頂帽子 小步前進 的方針平滑地演變代碼,從無到有,逐步完善。

2.2.2 代碼的壞味道

重構的對象是消除 代碼的壞味道 ,保持新鮮、健康的代碼。《重構》中列舉了一些典型的壞味道,例如重復代碼、太長的函數、太長的參數列等等。

2.2.3 設計和重構

存在這么一種說法: 設計不再是一切動作的前提,而是在整個開發過程中逐漸浮現出來 的。

事實上,在沒有任何軟件工程理論的時代,編程基本上是寫到哪兒算哪兒。歷史是螺旋上升的,在投影上很接近的兩個點在鉛垂線方向上是處于不同高度的。

重構是要糾正過度設計的傾向,告訴程序員:即使開始的設計有缺陷,也沒關系,更不要僵化地保持,我們可以重構代碼,平滑地修改原有設計。這并不是說前期設計不重要。

設計是在整個開發過程中逐漸浮現出來 ,這是在說隨著開發的深入,我們會對很多問題考慮地更加清楚。在必要的時候,我們應該用重構的方法靈活地改變設計,適應變化。

?

?

編程實踐

鳩集遺失,鑒玩整理,晝夜精勤,每獲一卷,遇一畫,畢孜孜葺綴,竟日寶玩,可致者必貨敝衣 , 減糧食。妻子童仆切切嗤笑,或曰:終日為無益之事何補哉。既而嘆曰:若復不為無益之事,則安能悅有涯之生。
---
張彥遠 《歷代名畫記》

1 編程的要素

編程有 3 個要素:語言、環境和思想。

1.1 語言

有人喜歡爭論語言的優劣。其實,除了匯編語言,各種語言、腳本、標準庫、類庫、框架都蘊含著大量成熟的編程經驗和思想。程序員應該多熟悉一些語言,特別是有代表性的語言。

個人覺得,一個程序員應該掌握一兩種匯編語言( CISC X86 RISC ARM )、一種面向過程語言( C )、兩、三種面向對象語言( C++ Java Delphi )、一兩種腳本語言( perl python ruby )。如果有時間,可以再學習一些學術性較強的語言,例如 Scheme

學習新的語言,不僅可以吸收語言中蘊含的設計理念,還可以打開連接新空間的大門,使我們可以學習、復用使用該語言的各種資源,例如源代碼、文章、書籍。

1.2 環境

1.2.1 開發時和運行時

環境可以被理解為程序所有外界環境的總和,包括開發時環境、運行時環境。我們在寫一段程序時,應該對該程序的相關環境有清楚的了解。

開發時環境包括我們使用的編譯(鏈接)環境、復用的代碼(框架、類庫、控件等),系統的邏輯結構、代碼的文件組織、需要的工具軟件、調試環境等等。

運行時環境包括程序運行時環境中所包含、發生的一切,特別是與我們的程序相關的部分。從小處看,我們應該知道如何確定每段代碼運行的 context (線程和堆棧),每個變量所使用的空間的信息。從大處看,我們應該了解系統運行的來龍去脈,各個模塊(邏輯概念)如何相互配合,各個線程(調度單位)如何相互通信,什么時候可能發生調度,系統中有哪些不確定的因素等等。

1.2.2 軟件類型

比較 典型 的軟件類型包括:

1.?? Windows 操作系統;

2.?? Linux 操作系統;

3.?? 編譯器;

4.?? 虛擬機;

5.?? 調試器;

6.?? Windows 的單機應用程序;

7.?? Windows 的驅動程序;

8.?? Linux 的應用程序和驅動程序;

9.?? 基于 socket 的客戶端 - 服務器程序;

10.?? 數據庫應用程序;

11.?? 使用數據庫的 Web 應用程序;

12.?? 使用 RTOS 的嵌入式軟件;

13.?? 不使用 RTOS 的單片機程序;

14.?? DSP 程序;

15.?? 嵌入式環境的第三方程序( J2ME 應用、 BREW 應用、 symbian 的應用程序等等);

16.?? 各種中大型程序的腳本環境,插件的開發、運行環境;

17.?? Office 應用程序開發;

18.?? flash 編程;

軟件的種類實在太多,所謂 典型 只是我個人的理解,肯定還有很多軟件類型沒有被列出來。程序員應該了解開發和運行這些軟件時,究竟發生了什么。

對于 Windows Linux 操作系統,我們應該有個概要的了解:從 BIOS 程序讀 Master Boot Record ,到系統的裝載運行;應用程序或動態連接庫( Linux SO )的裝載;操作系統的基本模塊(包括內核)的功能; Windows 如何通過 COM 機制將各個功能模塊組合起來等等。這些內容是 PC 程序的基本運行環境。

嵌入式環境相對 PC 環境要簡單一些,特別是用 NOR flash ,代碼直接從 ROM 運行的系統。一方面,程序員通常可以看到系統運行的所有代碼;另一方面,嵌入式環境有時不提供第三方程序運行機制,有時提供比較簡單的機制,有時用 java 虛擬機當作第三方程序運行機制。不過,智能手機的應用處理器一般使用 NAND flash ,從 BIOS 運行一小段啟動代碼,將系統裝載到 RAM 運行,同時支持應用程序裝載運行,已經很接近 PC 環境。

編寫單機應用程序,除了語言外,主要要熟悉各種庫、框架、組件。一些通用庫提供了常用函數、各種容器和算法、 GUI 、典型的程序框架,系統 API 的封裝等等,例如:

§?????? 移植性比較好的 C 標準庫、 STL boost TK 等;

§?????? Windows 上的 MFC VCL Delphi/C++ Builder );

§?????? Linux 上的 ncurses X Windows GTK Qt 等;

§?????? 訪問數據庫: VC++ ODBC DAO ADO Borland BDE 等;

§?????? Borland 做了一些在源代碼級跨平臺的庫: Delphi/Kylix CLX dbExpress

§?????? CPAN 上的大量 perl 模塊、 java 的類庫等等;

上面列出的是一些比較通用的庫。還有用于各種語言的大量專用庫,各種提供二進制接口的組件、控件。

編譯器、虛擬機也是單機應用程序(在嵌入式環境,虛擬機可能是系統軟件的一個模塊)。不過它們的地位比較特殊。作為程序員,我們應該了解編譯器、集成開發環境、軟件框架、虛擬機、操作系統分別為我們做了什么。

作為程序員,我們同樣應該理解調試器也是一個應用程序,調試器的基本原理,它能做什么,有什么限制。如果調試器與目標程序運行在不同的 CPU 上,調試是如何實現的,有哪些不同的實現方式?例如 JTAG 調試利用了目標 CPU 的調試接口直接調試目標程序;串口調試要求將一段調試代碼和目標程序鏈接在一起下到目標 CPU 中,由嵌入的調試代碼與 PC 機的調試器通信實現調試。不同的實現手段決定了調試器的能力和限制。

目前最熱門的軟件類型就是使用數據庫的 Web 應用了,例如各種網站、網絡游戲、各種企業、行業、政府機構的管理系統,在這個領域集中了處于食物鏈不同環節的大量廠商,各種 Web 服務器、基礎平臺、應用開發框架。隨便列一下,也能列出一堆名詞:

§?????? HTML/CSS CGI

§?????? java applet java script ActiveX 控件;

§?????? php asp jsp servlet

§?????? .net 家族: asp.net ado.net 等;

§?????? J2EE with/without EJB Spring Struts Hibernate

§?????? Ruby on Rails Plone 等;

在一種軟件類型上,集中了這么多開發技術、框架、模式,也可以稱得上蔚為壯觀了。不過,這個領域里確實是各種最新的編程思想、方法、設計模式的演武廳,如同當年的編譯器,值得所有程序員研究、學習。

1.3 思想

COM 可以被看作 OLE 發展的衍生品。但它的重要性遠遠超過了 OLE 。它首被獨立出來,成為 OLE ActiveX 的基礎,然后逐步成為在 Windows 進行二進制集成的基礎。 COM RPC 的結合產生了 DCOM DCOM MTS 的結合產生了 COM+ 。雖然這些技術都是用于 Windows 平臺的,但組件技術的基本思想是獨立于具體環境的。也就是說,對程序員而言,存在著獨立于語言和環境之外的領域,這就是編程的思想。

例如看看 Qualcomm BREW ,就會發現它從 COM 中學習了多少東西。嵌入式平臺的程序員使用 PC 平臺的技術,這就是編程思想的價值。對于程序員來說,各種編程思想、設計模式,是最為寶貴的東西。這里所說的設計模式并不局限于 GOF 的《設計模式》,任何慣用的手法都可以被看作模式。

一些基本的編程思想起源于更普遍的智慧。例如:

心智的活動,除了盡力產生各種簡單的認識之外,主要表現在以下三個方面: 1) 將若干簡單認識組合成一個復合認識,由此產生出各種復雜的認識。 2) 將兩個認識放在一起對照(在這樣做時并不將它們合而為一),不管它們如何簡單或者復雜,由此得到有關它們的相互關系的認識。 3) 將有關認識與那些在實際中和它們同在的所有其他認識隔離開,這就是抽象。所有具有普遍性的認識都是這樣得到的。
--- John Locke,
有關人類理解的隨筆

程序員從這段 1690 年的文字中能看到什么。組合、對照、抽象,這些基本的思維工具同樣也是程序員最基本的工具。

2 編程規則

編程是一門技藝,如同我們必須跳到水里才能學會游泳,我們必須多看、多寫程序,才能學會編程。

任何技藝的學習都包括知識和能力兩個部分。知識是明確的,可以用時間換取。能力是說不清的,不易掌握的。一般而言,能力高的人能夠更快地積累知識,善于從已有的實踐中總結規律,善于復用已有的模式,他們能更快地對復雜的環境形成清晰的認識,用最簡潔、優雅的方式解決問題。如何提高編程能力應該是因人而異,每個人應該找到自己的學習路徑,有自己的規劃。

編程的表象千變萬化,但在表象背后,還是有一定規律的。在某些條件下,這樣做會比那樣做更好一些。我們可以將這些東西稱作經驗、原則、規則,或者其它任何名詞。

下面松散地列舉了一些規則。我們應該在實踐中檢驗已知的規則,總結自己的規則。

規則一 這世界上唯一的真理就是不要盲目相信真理

從某種意義看,原則、規矩這類東西就是用來打破的。所謂原則,就是對歷史上某種經驗的總結。如果我們踏入的河流和前人非常接近,我們可以參考前人的經驗。我們是主動地拿來,而不是被動的遵守。

規則二 未蘊而變,自欺也;知律而變,智者之道也

這句話談的是學詞,必須先了解格律,然后才談得上變化,否則就是自欺欺人了。在編程上,也是一樣。在有資格打破一條原則前,首先要了解這條原則。先了解事物的規律,然后才是變化和靈活的應用。不要打倒自己不了解的東西。

規則三 尋找結構和成本的平衡點。當結構不能容納變化時,重構代碼到新的平衡點

開閉原則要求:一個軟件實體應該對擴展開放,對修改關閉。即軟件的結構要達到:允許在不修改軟件的前提下擴展軟件功能。

但好結構是要花成本的。程序員總是在折衷,尋找結構和成本的平衡點。我們會放一些余量,讓結構能承受一定的變化。

規則四 要針對接口編程,不要針對應用編程

前面談過了。我們總希望通過工作得到一些收獲,積累一些經驗。只有將代碼分解成盡可能獨立的模塊,然后針對接口編程,才能保護我們的成果,讓我們有所積累。

規則五 最少知識原則:模塊對外界的了解應當盡可能少

前面也談過了。所謂 圣人之治 ,經常是 虛其心,實其腹;弱其志,強其骨,常使民無知無欲 。讓被管理的對象盡可能得弱,對象間的關系盡可能得簡單,可以降低管理的成本。

在面向對象編程中 組合優于繼承 ,就是因為繼承將基類的實現細節暴露給子類,兩者的耦合性太強了。另外,繼承的實現是靜態的,而組合可以更靈活地實現。

規則六 尊重習慣

在任何領域編程,應該盡量了解這個領域的習慣,盡量符合這些習慣。這樣,別人可以更容易地理解和使用我們的程序,更不容易出錯。

規則七 程序中不要出現 magic number 或其它神奇的東西

magic number 就是諸如 17 42 這類數字。請用有描述性的常數名替代它們。常數名、變量名、函數名就是最好的注釋。結構清晰的代碼甚至可以不需要其它注釋。

需要很多注釋的代碼 是代碼壞味道的一種,常常意味著需要重構代碼,使它更容易被理解。

規則八 兩頂帽子 小步前進

兩頂帽子 前面講過了。面對復雜的問題,我們不僅要從結構上分解它,還要將實現步驟盡可能地分小,在一時一地以壓倒性優勢解決問題的一小部分。 n-1 個總比 n 個好對付,我們越來越強大,敵人越來越弱小,我們要做的只是將優勢保持到最后。 保持優勢 的關鍵是正確的理解、合理的劃分。

規則九 適當地引入中間層,可以解決所有問題

這條規則是實質是 抽象 。在遇到問題時,多引入一層接口,將問題封裝起來。

抽象本身并沒有消除系統的復雜性,但它減少了在某個時刻需要處理的細節的數量。或者說,抽象將復雜性控制在接口和模型的后面,可以推遲我們處理這些復雜性的時刻。

這條規則的另一個說法是 多做白日夢 。假設我們已經得到了需要的東西,然后會怎么樣?通過 白日夢 我們可以在更高的層次考察問題,可能找到解決問題的線索,也有可能發現這個問題毫無價值。即使毫無收獲,我們也的損失也很小。

規則十 不要依賴調試,盡可能地依賴分析和推理

我經常會在頭腦中預演調試的過程,計算我要做什么,我能得到什么。 預演 的結果經常是我沒有必要這樣調試,或者應該試一試另一個方法。

根據測不準原理,任何實際的測量、調試都會改變、影響被研究的對象。用調試輔助、驗證我們的推測,但不要依賴調試。

?

posted on 2006-06-07 11:21 思勤無邪 閱讀(287) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国产毛片完整版| 午夜精品久久久久久久白皮肤 | 久热re这里精品视频在线6| 久久久精品日韩欧美| 一区二区视频免费在线观看| 久久久久久久综合日本| 亚洲国产精品999| 亚洲裸体视频| 国产精品国产三级国产a| 亚洲宅男天堂在线观看无病毒| 久久精品国产免费| 亚洲国产成人av| 欧美精品三级在线观看| 亚洲一区图片| 麻豆精品视频在线| 一本不卡影院| 国产一区二区三区久久悠悠色av| 久久久一区二区| 一本色道久久综合亚洲精品不卡| 欧美一区二区福利在线| 亚洲福利视频二区| 欧美三级电影大全| 久久久精品国产免大香伊| 亚洲人成毛片在线播放女女| 欧美一区二区免费| 亚洲国产日韩欧美一区二区三区| 欧美日韩一区二区视频在线观看| 久久精品123| 亚洲久久一区| 欧美gay视频激情| 亚洲欧美日韩在线不卡| 亚洲精品在线看| 国外精品视频| 国产精品无人区| 欧美福利一区二区| 久久国产精品第一页| 亚洲午夜av在线| 亚洲丶国产丶欧美一区二区三区 | 久久久av毛片精品| 夜夜爽夜夜爽精品视频| 精品999在线播放| 国产精品女主播一区二区三区| 免费成人激情视频| 欧美影院精品一区| 亚洲午夜精品| 亚洲精品一区二区在线| 免费欧美视频| 老司机免费视频久久| 欧美一区二区三区久久精品| 日韩一级免费| 亚洲精品在线二区| 亚洲国产精品精华液2区45| 国产一区二区按摩在线观看| 国产精品夫妻自拍| 欧美日韩国产精品自在自线| 玖玖视频精品| 开心色5月久久精品| 久久国产精品免费一区| 欧美一区二区三区精品 | 久久精品一区二区三区中文字幕 | 女人色偷偷aa久久天堂| 久久精品最新地址| 欧美一区2区三区4区公司二百| 亚洲一区二区免费| 亚洲视频网在线直播| 日韩午夜在线观看视频| 夜色激情一区二区| 亚洲精品日韩在线| 亚洲人成在线观看| 亚洲毛片av在线| 99re这里只有精品6| 亚洲人www| 99视频精品| 一区二区三区偷拍| 亚洲一区中文| 性欧美精品高清| 久久成人在线| 久久久久免费视频| 久久久一区二区| 欧美电影免费| 91久久在线观看| 一本色道久久综合亚洲精品按摩 | 欧美大片免费| 亚洲国产日韩一级| 99在线热播精品免费| 亚洲一区免费观看| 午夜免费日韩视频| 久久嫩草精品久久久精品| 免费成人网www| 欧美精品自拍偷拍动漫精品| 国产精品久久久久永久免费观看 | 欧美国产免费| 亚洲日本aⅴ片在线观看香蕉| 亚洲精品一区二区三区婷婷月 | 免费在线成人av| 欧美日韩视频第一区| 国产精品一页| 亚洲成人资源网| 亚洲午夜精品国产| 亚欧成人精品| 女女同性女同一区二区三区91| 亚洲欧洲在线播放| 午夜精品一区二区三区电影天堂| 久久久久高清| 欧美婷婷六月丁香综合色| 国产亚洲精品aa| 亚洲精选国产| 欧美一区二区三区日韩视频| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲黄色性网站| 香蕉国产精品偷在线观看不卡| 蜜臀av在线播放一区二区三区| 欧美日本中文字幕| 伊人久久男人天堂| 亚洲午夜羞羞片| 嫩草国产精品入口| 中文精品一区二区三区| 久久另类ts人妖一区二区| 欧美日韩亚洲激情| 亚洲黄色一区| 久久成人精品无人区| 亚洲国产婷婷综合在线精品| 午夜精品一区二区在线观看 | 久久福利资源站| 欧美涩涩网站| 亚洲国产视频一区| 久久精品国产999大香线蕉| 91久久精品一区二区三区| 欧美主播一区二区三区美女 久久精品人| 免费久久99精品国产自| 国产情人节一区| 亚洲伊人第一页| 亚洲日本va午夜在线影院| 久久久久综合网| 国产亚洲精品v| 午夜久久资源| 99re视频这里只有精品| 欧美 日韩 国产在线| 韩国av一区二区三区| 午夜在线视频观看日韩17c| 亚洲精品一区二| 欧美不卡一卡二卡免费版| 精品999成人| 久久久精品日韩欧美| 亚洲欧美另类久久久精品2019| 国产精品xnxxcom| 亚洲一区日本| 日韩一级视频免费观看在线| 欧美xart系列高清| 亚洲国产精品免费| 欧美gay视频| 久久综合导航| 亚洲国产精品尤物yw在线观看| 久久天天躁狠狠躁夜夜爽蜜月| 小黄鸭视频精品导航| 国产精品一区二区三区四区| 亚洲一区在线观看视频| 一本色道久久综合亚洲精品婷婷| 欧美日韩精品一区二区天天拍小说| 亚洲精品美女| 亚洲激情图片小说视频| 欧美激情一区二区三区四区| 亚洲三级影院| 亚洲三级免费观看| 欧美三级日本三级少妇99| 亚洲自拍啪啪| 亚洲综合色婷婷| 国产亚洲一本大道中文在线| 久久精品99无色码中文字幕| 午夜欧美精品久久久久久久| 国产欧美视频一区二区三区| 久久er精品视频| 久久久www成人免费无遮挡大片| 尹人成人综合网| 亚洲国产99| 欧美区一区二| 校园春色综合网| 久久精品国产一区二区电影| 亚洲福利视频一区二区| 亚洲国产美女| 国产精品sm| 久久精品1区| 免费观看亚洲视频大全| 一本色道久久综合狠狠躁篇的优点 | 久久久精品国产免大香伊 | 在线一区观看| 国产午夜精品全部视频播放| 麻豆成人在线观看| 欧美黄色免费网站| 欧美一二三区在线观看| 久久精品一区| 在线中文字幕一区| 午夜精品国产| 亚洲黄色在线视频| 国产精品99久久久久久白浆小说| 国语自产精品视频在线看8查询8| 亚洲第一福利在线观看| 国产精品国产三级国产| 欧美插天视频在线播放| 国产精品国产三级国产aⅴ入口|