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

代碼質(zhì)量 – 代碼的歷史是代碼未來的預(yù)言

開發(fā) 前端
如果把項目代碼比喻成城市,那么系統(tǒng)中維護成本高的復(fù)雜部分就好比潛伏在城市中的罪犯,我們對于罪犯的搜查,顯然不能對城市進行地毯式的搜索,而是應(yīng)該找到之前有過犯罪記錄的一些街區(qū),劃分重點區(qū)域進行排查,我們把這些區(qū)域,稱為 hotspot,代碼中也是,這些 hotspot 里,潛藏著具有最高優(yōu)先級的需要調(diào)整,優(yōu)化與被重構(gòu)的對象。

We can never see past the choices we don’t understand. – Oracle (The Matrix)

副標(biāo)題是:“一個使用 code-maat, git, Python, D3.js 進行代碼質(zhì)量衡量的 case study“。

[[215679]]

大概是在2017年6月份吧,我當(dāng)時在工作中作為一些小項目的負(fù)責(zé)人,收到了同事的一份報表,主要內(nèi)容是通過 jsinspect ,檢測出了有幾個項目代碼重復(fù)率比較高,提醒我是否有些項目需要優(yōu)化或部分重構(gòu)一下。我當(dāng)時第一次萌生了作為周期性項目,代碼的質(zhì)量是應(yīng)該作為一個指標(biāo)隨著迭代被量化,從而指導(dǎo)后續(xù)項目迭代的,雖然當(dāng)時我聽說過 sonar。隨后我工作中參與了一個中心化代碼質(zhì)量評估系統(tǒng)一期的設(shè)計和開發(fā)(主要是針對 javascript 代碼的規(guī)范和質(zhì)量檢測與持續(xù)集成進行耦合),但是當(dāng)時這個系統(tǒng)沒有解決這樣一個問題,即能夠告訴我代碼里具體哪部分存在更高優(yōu)先級被重構(gòu)的需要。半年過去了,現(xiàn)在我嘗試回答一下這個問題,并舉一個與編程語言無關(guān)的一個通用可行的例子,通過這個例子揭示一個事實:

“代碼的歷史,是代碼未來的預(yù)言“

如果把項目代碼比喻成城市,那么系統(tǒng)中維護成本高的復(fù)雜部分就好比潛伏在城市中的罪犯,我們對于罪犯的搜查,顯然不能對城市進行地毯式的搜索,而是應(yīng)該找到之前有過犯罪記錄的一些街區(qū),劃分重點區(qū)域進行排查,我們把這些區(qū)域,稱為 hotspot,代碼中也是,這些 hotspot 里,潛藏著具有最高優(yōu)先級的需要調(diào)整,優(yōu)化與被重構(gòu)的對象。

 

圖2:代碼質(zhì)量 - 代碼的歷史是代碼未來的預(yù)言

CodeCity 生成的“代碼城市”,每個街區(qū)是一個 package,每個 class 是一個建筑,建筑的高度是 class 中方法的數(shù)量(這個工具是 OOP 語言專用的,比如 java,我們后續(xù)不談?wù)撍?

我們的目的就是確認(rèn)一個項目中的 hotspot 存在在哪兒。首先,我們不把代碼復(fù)雜度作為確認(rèn) hotspot 的唯一維度,代碼復(fù)雜度很有用,但是單一把復(fù)雜度作為 hotspot 衡量的指標(biāo),會存在一些問題,最主要的問題就是一段復(fù)雜的代碼,只有當(dāng)我們真的需要關(guān)注并修改它的時候,它才是問題所在,如果沒有人需要閱讀或修改這段復(fù)雜的代碼,它具體的復(fù)雜度是多是少又有什么關(guān)系呢?即便有人覺得這種代碼是定時炸彈,但是一個具有一定規(guī)模的系統(tǒng)中存在復(fù)雜模塊是很正常的事情,一次性把這些復(fù)雜模塊都作為 hotspot 標(biāo)注出來并不合理,我們對 hotspot 進行調(diào)整和優(yōu)化也存在風(fēng)險,以合適的策略去優(yōu)化真正需要優(yōu)化的部分是很重要的。

選擇維度

