精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

關于爛代碼的那些事

移動開發
最近部門在組織bootcamp,正好我負責培訓代碼質量部分,在培訓課程中讓大家花了不少時間去討論、改進、完善自己的代碼。雖然剛畢業的同學對于代碼質量都很用心,但最終呈現出來的質量仍然沒能達到“十分優秀”的程度。 究其原因,主要是不了解好的代碼“應該”是什么樣的。

[[148851]]

1.摘要

這是爛代碼系列的第二篇,在文章中我會跟大家討論一下如何盡可能高效和客觀的評價代碼的優劣。

在發布了關于爛代碼的那些事(上)之后,發現這篇文章竟然意外的很受歡迎,很多人也描(tu)述(cao)了各自代碼中這樣或者那樣的問題。

最近部門在組織bootcamp,正好我負責培訓代碼質量部分,在培訓課程中讓大家花了不少時間去討論、改進、完善自己的代碼。雖然剛畢業的同學對于代碼質量都很用心,但最終呈現出來的質量仍然沒能達到“十分優秀”的程度。 究其原因,主要是不了解好的代碼“應該”是什么樣的。

2.什么是好代碼

寫代碼的第一步是理解什么是好代碼。在準備bootcamp的課程的時候,我就為這個問題犯了難,我嘗試著用一些精確的定義區分出“優等品”、“良品”、“不良品”;但是在總結的過程中,關于“什么是好代碼”的描述卻大多沒有可操作性

2.1.好代碼的定義

隨便從網上搜索了一下“優雅的代碼”,找到了下面這樣的定義:

Bjarne Stroustrup,C++之父:

邏輯應該是清晰的,bug難以隱藏;

依賴最少,易于維護;

錯誤處理完全根據一個明確的策略;

性能接近最佳化,避免代碼混亂和無原則的優化;

整潔的代碼只做一件事。

Grady Booch,《面向對象分析與設計》作者:

整潔的代碼是簡單、直接的;

整潔的代碼,讀起來像是一篇寫得很好的散文;

整潔的代碼永遠不會掩蓋設計者的意圖,而是具有少量的抽象和清晰的控制行。

Michael Feathers,《修改代碼的藝術》作者:

整潔的代碼看起來總是像很在乎代碼質量的人寫的;

沒有明顯的需要改善的地方;

代碼的作者似乎考慮到了所有的事情。

看起來似乎說的都很有道理,可是實際評判的時候卻難以參考,尤其是對于新人來說,如何理解“簡單的、直接的代碼”或者“沒有明顯的需要改善的地方”?

而實踐過程中,很多同學也確實面對這種問題:對自己的代碼總是處在一種心里不踏實的狀態,或者是自己覺得很好了,但是卻被其他人認為很爛,甚至有幾次我和新同學因為代碼質量的標準一連討論好幾天,卻誰也說服不了誰:我們都堅持自己對于好代碼的標準才是正確的。

在經歷了無數次code review之后,我覺得這張圖似乎總結的更好一些:

 

代碼質量的評價標準某種意義上有點類似于文學作品,比如對小說的質量的評價主要來自于它的讀者,由個體主觀評價形成一個相對客觀的評價。并不是依靠字數,或者作者使用了哪些修辭手法之類的看似完全客觀但實際沒有什么意義的評價手段。

但代碼和小說還有些不一樣,它實際存在兩個讀者:計算機和程序員。就像上篇文章里說的,即使所有程序員都看不懂這段代碼,它也是可以被計算機理解并運行的。

所以對于代碼質量的定義我需要于從兩個維度分析:主觀的,被人類理解的部分;還有客觀的,在計算機里運行的狀況。

既然存在主觀部分,那么就會存在個體差異,對于同一段代碼評價會因為看代碼的人的水平不同而得出不一樣的結論,這也是大多數新人面對的問題:他們沒有一個可以執行的評價標準,所以寫出來的代碼質量也很難提高。

有些介紹代碼質量的文章講述的都是傾向或者原則,雖然說的很對,但是實際指導作用不大。所以在這篇文章里我希望盡可能把評價代碼的標準用(我自認為)與實際水平無關的評價方式表示出來。