我們使用代碼更改的頻率,作為耗費開發(fā)人員和時間的第一個維度。以 React 為例,我們看下它在 15.0.0(2016 年 4 月 9 日 release)和 16.0.0(2017 年 9 月 27 日 release)之間,都做了哪些修改。為了保證時間的一致性,我們先把項目時間切到 2017 年 9 月 27 日:

  1. git checkout `git rev-list -n 1 --before="2017-09-27" master` 

接下來我們看一下從 2016 年 4 月 9 日到 2017 年 9 月 27 日之間結(jié)構(gòu)化的 git 日志:

  1. git log --pretty=format:'[%h] %an %ad %s' --date=short --numstat --before=2017-09-27 --after=2016-04-09 > react_evo.log 

 

圖3:代碼質(zhì)量 - 代碼的歷史是代碼未來的預(yù)言
git 提交日志

在我們自己重定向的 git 的日志文件 react_evo.log 中,我們使用 code-maat 去獲取代碼變動頻率的數(shù)據(jù),code-maat 使用 Clojure 編寫,用于挖掘和分析版本控制軟件中的項目代碼變動數(shù)據(jù),我們把他 clone 下來,通過 leiningen 去編譯它的 jar 包執(zhí)行,或者你也可以把它放在系統(tǒng)路徑中做成一個系統(tǒng)命令,我自己也制作了一個 code-maat 的 Docker 鏡像,地址是 code-maat。

我們來試著使用一下 code-maat,先看一下 React 在兩個版本之間的一些匯總數(shù)據(jù)

  1. java -jar code-maat/target/code-maat-1.1-SNAPSHOT-standalone.jar -l react_evo.log -c git -a summary 

 

圖4:代碼質(zhì)量 - 代碼的歷史是代碼未來的預(yù)言

匯總情況

可以看到兩個版本之間提交次數(shù),涉及文件的情況和開發(fā)者人數(shù)的信息。我們再來看一下代碼變動的頻率,并生成一個 csv 文件:

  1. java -jar ../../code-maat/target/code-maat-1.1-SNAPSHOT-standalone.jar -l react_evo.log -c git -a revisions > react_freqs.csv 

 

圖5:代碼質(zhì)量 - 代碼的歷史是代碼未來的預(yù)言
文件的修改次數(shù)排序

有了這些數(shù)據(jù),就縮小了候選 hotspot 的范圍,我們接下來,再增加另外一個判斷模塊規(guī)模的維度,即代碼行數(shù),代碼行數(shù)這個維度簡單粗暴,并且有兩個好處,其一是能夠查找方便快速;另外就是對于不同編程語言,它是中立的指標(biāo)。我們使用 cloc 作為通過代碼行數(shù)對項目進行分析的工具,它使用 Perl 編寫(誰說 Perl 死了?),并且能夠得到針對編程語言,文件,空格,注釋和代碼本身的很直觀的輸出,我們在 React 項目中來嘗試一下:

  1. cloc ./ --by-file --csv --quiet --report-file=react_lines.csv 

在反應(yīng)代碼行數(shù)的 react_lines.csv 中,我們能看到一個新的維度:

 

圖6:代碼質(zhì)量 - 代碼的歷史是代碼未來的預(yù)言
代碼行數(shù)排序

維度的合并以及可視化

單一維度對于我們來說,不足以說明某個可能存在 hotspot,接下來我們做一下維度的合并,我們把代碼更改的頻率和代碼行數(shù)合并,形成代碼修改次數(shù) + 代碼行數(shù)的一個新的綜合維度,在這個維度中,代碼修改次數(shù)要比代碼行數(shù)擁有更多的權(quán)重。這個工作我們通過 Python 編寫腳本完成,Python 腳本的代碼位于 hotspots-helper。我們來看一下新的維度產(chǎn)生的數(shù)據(jù):

python merge_comp_freqs.py ../complexity/data/react_freqs.csv ../complexity/data/react_lines.csv > react_hotspot_candidates.csv

 

圖7:代碼質(zhì)量 - 代碼的歷史是代碼未來的預(yù)言
代碼修改次數(shù) + 代碼行數(shù)排序