2.2.可讀的代碼

在權衡很久之后,我決定把可讀性的優先級排在前面:一個程序員更希望接手一個有bug但是看的懂的工程,還是一個沒bug但是看不懂的工程?如果是后者,可以直接關掉這個網頁,去做些對你來說更有意義的事情。

2.2.1.逐字翻譯

在很多跟代碼質量有關的書里都強調了一個觀點:程序首先是給人看的,其次才是能被機器執行,我也比較認同這個觀點。在評價一段代碼能不能讓人看懂的時候,我習慣讓作者把這段代碼逐字翻譯成中文,試著組成句子,之后把中文句子讀給另一個人沒有看過這段代碼的人聽,如果另一個人能聽懂,那么這段代碼的可讀性基本就合格了。

用這種判斷方式的原因很簡單:其他人在理解一段代碼的時候就是這么做的。閱讀代碼的人會一個詞一個詞的閱讀,推斷這句話的意思,如果僅靠句子無法理解,那么就需要聯系上下文理解這句代碼,如果簡單的聯系上下文也理解不了,可能還要掌握更多其它部分的細節來幫助推斷。大部分情況下,理解一句代碼在做什么需要聯系的上下文越多,意味著代碼的質量越差。

逐字翻譯的好處是能讓作者能輕易的發現那些只有自己知道的、沒有體現在代碼里的假設和可讀性陷阱。無法從字面意義上翻譯出原本意思的代碼大多都是爛代碼,比如“ms代表messageService“,或者“ms.proc()是發消息“,或者“tmp代表當前的文件”。

2.2.2.遵循約定

約定包括代碼和文檔如何組織,注釋如何編寫,編碼風格的約定等等,這對于代碼未來的維護很重要。對于遵循何種約定沒有一個強制的標準,不過我更傾向于遵守更多人的約定。

與開源項目保持風格一致一般來說比較靠譜,其次也可以遵守公司內部的編碼風格。但是如果公司內部的編碼風格和當前開源項目的風格沖突比較嚴重,往往代表著這個公司的技術傾向于封閉,或者已經有些跟不上節奏了。

但是無論如何,遵守一個約定總比自己創造出一些規則要好很多,這降低了理解、溝通和維護的成本。如果一個項目自己創造出了一些奇怪的規則,可能意味著作者看過的代碼不夠多。

一個工程是否遵循了約定往往需要代碼閱讀者有一定經驗,或者需要借助checkstyle這樣的靜態檢查工具。如果感覺無處下手,那么大部分情況下跟著google做應該不會有什么大問題:可以參考google code style,其中一部分有對應的中文版。

另外,沒有必要糾結于遵循了約定到底有什么收益,就好像走路是靠左好還是靠右好一樣,即使得出了結論也沒有什么意義,大部分約定只要遵守就可以了。

2.2.3.文檔和注釋

文檔和注釋是程序很重要的部分,他們是理解一個工程或項目的途徑之一。兩者在某些場景下定位會有些重合或者交叉(比如javadoc實際可以算是文檔)。

對于文檔的標準很簡單,能找到、能讀懂就可以了,一般來說我比較關心這幾類文檔:

對于項目的介紹,包括項目功能、作者、目錄結構等,讀者應該能3分鐘內大致理解這個工程是做什么的。

針對新人的QuickStart,讀者按照文檔說明應該能在1小時內完成代碼構建和簡單使用。

針對使用者的詳細說明文檔,比如接口定義、參數含義、設計等,讀者能通過文檔了解這些功能(或接口)的使用方法。

有一部分注釋實際是文檔,比如之前提到的javadoc。這樣能把源碼和注釋放在一起,對于讀者更清晰,也能簡化不少文檔的維護的工作。

還有一類注釋并不作為文檔的一部分,比如函數內部的注釋,這類注釋的職責是說明一些代碼本身無法表達的作者在編碼時的思考,比如“為什么這里沒有做XXX”,或者“這里要注意XXX問題”。

一般來說我首先會關心注釋的數量:函數內部注釋的數量應該不會有很多,也不會完全沒有,個人的經驗值是滾動幾屏幕看到一兩處左右比較正常。過多的話可能意味著代碼本身的可讀性有問題,而如果一點都沒有可能意味著有些隱藏的邏輯沒有說明,需要考慮適當的增加一點注釋了。

其次也需要考慮注釋的質量:在代碼可讀性合格的基礎上,注釋應該提供比代碼更多的信息。文檔和注釋并不是越多越好,它們可能會導致維護成本增加。關于這部分的討論可以參考簡潔部分的內容。

2.2.4.推薦閱讀

《代碼整潔之道》

2.3.可發布的代碼

新人的代碼有一個比較典型的特征,由于缺少維護項目的經驗,寫的代碼總會有很多考慮不到的地方。比如說測試的時候似乎沒什么異常,項目發布之后才發現有很多意料之外的狀況;而出了問題之后不知道從哪下手排查,或者僅能讓系統處于一個并不穩定的狀態,依靠一些巧合勉強運行。

2.3.1.處理異常

新手程序員普遍沒有處理異常的意識,但代碼的實際運行環境中充滿了異常:服務器會死機,網絡會超時,用戶會胡亂操作,不懷好意的人會惡意攻擊你的系統。

我對一段代碼異常處理能力的第一印象來自于單元測試的覆蓋率。大部分異常難以在開發或者測試環境里復現,即使有專業的測試團隊也很難在集成測試環境中模擬所有的異常情況。

而單元測試可以比較簡單的模擬各種異常情況,如果一個模塊的單元測試覆蓋率連50%都不到,很難想象這些代碼考慮了異常情況下的處理,即使考慮了,這些異常處理的分支都沒有被驗證過,怎么指望實際運行環境中出現問題時表現良好呢?

2.3.2.處理并發

我收到的很多簡歷里都寫著:精通并發編程/熟悉多線程機制,諸如此類,跟他們聊的時候也說的頭頭是道,什么鎖啊互斥啊線程池啊同步啊信號量啊一堆一堆的名詞滔滔不絕。而給應聘者一個實際場景,讓應聘者寫一段很簡單的并發編程的小程序,能寫好的卻不多。

實際上并發編程也確實很難,如果說寫好同步代碼的難度為5,那么并發編程的難度可以達到100。這并不是危言聳聽,很多看似穩定的程序,在面對并發場景的時候仍然可能出現問題:比如最近我們就碰到了一個linux kernel在調用某個系統函數時由于同步問題而出現crash的情況。

而是否高質量的實現并發編程的關鍵并不是是否應用了某種同步策略,而是看代碼中是否保護了共享資源:

局部變量之外的內存訪問都有并發風險(比如訪問對象的屬性,訪問靜態變量等)

訪問共享資源也會有并發風險(比如緩存、數據庫等)。

被調用方如果不是聲明為線程安全的,那么很有可能存在并發問題(比如java的hashmap)。

所有依賴時序的操作,即使每一步操作都是線程安全的,還是存在并發問題(比如先刪除一條記錄,然后把記錄數減一)。

前三種情況能夠比較簡單的通過代碼本身分辨出來,只要簡單培養一下自己對于共享資源調用的敏感度就可以了。

但是對于最后一種情況,往往很難簡單的通過看代碼的方式看出來,甚至出現并發問題的兩處調用并不是在同一個程序里(比如兩個系統同時讀寫一個數據庫,或者并發的調用了一個程序的不同模塊等)。但是,只要是代碼里出現了不加鎖的,訪問共享資源的“先做A,再做B”之類的邏輯,可能就需要提高警惕了。

2.3.3.優化性能

性能是評價程序員能力的一個重要指標,很多程序員也對程序的性能津津樂道。但程序的性能很難直接通過代碼看出來,往往要借助于一些性能測試工具,或者在實際環境中執行才能有結果。

如果僅從代碼的角度考慮,有兩個評價執行效率的辦法:

算法的時間復雜度,時間復雜度高的程序運行效率必然會低。

單步操作耗時,單步耗時高的操作盡量少做,比如訪問數據庫,訪問io等。