這個維度非常清晰的表達了 React 從 15.0.0 到 16.0.0 的主要代碼改變,來源于 React fiber,fiber 帶來了大量的代碼和多次的修正,其中排名前三的有兩個都是渲染過程中 fiber 用來調(diào)度任務(wù)的部分。排名前幾位的代碼行數(shù)累計近萬,這么多代碼逐個去閱讀源碼還是很消耗精力的,不過通過這些數(shù)據(jù),我們可以使用 D3.js 做一些可視化,通過 circle packing 算法,得到一個 enclosure diagram,圖中每個圓的直徑越大,代表這個模塊/文件代碼行數(shù)越多,顏色越深代表這個模塊/文件修改的次數(shù)越多,改動越頻繁:

 

圖8:代碼質(zhì)量 - 代碼的歷史是代碼未來的預(yù)言
React 代碼從 15.0.0 到 16.0.0 的可視化

 

圖9:代碼質(zhì)量 - 代碼的歷史是代碼未來的預(yù)言
hotspots 候選文件

具體可視化頁面參考 Complexity Study,我也做了一個 Docker 鏡像,地址是 youngleehua/complexity-study。

文件命名和再引入的復(fù)雜度分析

現(xiàn)在我們嘗試在這些潛在的 hotspots 中找出真正的問題,我們再增加一個維度,即文件命名。文件,類,函數(shù)的命名,能夠非常好的體現(xiàn)出開發(fā)者的設(shè)計意圖,通常情況下,我們閱讀代碼都是通過文件,類和函數(shù)的命名領(lǐng)會之前開發(fā)者的設(shè)計和思想的。命名不但能夠區(qū)分出哪些是配置文件,哪些是代碼本身,而且也能區(qū)分出文件所負(fù)責(zé)的職責(zé),好的文件命名,能夠確認(rèn)模塊的代碼職責(zé),讓代碼內(nèi)聚,盡可能的減少后續(xù)其他職責(zé)代碼的加入,避免邏輯變得過于復(fù)雜,增加修改次數(shù)和bug。例如相比 ReactFiberBeginWork.js,ReactDOMComponent.js 就是一個更好的命名,如果不去看 ReactFiberCommitWork.js 以及 ReactFiberCompleteWork.js 得出 Fiber 自己有個調(diào)度周期的結(jié)論,ReactFiberBeginWork.js 顯得不那么友好和清晰(誰都知道一個模塊需要一個初始的代碼),而通過文件命名,我們也能明顯的排除一些文件比如 package.json 這種項目的配置文件(不過配置文件產(chǎn)生問題的情況并不是沒有,參考大型C語言項目的Makefile)。

接下來,我們針對命名上并不友好以及在綜合維度上排名靠前的文件做一次代碼復(fù)雜度分析,并根據(jù)復(fù)雜度分析,確定代碼復(fù)雜度在歷史提交中的變化,以及為后續(xù)代碼的修改提供指導(dǎo)和意見。復(fù)雜度分析的手段目前看來也比較多,比如圈復(fù)雜度,也存在針對語言的復(fù)雜度分析工具,例如針對 Javascript 的 es-analysis/plato,但是為了做到語言的中立,形成一個通用的方案,我通過代碼的縮進來標(biāo)志代碼文件的復(fù)雜度情況。

對于大多數(shù)語言來說(尤其對于C-like的語言),代碼縮進代表的是更深層次的邏輯,邏輯層次越深,需要控制的邏輯也就越復(fù)雜,可能產(chǎn)生的問題也就越多。下面兩個文件,你更希望自己維護哪一個?我更希望自己負(fù)責(zé)維護的是左邊的代碼:)

 

圖10:代碼質(zhì)量 - 代碼的歷史是代碼未來的預(yù)言
代碼的形狀

我們還是使用 Python,對代碼的縮進進行分析,我們把一個 tab 和 2 個空格(為了符合 React 代碼的風(fēng)格)作為一個邏輯上的縮進,忽略掉空行,每個縮緊作為一個復(fù)雜度的得分(1 分),看一看整個文件的總復(fù)雜度,平均復(fù)雜度,復(fù)雜度的方差以及最大復(fù)雜度。

  1. python complexity_analysis.py ./react/src/renderers/shared/fiber/ReactFiberBeginWork.js 

 