而實際工作中,也會見到一些程序員過于熱衷優化效率,相對的會帶來程序易讀性的降低、復雜度提高、或者增加工期等等。對于這類情況,簡單的辦法是讓作者說出這段程序的瓶頸在哪里,為什么會有這個瓶頸,以及優化帶來的收益。

當然,無論是優化不足還是優化過度,判斷性能指標最好的辦法是用數據說話,而不是單純看代碼,性能測試這部分內容有些超出這篇文章的范圍,就不詳細展開了。

2.3.4.日志

日志代表了程序在出現問題時排查的難易程度,經(jing)驗(chang)豐(cai)富(keng)的程序員大概都會遇到過這個場景:排查問題時就少一句日志,查不到某個變量的值不知道是什么,導致死活分析不出來問題到底出在哪。

對于日志的評價標準有三個:

日志是否足夠,所有異常、外部調用都需要有日志,而一條調用鏈路上的入口、出口和路徑關鍵點上也需要有日志。

日志的表達是否清晰,包括是否能讀懂,風格是否統一等。這個的評價標準跟代碼的可讀性一樣,不重復了。

日志是否包含了足夠的信息,這里包括了調用的上下文、外部的返回值,用于查詢的關鍵字等,便于分析信息。

對于線上系統來說,一般可以通過調整日志級別來控制日志的數量,所以打印日志的代碼只要不對閱讀造成障礙,基本上都是可以接受的。

2.3.5.擴展閱讀

《Release It!: Design and Deploy Production-Ready Software》(不要看中文版,翻譯的實在是太爛了)

Numbers Everyone Should Know

2.4.可維護的代碼

相對于前兩類代碼來說,可維護的代碼評價標準更模糊一些,因為它要對應的是未來的情況,一般新人很難想象現在的一些做法會對未來造成什么影響。不過根據我的經驗,一般來說,只要反復的提問兩個問題就可以了:

他離職了怎么辦?

他沒這么做怎么辦?

2.4.1.避免重復

幾乎所有程序員都知道要避免拷代碼,但是拷代碼這個現象還是不可避免的成為了程序可維護性的殺手。

代碼重復分為兩種:模塊內重復和模塊間重復。無論何種重復,都在一定程度上說明了程序員的水平有問題,模塊內重復的問題更大一些,如果在同一個文件里都能出現大片重復的代碼,那表示他什么不可思議的代碼都有可能寫出來。

對于重復的判斷并不需要反復閱讀代碼,一般來說現代的IDE都提供了檢查重復代碼的工具,只需點幾下鼠標就可以了。

除了代碼重復之外,很多熱衷于維護代碼質量的程序員新人很容易出現另一類重復:信息重復。

我見過一些新人喜歡在每行代碼前面寫一句注釋,比如:

  1. // 成員列表的長度>0并且 0 && memberList.size() < 200) { 
  2. // 返回當前成員列表 
  3. return memberList; 

看起來似乎很好懂,但是幾年之后,這段代碼就變成了:

  1. // 成員列表的長度>0并且 0 && memberList.size() < 200 || (tmp.isOpen() && flag)) { 
  2. // 返回當前成員列表 
  3. return memberList; 