圖11:代碼質(zhì)量 - 代碼的歷史是代碼未來的預(yù)言

不算空行共 766 行,復(fù)雜度總分 1981,平均分 2.59,方差 1.29,最大得分 8 分

n 代表不計算空行一共的行數(shù),共 766 行;total 代表文件復(fù)雜度的總分 1981 分,分值很高(如果橫向比對其他文件更明顯);mean 代表平均分表現(xiàn)還好為 2.59 分;sd代表方差得分越低表示有越多的行的復(fù)雜度得分接近平均分,得分 1.29 比較不錯,但是最大的行復(fù)雜度達到了 8 分,算是比較大的數(shù)值了。后續(xù)這個文件的職責(zé)能否被進一步單一化,把更多的邏輯剝離出來呢?這個就需要 React 的開發(fā)者們進行衡量了。

 

圖12:代碼質(zhì)量 - 代碼的歷史是代碼未來的預(yù)言

綜合維度排名第一的 ReactFiberScheduler.js 的得分

我們也可以通過版本控制(從最初的 react_evo.log 得到首尾的版本),得到一個代碼復(fù)雜度的變化信息:

  1. python ../hotspots-helper/git_complexity_trend.py --start 95fed0163 --end 9ce135f86 --file ./src/renderers/shared/fiber/ReactFiberBeginWork.js > complexity_trend.csv 

通過 excel 我們看下 復(fù)雜度的變化趨勢:

 

圖13:代碼質(zhì)量 - 代碼的歷史是代碼未來的預(yù)言

ReactFiberBeginWork.js 復(fù)雜度在 15.0.0 版本到 16.0.0 版本之間的變化趨勢

有了這些數(shù)據(jù)以及可視化的體驗,我們不但能夠在不熟悉一個項目的情況下了解代碼的結(jié)構(gòu),找到可能的 hotspot,也能夠通過版本控制系統(tǒng),得到具體文件質(zhì)量的趨勢變化,從而能夠指導(dǎo) code review,也能夠為后續(xù)代碼的重構(gòu)指明方向。

結(jié)語

對于軟件質(zhì)量,僅僅分析代碼中的 hotspot 還是不夠的,除了代碼層面隱藏的缺陷,我們這里還沒有分析更宏觀的架構(gòu)上的演進,以及開發(fā)者與代碼之間社會學(xué)層面上的關(guān)系。在這篇之后,我做個預(yù)告,下一篇關(guān)于代碼和工程質(zhì)量分析的文章我將嘗試從更宏觀的角度,闡述如何量化代碼架構(gòu),通過分析指導(dǎo)一個工程在架構(gòu)上的迭代和重構(gòu),祝大家 Happy coding in 2018。

責(zé)任編輯:未麗燕 來源: 程序師
相關(guān)推薦

2022-05-24 12:42:24

物聯(lián)網(wǎng)

2022-06-13 23:30:27

代碼詞匯高質(zhì)量

2020-05-21 09:14:36

無代碼代碼開發(fā)

2022-06-27 09:00:00

Kubernetes云計算容器

2015-08-03 10:40:59

程序員代碼質(zhì)量Quora

2014-09-09 09:37:04

開發(fā)速度代碼質(zhì)量

2022-09-22 15:16:12

低代碼開發(fā)工具

2017-07-14 09:54:47

代碼函數(shù)程序

2022-08-01 07:38:29

代碼開發(fā)

2023-01-06 18:31:46

準(zhǔn)確命名

2022-08-04 09:01:45

TypeScriptMicrosoft

2020-07-01 07:00:00

軟件開發(fā)低代碼無代碼

2024-08-06 12:35:42

C#代碼重構(gòu)

2023-10-08 13:13:00

無代碼編程

2022-03-25 09:22:42

代碼開發(fā)

2012-11-07 09:48:26

2021-05-18 09:00:00

軟件代碼工具

2015-05-06 09:20:34

代碼質(zhì)量代碼審查實踐

2021-08-12 07:49:25

IDEA代碼軟件

2023-04-20 08:01:13

點贊
收藏

51CTO技術(shù)棧公眾號