再之后可能會改成這樣:

  1. // edit by axb 2015.07.30 
  2. // 成員列表的長度>0并且 0 && memberList.size() < 200 || (tmp.isOpen() && flag)) { 
  3. // 返回當前成員列表 
  4. // return memberList; 
  5. //} 
  6. if(tmp.isOpen() && flag) { 
  7. return memberList; 

隨著項目的演進,無用的信息會越積越多,最終甚至讓人無法分辨哪些信息是有效的,哪些是無效的。

如果在項目中發現好幾個東西都在做同一件事情,比如通過注釋描述代碼在做什么,或者依靠注釋替代版本管理的功能,那么這些代碼也不能稱為好代碼。

2.4.2.模塊劃分

模塊內高內聚與模塊間低耦合是大部分設計遵循的標準,通過合理的模塊劃分能夠把復雜的功能拆分為更易于維護的更小的功能點。

一般來說可以從代碼長度上初步評價一個模塊劃分的是否合理,一個類的長度大于2000行,或者一個函數的長度大于兩屏幕都是比較危險的信號。

另一個能夠體現模塊劃分水平的地方是依賴。如果一個模塊依賴特別多,甚至出現了循環依賴,那么也可以反映出作者對模塊的規劃比較差,今后在維護這個工程的時候很有可能出現牽一發而動全身的情況。

一般來說有不少工具能提供依賴分析,比如IDEA中提供的Dependencies Analysis功能,學會這些工具的使用對于評價代碼質量會有很大的幫助。

值得一提的是,絕大部分情況下,不恰當的模塊劃分也會伴隨著極低的單元測試覆蓋率:復雜模塊的單元測試非常難寫的,甚至是不可能完成的任務。所以直接查看單元測試覆蓋率也是一個比較靠譜的評價方式。

2.4.3.簡潔與抽象

只要提到代碼質量,必然會提到簡潔、優雅之類的形容詞。簡潔這個詞實際涵蓋了很多東西,代碼避免重復是簡潔、設計足夠抽象是簡潔,一切對于提高可維護性的嘗試實際都是在試圖做減法。

編程經驗不足的程序員往往不能意識到簡潔的重要性,樂于搗鼓一些復雜的玩意并樂此不疲。但復雜是代碼可維護性的天敵,也是程序員能力的一道門檻。

跨過門檻的程序員應該有能力控制逐漸增長的復雜度,總結和抽象出事物的本質,并體現到自己設計和編碼中。一個程序的生命周期也是在由簡入繁到化繁為簡中不斷迭代的過程。

對于這部分我難以總結出簡單易行的評價標準,它更像是一種思維方式,除了要理解、還需要練習。多看、多想、多交流,很多時候可以簡化的東西會大大超出原先的預計。

2.2.4.推薦閱讀

《重構-改善既有代碼的設計》

《設計模式-可復用面向對象軟件的基礎》

《Software Architecture Patterns-Understanding Common Architecture Patterns and When to Use Them》

3.結語

這篇文章主要介紹了一些評價代碼質量優劣的手段,這些手段中,有些比較客觀,有些主觀性更強。之前也說過,對代碼質量的評價是一件主觀的事情,這篇文章里雖然列舉了很多評價手段。但是實際上,很多我認為沒有問題的代碼也會被其他人吐槽,所以這篇文章只能算是初稿,更多內容還需要今后繼續補充和完善。

雖然每個人對于代碼質量評價的傾向都不一樣,但是總體來說評價代碼質量的能力可以被比作程序員的“品味”,評價的準確度會隨著自身經驗的增加而增長。在這個過程中,需要隨時保持思考、學習和批判的精神。

責任編輯:chenqingxiang 來源: Axb的自我修養
相關推薦

2015-08-13 10:54:46

2017-04-10 18:10:31

2015-07-23 09:30:43

爛代碼程序員

2012-05-01 08:06:49

手機

2012-07-13 00:03:08

WEB前端開發WEB開發

2019-12-10 08:00:46

Kata容器Linux

2021-03-18 16:05:20

SSD存儲故障

2009-02-19 10:21:00

路由多WAN口

2012-01-02 19:30:22

iPad

2011-08-22 16:42:43

SqliteiPad

2011-08-01 17:31:25

Xcode開發 Cocoa

2011-07-04 13:51:02

QT 對象 模型

2011-06-30 10:59:43

2022-09-09 08:08:28

開源項目服務

2011-07-19 15:33:57

iPhone

2012-04-05 10:49:40

服務器SSL證書

2021-05-17 08:18:35

Java內存模型JMM

2015-08-19 09:10:37

程序員面試

2011-12-02 10:32:23

Java

2024-03-18 00:00:05

Java服務JVM
點贊
收藏

51CTO技術棧公眾號

91精品黄色片免费大全| 国产精品你懂的在线| 九九热这里只有在线精品视| 动漫美女无遮挡免费| 色黄视频在线观看| 18欧美乱大交hd1984| 国产一区不卡在线观看| 久草热在线观看| 激情久久久久| 中文字幕最新精品| 国产草草浮力影院| 日韩电影精品| 黑人精品xxx一区一二区| 一级黄色录像免费看| 欧美一区二区三区少妇| 国产在线精品免费av| 欧美重口另类videos人妖| 免费在线观看a级片| 神马香蕉久久| 日韩女优制服丝袜电影| www.色就是色| 男人久久天堂| 一区二区三区久久| 亚洲一区精彩视频| 男男激情在线| www.色精品| αv一区二区三区| 亚洲无码精品在线观看| 国产亚洲精品v| 欧美激情videoshd| 可以直接看的黄色网址| 成人动漫免费在线观看| 亚洲嫩模很污视频| 久久性爱视频网站| 一区二区亚洲视频| 91精品国产乱| 免费一区二区三区在线观看| 亚洲黄色网址| 欧美午夜激情在线| 国产精品无码人妻一区二区在线 | 亚洲人a成www在线影院| 强迫凌虐淫辱の牝奴在线观看| 国产日韩一区二区三免费高清| 欧美亚洲一区二区在线| 免费在线观看的毛片| 亚洲国产成人二区| 一本一本大道香蕉久在线精品 | 国产一区二区三区av电影| 国产精品美女久久久免费| 中文字幕免费观看| 视频一区中文字幕| 国产精品久久久久久五月尺| 秋霞av一区二区三区| 日韩精品五月天| 国产精品久久久久久av下载红粉 | 亚洲国产精品女人| 麻豆传媒在线观看| 亚洲欧美日韩人成在线播放| 中文字幕av导航| 激情视频在线观看| 亚洲人精品午夜| 视色,视色影院,视色影库,视色网| 秋霞午夜在线观看| 亚洲精品视频免费看| 青青在线视频免费观看| 9999热视频在线观看| 狠狠色狠狠色综合日日小说| 免费av网址在线| 精品国产欧美日韩一区二区三区| 欧美午夜精品一区二区蜜桃| 亚洲欧美日韩精品一区| 国产一区一区| 精品久久一区二区三区| 国产交换配乱淫视频免费| 成人高清电影网站| 欧美大片欧美激情性色a∨久久| 久久久久久久久久99| 在线视频免费在线观看一区二区| 日本中文字幕成人| 一级黄色大片网站| 国产91丝袜在线18| 久久综合九色99| 97人人在线| 亚洲一区二区在线视频| 亚洲国产精品久久久久爰色欲| 亚洲成a人片| 欧美一个色资源| 久久久亚洲av波多野结衣| 精品视频久久| 欧美激情喷水视频| 看黄色一级大片| 国产高清精品久久久久| 欧美精品一区二区三区四区五区| 尤物在线视频| 亚洲二区视频在线| 97超碰成人在线| 国偷自产视频一区二区久| 一区二区在线视频播放| 国产亚洲色婷婷久久99精品| 日韩影院在线观看| 国产精品乱码一区二区三区| a√资源在线| 午夜不卡av在线| 亚洲天堂av一区二区| 亚洲黄色录像| 欧美丰满少妇xxxxx| 波多野结衣大片| 91玉足脚交白嫩脚丫在线播放| 一本久道久久综合| 成人av观看| 精品少妇一区二区三区| 中文字幕观看av| 久久久久一区| 久99久在线| 性爱视频在线播放| 欧美二区乱c少妇| 久久成人激情视频| 亚洲黄色影片| 97se国产在线视频| 男人的天堂在线视频免费观看 | 免费av网址在线| 成人三级av在线| 久久av红桃一区二区小说| 波多野结衣在线观看视频| 99热在这里有精品免费| 久久香蕉视频网站| 精品国产一级| 久久精品一本久久99精品| 免费在线不卡av| 26uuu成人网一区二区三区| www.在线观看av| 日韩视频一二区| 欧美成人剧情片在线观看| 中文字幕乱码视频| 亚洲国产精品高清| 日本www.色| 国产精品羞羞答答在线观看| 欧美做受高潮电影o| 亚洲人视频在线观看| 亚洲mv大片欧洲mv大片精品| 国产精品果冻传媒| 亚洲电影在线| 国产一区自拍视频| 久久久男人天堂| 精品亚洲永久免费精品| 中文字幕视频网站| 26uuu另类欧美| 国产成人久久777777| 精品日韩一区| 91久久久久久国产精品| 亚洲性图自拍| 精品国产乱码久久久久久夜甘婷婷| 久久久精品一区二区涩爱| 国产凹凸在线观看一区二区| 欧美亚洲黄色片| 国产图片一区| 国产成人高清激情视频在线观看 | 视色视频在线观看| 天堂网在线观看国产精品| 91精品视频网站| 欧美四级在线| 精品亚洲一区二区三区| 中文字幕永久在线| 国产精品久久二区二区| 亚洲一级片免费观看| 欧美日韩综合| 国产女主播一区二区三区| av综合电影网站| 少妇av一区二区三区| 国产av无码专区亚洲av| 欧美日韩免费看| 精品日韩在线视频| 国产乱码精品一区二区三| 欧美黑人经典片免费观看| 国产亚洲一区| 2022国产精品| 午夜不卡影院| 日韩在线免费视频| 可以免费观看的毛片| 色一情一乱一乱一91av| 91杏吧porn蝌蚪| 91在线精品一区二区三区| 亚洲成人福利在线观看| 欧美成人久久| 日韩精品成人一区二区在线观看| 国产精品日韩精品在线播放| 91国产美女在线观看| av电影在线网| 亚洲成人黄色在线| 中文字幕 国产| 夜夜精品浪潮av一区二区三区| 亚洲人人夜夜澡人人爽| 国产一区三区三区| av网址在线观看免费| 综合在线视频| 秋霞毛片久久久久久久久| 日韩高清一区| 国产精品稀缺呦系列在线 | 国产精品久久久久久久久粉嫩av | 蜜桃视频在线免费| 欧美一级爆毛片| 精品国产www| 精品国产福利在线| 精品无码久久久久成人漫画 | 永久免费看片直接| 久久蜜桃av一区二区天堂| 三级黄色片免费看| 美女性感视频久久| 成年人免费大片| 亚洲欧洲日本mm| 91成人在线视频观看| 欧美日韩一区二区综合 | 久久社区一区| 免费在线成人av电影| 日本一区二区三区播放| 国产精品私拍pans大尺度在线| 欧产日产国产精品视频| 欧美日本精品在线| 国产区在线看| 中文字幕一精品亚洲无线一区 | 国产女人18毛片18精品| 欧美系列日韩一区| 免费的毛片视频| 精品日韩美女的视频高清| 久久久久噜噜噜亚洲熟女综合| 国产精品福利一区二区| 成人在线手机视频| 久久久久99精品一区| 在线观看国产网站| 成人不卡免费av| av漫画在线观看| 国产成人精品一区二区三区四区| 男人午夜视频在线观看| 久久成人免费日本黄色| 8x8x最新地址| 免费在线看成人av| 牛夜精品久久久久久久| 热久久一区二区| 国产一级特黄a大片免费| 日日欢夜夜爽一区| 国产一级不卡毛片| 肉丝袜脚交视频一区二区| 麻豆传传媒久久久爱| 丝袜美腿亚洲综合| 国产一区视频免费观看| 视频一区国产视频| 中文字幕 91| 免费xxxx性欧美18vr| 亚欧美在线观看| 久草在线在线精品观看| 最新av免费在线观看| 激情五月婷婷综合| 潘金莲一级淫片aaaaa| 国产不卡视频一区二区三区| 精品1卡二卡三卡四卡老狼| 成人av网址在线| 极品粉嫩小仙女高潮喷水久久 | 亚洲成人性视频| 四虎精品成人影院观看地址| 日韩精品免费看| 国产h在线观看| 日韩网站免费观看高清| 91精品久久久久久粉嫩| 国内精品久久久久影院 日本资源| av成人 com a| 国产精品xxxxx| 日韩专区视频网站| 懂色中文一区二区三区在线视频| 欧美黑人做爰爽爽爽| 色播亚洲婷婷| 欧美精品国产| 欧美男女爱爱视频| 日韩av一级电影| 亚洲欧美日韩中文字幕在线观看| 不卡视频免费播放| 超碰97av在线| 亚洲国产精品一区二区尤物区| 一级成人黄色片| 欧美美女视频在线观看| 高清毛片aaaaaaaaa片| 亚洲视频在线免费观看| 成人黄视频在线观看| 欧美一二三视频| 国产一区2区在线观看| 欧美精品一区二区三区久久| 牛夜精品久久久久久久99黑人| 精品欧美一区免费观看α√| 久久精品免费看| 星空大象在线观看免费播放| 国产亚洲精品免费| 男女免费视频网站| 欧美三级视频在线播放| 天天爽夜夜爽夜夜爽| 中文字幕在线成人| 国产va在线视频| 成人免费福利在线| 国产一区二区三区四区五区传媒| 可以在线看黄的网站| 石原莉奈在线亚洲二区| 色悠悠在线视频| 国产精品福利一区二区三区| 久久国产黄色片| 精品久久国产97色综合| 久久国产精品一区| 国产精品极品美女在线观看免费 | 97久久超碰精品国产| 51精品免费网站| 在线观看成人免费视频| 天天摸天天碰天天爽天天弄| 欧美成人小视频| 日韩国产91| 日本不卡在线观看| 国产精品毛片在线| 波多野结衣办公室双飞| 亚洲精品中文在线影院| 成人黄色免费网| 亚洲人成网站在线播| 国产高清中文字幕在线| 超碰国产精品久久国产精品99| 久久综合电影| 91精品无人成人www| 国产午夜精品一区二区三区视频| 国产网址在线观看| 精品欧美一区二区久久| a在线免费观看| 川上优av一区二区线观看| 色天天久久综合婷婷女18| 午夜视频你懂的| 国产无人区一区二区三区| 五月婷婷激情视频| 精品偷拍一区二区三区在线看| 精精国产xxxx视频在线播放| 粉嫩av四季av绯色av第一区| 黑丝一区二区| 欧美熟妇精品一区二区| 亚洲一区二区四区蜜桃| 性欧美videos另类hd| 欧美精品在线极品| 亚州一区二区| 无码人妻少妇伦在线电影| 风流少妇一区二区| 国产网站在线看| 日韩成人在线网站| 国产精品伦理| 日本一区二区三区精品视频| 肉肉av福利一精品导航| 欧美亚洲色综久久精品国产| 欧美日韩二区三区| 国产三级在线播放| 国产精品二区在线| 伊人久久亚洲热| 国产熟妇搡bbbb搡bbbb| 欧美在线视频你懂得| 麻豆视频在线观看免费| 国产有码一区二区| 欧美国产专区| 中文字幕在线播放视频| 日韩欧美中文在线| 99青草视频在线播放视| 91日本视频在线| 伊人久久久大香线蕉综合直播| 久久精品老司机| 欧美日韩一区二区三区免费看| 中文字幕中文字幕在线十八区 | 欧美高清日韩| 一起草在线视频| 欧美视频在线一区二区三区| 国产精品剧情| 精品视频一区在线| 美女网站色91| 国产一级av毛片| 亚洲欧洲一区二区三区在线观看 | a天堂资源在线| 色播亚洲婷婷| 高清av一区二区| 婷婷激情五月综合| 久久91超碰青草是什么| 欧美天堂社区| 亚洲色图偷拍视频| 午夜精品在线看| 日本a级在线| 国产午夜精品在线| 蜜臀va亚洲va欧美va天堂| 国产真实的和子乱拍在线观看| 亚洲人成在线观看| 日韩中文字幕| xxxx一级片| 亚洲福利一区二区| 免费在线观看黄| 久久久久资源| 国产麻豆精品视频| 日日夜夜操视频| 欧美福利视频网站| 久久五月天小说| 久久久久久久久免费看无码| 欧美一区二区三区公司| 黄瓜视频成人app免费| 国产片侵犯亲女视频播放| 中文字幕欧美日韩一区| 亚洲色图欧美视频|