久久久久久久久久久91| 色婷婷av久久久久久久| 国产成人免费观看| 国产成人在线视频观看| 国产探花一区二区| 欧美日韩一级片网站| 国产一二三四五| 亚洲av片一区二区三区| 男男视频亚洲欧美| 欧美激情在线观看视频| 免费一级黄色录像| 九色丨蝌蚪丨成人| 欧美美女一区二区在线观看| 亚洲熟妇无码一区二区三区| 91这里只有精品| 成人免费视频caoporn| 清纯唯美亚洲综合| 麻豆成人在线视频| 日韩成人精品一区| 亚洲精品短视频| 欧美又黄又嫩大片a级| 亚洲同志男男gay1069网站| 国产精品初高中害羞小美女文| 国产精品一区免费观看| 91麻豆视频在线观看| 一本久久知道综合久久| 欧美成人高清视频| 国产极品视频在线观看| 天天躁日日躁狠狠躁欧美巨大小说| 欧美日本在线播放| 99免费视频观看| 丁香花视频在线观看| 亚洲婷婷在线视频| 亚洲精品久久久久久一区二区| 亚洲人午夜射精精品日韩| 国产激情视频一区二区在线观看| 国产精品久久久久久av福利软件| 毛片在线免费视频| 尤物精品在线| 欧美黑人性猛交| 538精品在线视频| 日韩精品免费| 中文字幕日韩免费视频| 中文字幕免费看| 日本欧美高清| 亚洲韩国日本中文字幕| 白丝校花扒腿让我c| 亚洲免费资源| 欧美绝品在线观看成人午夜影视| 制服丝袜综合网| 78精品国产综合久久香蕉| 色综合视频一区二区三区高清| 亚洲色欲久久久综合网东京热| 麻豆网站在线| 亚洲色图丝袜美腿| 日韩精品第1页| 黄色网页在线看| 亚洲欧美日韩小说| 青草全福视在线| 污视频在线免费观看网站| 一区二区三区中文字幕精品精品 | 一区二区久久久| 国产911在线观看| 五月花成人网| 偷窥国产亚洲免费视频| 大j8黑人w巨大888a片| 在线人成日本视频| 欧洲一区二区三区在线| 天天干天天综合| 久久久久毛片免费观看| 日韩久久精品一区| 久久久午夜精品福利内容| 国产成人福利av| 亚洲大胆人体av| 波多野结衣办公室33分钟| 国产99精品| 日韩有码视频在线| 午夜69成人做爰视频| 欧美三级午夜理伦三级中文幕| 久久久中文字幕| 丁香六月婷婷综合| 日本vs亚洲vs韩国一区三区 | 无码人妻丰满熟妇区毛片18| 欧美xxxxxx| 欧美高清你懂得| zjzjzjzjzj亚洲女人| 亚洲电影一级片| 精品激情国产视频| 日韩污视频在线观看| 久久精品在线| 91牛牛免费视频| 天堂中文在线资| 国产精品久久久久久久久免费相片| 中文字幕在线乱| 蜜桃视频在线观看免费视频| 欧美天堂亚洲电影院在线播放| 亚洲一区二区中文字幕在线观看| 欧美变态挠脚心| 最近中文字幕2019免费| 国产亚洲自拍av| 男人的j进女人的j一区| 国产一区二中文字幕在线看| 高h调教冰块play男男双性文| 久久久五月婷婷| 日韩久久久久久久久久久久| 欧美男女交配| 精品国精品国产尤物美女| 精品人伦一区二区三电影| 欧美激情1区2区| 国产精品99久久久久久人| 国产高清在线免费| 国产欧美视频在线观看| 黄色av网址在线播放| 一区二区三区| 亚洲欧美日韩中文在线制服| 久久久久无码精品国产| 美洲天堂一区二卡三卡四卡视频| 国产精品久久国产三级国电话系列 | 日韩视频中午一区| 中文字幕av久久爽一区| 亚洲人www| 99久久久久国产精品免费| 北岛玲日韩精品一区二区三区| 亚洲成人一二三| 亚洲欧美日韩网站| 日韩在线不卡| 日本精品视频在线观看| 色哟哟国产精品色哟哟| 夜夜嗨av一区二区三区| 欧美又黄又嫩大片a级| jvid福利在线一区二区| 日本精品视频在线观看| 三级在线播放| 亚洲电影一区二区三区| 性一交一黄一片| 91国语精品自产拍| 国产精品网址在线| 国产精品一级伦理| 懂色av影视一区二区三区| 动漫美女无遮挡免费| 中文视频一区| 亚洲影院高清在线| 粗大黑人巨茎大战欧美成人| 欧美色涩在线第一页| 女女互磨互喷水高潮les呻吟| 先锋影音久久| 欧美日本韩国国产| 456亚洲精品成人影院| 亚洲精品一二区| 国产字幕在线观看| 久久影音资源网| 久久九九国产视频| 国产精品一国产精品| 国产精品444| 成人高清免费在线播放| 欧美三级一区二区| 免费一级suv好看的国产网站| 裸体在线国模精品偷拍| 中文字幕中文字幕一区三区| www.欧美视频| 久久999免费视频| 天天干,夜夜操| 亚洲国产美女搞黄色| 国产成人精品无码片区在线| 亚洲影院一区| 亚洲欧美日韩另类精品一区二区三区| 国产精品99精品一区二区三区∴| 久久国内精品一国内精品| 999国产精品视频免费| 亚洲精品菠萝久久久久久久| 性高潮久久久久久| 亚洲欧美视频| 亚洲va久久久噜噜噜久久狠狠| 亚洲天堂网站| 欧美激情亚洲综合一区| 天堂av网在线| 欧美日韩久久久一区| 欧美日韩综合一区二区| www.欧美精品一二区| 欧美 国产 小说 另类| 日韩激情图片| 国产精品一区二区三区四区五区 | 黄色网在线播放| 亚洲国产毛片完整版| 日韩一级片中文字幕| 亚洲三级在线免费| 精品国产一区在线| 美女视频一区二区| 2022中文字幕| 亚洲人亚洲人色久| 91精品久久久久久久久久久| 第一中文字幕在线| 国产一区二区三区视频免费| 国产高潮在线观看| 色婷婷亚洲一区二区三区| 性欧美疯狂猛交69hd| www.亚洲色图.com| 亚洲 国产 图片| 亚洲美女黄色| 91香蕉视频网址| 色爱综合av| 91精品中国老女人| 日韩大尺度黄色| 九九热最新视频//这里只有精品| 激情小视频在线| 欧美大片一区二区三区| 国产精品乱码一区二区视频| 亚洲自拍偷拍麻豆| 国产传媒视频在线 | 成人性视频免费看| 不卡av在线网| 亚洲第一天堂久久| 久久久久国内| 欧洲精品一区二区三区久久| 欧美wwwww| 欧洲亚洲一区二区| 豆花视频一区二区| 91日本视频在线| 51一区二区三区| 欧美亚洲国产另类| 日韩三级免费| 久久精品中文字幕| 国产在线观看精品一区| 亚洲激情视频在线| 亚洲黄色在线免费观看| 制服丝袜日韩国产| 在线观看免费视频一区| 在线欧美日韩国产| 69视频免费在线观看| 亚洲一区二区欧美| 黑人巨大精品一区二区在线| 中文字幕亚洲区| 免费看91的网站| 久久久三级国产网站| 国产精品一级黄片| 成人福利视频在线看| 日本r级电影在线观看| 国产资源精品在线观看| 日本特黄a级片| 日本特黄久久久高潮| 免费在线观看的毛片| 先锋影音国产一区| 色综合av综合无码综合网站| 亚洲综合二区| 欧美日韩一道本| 国产欧美大片| 激情五月宗合网| 午夜亚洲性色福利视频| 国产 福利 在线| 香蕉久久夜色精品国产| 欧美一区二区三区爽大粗免费| 日韩午夜精品| 精品一区二区中文字幕| 久久精品女人天堂| 爱情岛论坛vip永久入口| 日韩福利视频导航| 午夜国产一区二区三区| 久久99精品久久久久久国产越南| 乌克兰美女av| 国产一区二区三区av电影| 91av免费观看| av动漫一区二区| 日韩中文字幕电影| 国产欧美综合色| 中文字幕资源站| 亚洲一区二区三区美女| 欧美不卡视频在线观看| 福利微拍一区二区| 最近中文字幕在线免费观看| 欧美日韩一级二级| 国产成人精品a视频| 亚洲成年网站在线观看| 欧美色18zzzzxxxxx| 上原亚衣av一区二区三区| 成人在线播放免费观看| 久久久午夜视频| 你懂得影院夜精品a| 成人a视频在线观看| 好吊妞国产欧美日韩免费观看网站| 久久伦理网站| 国产精品久久久久久久| 大西瓜av在线| 日本视频中文字幕一区二区三区| 亚洲理论中文字幕| av中文一区二区三区| 色噜噜噜噜噜噜| 一区二区三区在线免费| 精品国产一区二区三区四| 欧美日韩一区二区三区免费看| xxxwww在线观看| 亚洲天堂男人的天堂| 性欧美video高清bbw| 国产精品69精品一区二区三区| 警花av一区二区三区| 欧美理论一区二区| 欧美一区二区三区免费看| 日韩黄色片视频| 国产精一区二区三区| 免费看黄色的视频| 一级特黄大欧美久久久| 亚洲av综合一区| 亚洲国产成人在线视频| 日本韩国在线视频爽| 7m第一福利500精品视频| 亚洲精品自拍| 欧美精品一区二区三区久久| 久久久久久久久国产一区| 大肉大捧一进一出好爽动态图| 国产精品白丝jk白祙喷水网站| 91网站免费视频| 亚洲一区二区三区精品在线| 一级全黄少妇性色生活片| 日韩精品极品在线观看| 羞羞网站在线看| 成人高h视频在线| 精品久久久久久久| 97av视频在线观看| 丰满白嫩尤物一区二区| 中文字幕乱码av| 欧美性淫爽ww久久久久无| 天天操天天爱天天干| 久久6精品影院| 99视频有精品高清视频| 图片区小说区区亚洲五月| 国产手机视频一区二区| 黑人玩弄人妻一区二区三区| 亚洲素人一区二区| 亚洲在线视频播放| 亚洲视频欧美视频| 中文字幕这里只有精品| 国产乱子伦精品| 精品二区视频| 国产原创剧情av| 亚洲综合自拍偷拍| www.久久伊人| 美女性感视频久久久| 欧美日韩免费电影| 亚洲欧洲一区二区| 日韩电影一区二区三区| 婷婷色一区二区三区 | 在线视频播放大全| 在线观看国产精品淫| 成人福利一区二区| 日韩一区国产在线观看| 日韩福利电影在线观看| 99精品全国免费观看| 精品视频全国免费看| jizz在线免费观看| 国产精品一区二区女厕厕| 日韩一区三区| 91丝袜超薄交口足| 亚洲精品国产品国语在线app| 国产免费福利视频| 精品国产一区二区三区久久狼5月 精品国产一区二区三区久久久狼 精品国产一区二区三区久久久 | 精品在线欧美视频| 亚洲欧美韩国| 日韩久久久久久久| 免费人成在线不卡| 三级黄色在线观看| 日韩一区二区三区四区| 日韩经典av| 久久精品日产第一区二区三区乱码 | 中文字幕在线导航| 国产精品短视频| www.av网站| 7m精品福利视频导航| 欧美最新另类人妖| 九九久久久久久| 一区二区三区四区亚洲| 熟妇高潮一区二区高潮| 日本亚洲精品在线观看| 日韩欧美高清| 久久av一区二区三| 狠狠躁夜夜躁人人躁婷婷91| avtt亚洲| 国产98在线|日韩| 久久久久免费| 麻豆精品国产免费| 亚洲成在人线av| 国产精品诱惑| 免费视频爱爱太爽了| 久久久久久久久久久电影| 又污又黄的网站| 午夜精品久久久久久99热| 国产麻豆一区二区三区精品视频| 亚洲精品综合在线观看| 亚洲不卡在线观看| 成人性生交大片免费看午夜 | 欧美精美视频| 一级黄色免费毛片| 色综合网站在线| sm国产在线调教视频| 久草一区二区| 国产自产高清不卡| chinese国产精品| 欧美成人午夜免费视在线看片| 人人香蕉久久| 国产麻豆剧传媒精品国产| 在线亚洲免费视频| 成人福利电影|