日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

麻省理工18年春软件构造课程阅读04“代码评审”

發布時間:2023/12/10 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 麻省理工18年春软件构造课程阅读04“代码评审” 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文內容來自MIT_6.031_sp18: Software Construction課程的Readings部分,采用CC BY-SA 4.0協議。

由于我們學校(哈工大)大二軟件構造課程的大部分素材取自此,也是推薦的閱讀材料之一,于是打算做一些翻譯工作,自己學習的同時也能幫到一些懶得看英文的朋友。另外,該課程的閱讀資料中有許多練習題,但是沒有標準答案,所給出的答案均為譯者所寫,有錯誤的地方還請指出。




譯者:李秋豪

審校:

V1.0 Thu Mar 8 22:58:41 CST 2018


本次課程的目標

  • 代碼評審:閱讀并討論別人寫的代碼。
  • 好代碼的書寫原則:你在代碼評審的過程中應遵循的標準,不管編程目的或編程語言是什么。


代碼評審

代碼評審是一種系統的對別人代碼的研究,和論文審校很類似。

代碼評審有兩個主要目的:

  • 提升代碼質量。 找出存在及潛在的bug,分析代碼的清晰度以及代碼是否嚴格遵循了當前工程的標準。
  • 提升程序員的水平。 代碼評審是提升程序員水平的一個重要方法,通過它可以學習到語言新的特性、工程上新的設計以及一些新的實現方法。特別是在開源項目中,很多交流都是在代碼評審這種環境下進行的。

代碼評審已經在開源項目中運用很深了,例如Apache 和 Mozilla. 同樣的,代碼評審在工業界也應用很廣,在Google,如果你的代碼沒有另一個程序員的評審簽字,你是沒辦法將它提交的。

在本課程中,我們會在“Problem sets”環節上進行一系列的代碼評審,詳細的信息可參考 Code Reviewing document 。(譯者注:這是MIT要求學生之間相互進行代碼評審并打分。我們學校沒有進行這項活動)

風格標準

大多數公司或者大的項目都會要求代碼風格具有統一的標準。這些標準可能會非常細化,例如縮進應該是幾個空格,花括號應該怎么對齊。這些問題上的爭論通常會導致 神圣的戰爭 (譯者注:例如vim和emacs哪一個更好),畢竟它們關乎于個人的口味或者審美觀。

在本門課程中,我們對代碼風格沒有一個統一的要求。如果你是剛開始寫Java,我們推薦你遵循 Google Java Style ,它在工業界運用的很廣,可讀性也不錯,例如:

if (isOdd(n)) { n = 3*n + 1; }
  • 在關鍵詞(if)后面留空格,但是在函數調用(isOdd)后不留空格
  • 在行的末尾寫{ ,而 } 自己單獨一行
  • 無論是空塊還是只有一行,都要用{…}包括起來

不過,我們不會要求你遵循花括號的放置風格,畢竟每個程序員都有自己的口味。但是要注意,一旦遵循某一種風格后就要一直這樣寫,不要一會這樣一會那樣。同時,應該優先遵守所在項目規定的風格,如果你在進行代碼評審的時候擅自改動別人的代碼風格,你的搭檔會恨死你的;)總之,團隊合作優先。

同時,有一些代碼風格是跟我們這門課程的三個目標息息相關的(譯者注:遠離bug、易讀性、可改動性),它們可不止花括號放在哪這么簡單。這篇閱讀的剩下部分將探討這些規則,而你在進行代碼評審或是自己寫代碼的時候也應該注意這些規則。但是,代碼評審可不僅僅是看別人的代碼風格,我們在后續的課程還會講到很多別的事情,例如規格說明、抽象數據類型、并發編程和線程安全等等,這些都是代碼評審的原材料。


難聞的(Smelly)例子 #1

程序員通常會將差代碼描述為“難聞的”(bad smell)。“代碼衛生”(Code hygiene)則是另一個描述這方面的詞。現在讓我從一個“難聞的”代碼開始吧:

public static int dayOfYear(int month, int dayOfMonth, int year) {if (month == 2) {dayOfMonth += 31;} else if (month == 3) {dayOfMonth += 59;} else if (month == 4) {dayOfMonth += 90;} else if (month == 5) {dayOfMonth += 31 + 28 + 31 + 30;} else if (month == 6) {dayOfMonth += 31 + 28 + 31 + 30 + 31;} else if (month == 7) {dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30;} else if (month == 8) {dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30 + 31;} else if (month == 9) {dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31;} else if (month == 10) {dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30;} else if (month == 11) {dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31;} else if (month == 12) {dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 31;}return dayOfMonth; }

接下來的幾節都會圍繞這一代碼段展開。


別寫重復的代碼(Don’t Repeat Yourself)

重復的代碼很不安全。如果你在兩個地方放置了相似的代碼,那么一個最基本的風險就是如果一處出現了bug,另一處也非常可能有bug。而修復的時候經常只會修復一個地方而忽略了另一個地方。

避免重復就像你過馬路的時候要避免被車撞一樣。賦值-粘貼在編程中是一個很大的誘惑,而你在使用它的時候,“皮膚應該感覺到危險而震顫”。(譯者注:這描述也是醉了)

別重復代碼(Don’t Repeat Yourself,)簡稱為DRY,現在已經成為了編程人員的一句咒語。

譯者注(來自維基百科):

一次且僅一次once and only once,簡稱OAOO)又稱為Don't repeat yourself(不要重復你自己,簡稱DRY)或一個規則,實現一次one rule, one place)是面向對象編程中的基本原則,程序員的行事準則。旨在軟件開發中,減少重復的信息。

DRY的原則是──系統中的每一部分,都必須有一個單一的、明確的、權威的代表──指的是(由人編寫而非機器生成的)代碼和測試所構成的系統,必須能夠表達所應表達的內容,但是不能含有任何重復代碼。當DRY原則被成功應用時,一個系統中任何單個元素的修改都不需要與其邏輯無關的其他元素發生改變。此外,與之邏輯上相關的其他元素的變化均為可預見的、均勻的,并如此保持同步。

其起源已經不可考,一般認為這個原則最初由Andy Hunt和Dave Thomas在他們的書The Pragmatic Programmer中提出。因為極限編程方法的創始者之一肯特·貝克總結和宣傳而使其廣為人知。

違反DRY原則的解決方案通常被稱為WET,其有多種全稱,包括“write everything twice”(在每個地方寫兩次)、“we enjoy typing”(我們就是喜歡打字)或“waste everyone's time”(浪費大家的時間)。

上面 dayOfYear 這個例子充滿了重復的代碼,你能夠試著將它們修復嗎?

閱讀小練習

在 dayOfYear() 有一種重復是數值的重復,請問在 dayOfYear() 一共出現了幾次四月份的天數?

9

正如上面所提到的,重復的代碼會給修復帶來麻煩,如果我們的日歷講二月份改為30天而不是28天,這段代碼一共要修改幾處?

10

另一種重復是代碼 dayOfMonth+=的重復。假設你建立了一個數組:int[] monthLengths = new int[] { 31, 28, 31, 30, ..., 31} ,以下哪一種語句架構能夠幫助你DRY,使得 dayOfMonth+= 僅出現一次呢?

  • [x] for (int m = 1; m < month; ++m) { ... }
  • [ ] switch (month) { case 1: ...; break; case 2: ...; break; ... }
  • [ ] while (m < month) { ...; m += 1; }
  • [ ] if (month == 1) { ... } else { ... dayOfYear(month-1, dayOfMonth, year) ... }


僅在需要的地方注釋

一個好的開發者應該在代碼中明智的添加注釋。好的注釋會使得代碼易于修改,遠離bug(因為一些重要的設想已經寫出來了),并且減小了改動的難度。

一種重要的注釋就是規格說明,通常出現在方法或者類的前部,一般會描述出類或方法的行為、參數、返回值、用法/例子等等。在Java中,規格說明通常按照Javadoc的標準來寫:以 /** 開始,中間用 @-標出參數和返回值,最后以*/結尾。例如:

/*** Compute the hailstone sequence.* See http://en.wikipedia.org/wiki/Collatz_conjecture#Statement_of_the_problem* @param n starting number of sequence; requires n > 0.* @return the hailstone sequence starting at n and ending with 1.* For example, hailstone(3)=[3,10,5,16,8,4,2,1].*/ public static List<Integer> hailstoneSequence(int n) {... }

另一種重要的注釋就是標出是從哪引用的別的代碼。這在實際編程中是非常重要的,當你從別的網站上引用代碼的時候。同時,本門課程的要求 6.031 collaboration policy 也是這樣規定的。例如:

// read a web page into a string // see http://stackoverflow.com/questions/4328711/read-url-to-string-in-few-lines-of-java-code String mitHomepage = new Scanner(new URL("http://www.mit.edu").openStream(), "UTF-8").useDelimiter("\\A").next();

其中的一個原因就是避免版權糾紛。你在Stack Overflow上引用的代碼可能是用的公共版權協議,但是在別處的代碼就未必了。另一個原因在于很多網站上的代碼可能已經“過期”了,它可能不在符合現有的語言標準或者有更好的解決方案。例如這個回答就已經不適合現在的Java寫法了。

有一些注釋是不必要的。例如直接將代碼行為翻譯為英語(好像讀者完全不懂Java一樣):

while (n != 1) { // test whether n is 1 (don't write comments like this!)++i; // increment il.add(n); // add n to l }

但是不易理解的代碼應該被注釋(例如實現一些特定的算法):

int sum = n*(n+1)/2; // Gauss's formula for the sum of 1...n// here we're using the sin x ~= x approximation, which works for very small x double moonDiameterInMeters = moonDistanceInMeters * apparentAngleInRadians;

閱讀小練習

僅在需要的地方注釋

下面哪一些注釋是合理的?(獨立思考每一個注釋,就當其它注釋不存在一樣)

/** @param month month of the year, where January=1 and December=12 [C1] */ public static int dayOfYear(int month, int dayOfMonth, int year) {if (month == 2) { // we're in February [C2]dayOfMonth += 31; // add in the days of January that already passed [C3]} else if (month == 3) {dayOfMonth += 59; // month is 3 here [C4]} else if (month == 4) {dayOfMonth += 90;}...} else if (month == 12) {dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 31;}return dayOfMonth; // the answer [C5] }
  • [x] C1

  • [ ] C2

  • [x] C3

  • [ ] C4

  • [ ] C5


快速報錯/失敗(Fail-fast)

快速報錯是指代碼應該盡可能快的將其中的bug暴露出來。因為問題暴露的越早(越接近),其修復工作也會越容易。正如我們在第一篇閱讀資料里看到的,靜態檢查比動態檢查更早報錯,動態檢查比產生錯誤的結果(這也可能會影響接下來的計算)更早報錯。

很明顯, dayOfYear 這個函數并沒有快速報錯——如果你輸入一個順序不對的參數,它只會靜悄悄的返回一個錯誤的值。事實上,依照 dayOfYear 參數的設計方法,一個不是美國本土的用戶很可能輸入一個順序不對的參數。所以, dayOfYear 需要靜態或者動態檢查來檢測這種錯誤。

閱讀小練習

快速報錯

public static int dayOfYear(int month, int dayOfMonth, int year) {if (month == 2) {dayOfMonth += 31;} else if (month == 3) {dayOfMonth += 59;} else if (month == 4) {dayOfMonth += 90;} else if (month == 5) {dayOfMonth += 31 + 28 + 31 + 30;} else if (month == 6) {dayOfMonth += 31 + 28 + 31 + 30 + 31;} else if (month == 7) {dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30;} else if (month == 8) {dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30 + 31;} else if (month == 9) {dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31;} else if (month == 10) {dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30;} else if (month == 11) {dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31;} else if (month == 12) {dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 31;}return dayOfMonth; }

假設現在的日期是2019年二月9號,dayOfYear 返回的正確答案應該是40。以下輸入分別會導致什么結果呢?(靜態錯誤、動態錯誤、不報錯返回正確答案、不報錯返回錯誤的答案)

dayOfYear(2, 9, 2019)

不報錯返回正確答案

dayOfYear(1, 9, 2019)

不報錯返回錯誤的答案

dayOfYear(9, 2, 2019)

不報錯返回錯誤的答案

dayOfYear("February", 9, 2019)

靜態錯誤

dayOfYear(2019, 2, 9)

不報錯返回錯誤的答案

dayOfYear(2, 2019, 9)

不報錯返回錯誤的答案

更快速的報錯

以下哪一種措施會使得我們的報錯更加快速呢?

public static int dayOfYear(String month, int dayOfMonth, int year) { ... }

更快報錯——靜態錯誤

public static int dayOfYear(int month, int dayOfMonth, int year) {if (month < 1 || month > 12) {return -1;}... }

更快報錯——動態錯誤

public static int dayOfYear(int month, int dayOfMonth, int year) {if (month < 1 || month > 12) {throw new IllegalArgumentException();}... }

更快報錯——動態錯誤

public enum Month { JANUARY, FEBRUARY, MARCH, ..., DECEMBER }; public static int dayOfYear(Month month, int dayOfMonth, int year) {... }

更快報錯——靜態錯誤

public static int dayOfYear(int month, int dayOfMonth, int year) {if (month == 1) {...} else if (month == 2) {...}...} else if (month == 12) {...} else {throw new IllegalArgumentException("month out of range");} }

更快報錯——動態錯誤


避免幻數

有一個笑話說的是計算機科學家只認識1和0這兩個數字,有時候加上一個2.(譯者注:好冷。。他的意思是盡量不要經常在代碼中寫1和0以外的常數)

除了這幾個數以外的常數都被稱為“ 幻數”,因為它們就好像不知道從哪突然冒出來一樣。

解決幻數的一個辦法就是寫注釋,但是另一個更好的辦法是聲明一個具有合理名字的變量。

上面的dayOfYear 就充滿了幻數:

  • 月份2,.....,12如果用 FEBRUARY, …, DECEMBER.會更加容易理解
  • days-of-months 30, 31, 28等等 如果用存儲在數據結構中的數會更加容易理解,例如列表或者數組e.g. MONTH_LENGTH[month].
  • 前面的59和90實際上是程序員自己加起來算出的!它們不僅沒有注釋,而且正確性依賴于程序員算術的正確性! 永遠不要在代碼用硬編碼你自己計算的數值,讓程序去做所有的數值計算工作,例如MONTH_LENGTH[JANUARY] + MONTH_LENGTH[FEBRUARY]即易于理解又不會計算錯誤。

閱讀小練習

避免幻數

在以下代碼中,你覺得2大概代表什么意思?

if (month == 2) { ... }
  • [ ] 2 可能代表一月

  • [x] 2 可能代表二月

  • [ ] 2 可能代表五月

  • [ ] 2 可能代表公元二年

當你要靠猜測的時候,會發生什么

假設你正在閱讀 turtle圖形庫中的一段代碼,你對此并不熟悉:

turtle.rotate(3);

僅僅通過這段代碼,你覺得3表達了什么意思?

  • [ ] 3可能代表順時針3度

  • [ ] 3可能代表逆時針3度

  • [x] 3可能代表順時針3弧度

  • [ ] 3可能代表順時針3圈

用名字而非數字

思考下面這段代碼,它嘗試畫出一個正邊形:

for (int i = 0; i < 5; ++i) {turtle.forward(36);turtle.turn(72); }

這些幻數使得這段代碼脫離了我們定下的三個目標:遠離bug、易讀性、易改動性(safe from bugs (SFB), not easy to understand (ETU) and not ready for change (RFC))。

對于下面這些重寫的代碼,你認為它們有哪些改進?(SFB, ETU, and/or RFC三個方面考慮)

final int five = 5; final int thirtySix = 36; final int seventyTwo = 72; for (int i = 0; i < five; ++i) {turtle.forward(thirtySix);turtle.turn(seventyTwo); }
  • [x] 沒有提升(或者變差了)

  • [ ] 遠離bug

  • [ ] 易讀性

  • [ ] 易改動性

int[] numbers = new int[] { 5, 36, 72 }; for (int i = 0; i < numbers[0]; ++i) {turtle.forward(numbers[1]);turtle.turn(numbers[2]); }
  • [x] 沒有提升(或者變差了)

  • [ ] 遠離bug

  • [ ] 易讀性

  • [ ] 易改動性

int x = 5; for (int i = 0; i < x; ++i) {turtle.forward(36);turtle.turn(360.0 / x); }
  • [ ] 沒有提升(或者變差了)

  • [ ] 遠離bug(譯者注:其實這里也有一定的遠離bug,如果把最后畫出來不是一個正邊形當做bug的話。不過這里的bug應該是指for循環中可能會添加修改x的代碼,而x又是循環量)

  • [ ] 易讀性

  • [x] 易改動性

final double degreesInACircle = 360.0; final int numSides = 5; final int sideLength = 36; for (int i = 0; i < numSides; ++i) {turtle.forward(sideLength);turtle.turn(degreesInACircle / numSides); }
  • [ ] 沒有提升(或者變差了)

  • [x] 遠離bug

  • [x] 易讀性

  • [x] 易改動性


每一個變量有且只有一個目的

在 dayOfYear 這個例子中, dayOfMonth 被用來做不同意義的值:一開始它是這個月的第幾天,最后它是返回的結果(是今年的第幾天)。

不要重利用參數,也不要重利用變量。在現在的計算機中,變量不是一個稀缺的資源。當你需要的時候就聲明一個(命名一個易理解的名字),不需要它的時候就停止使用。如果你的變量在前面幾行代表一個意思,在后面又代表另一個意思,你的讀者會很困惑的。

另外,這不僅僅是一個易理解的問題,它也和我們的“遠離bug”以及“可改動性”有關。

特別地,方法的參數不應該被修改(這和“易改動性”相關——在未來如果這個方法的某一部分想知道參數傳進來的初始值,那么你就不應該在半路修改它)。所以應該使用final關鍵詞修飾參數(這樣Java編譯器就會對它進行靜態檢查,防止重引用),然后在方法內部聲明其他的變量使用。

public static int dayOfYear(final int month, final int dayOfMonth, final int year) {... }


“難聞的”例子 #2

在 dayOfYear 中有一個bug——它沒有正確處理閏年。為了修復它,我們寫了一個判斷閏年的方法:

public static boolean leap(int y) {String tmp = String.valueOf(y);if (tmp.charAt(2) == '1' || tmp.charAt(2) == '3' || tmp.charAt(2) == 5 || tmp.charAt(2) == '7' || tmp.charAt(2) == '9') {if (tmp.charAt(3)=='2'||tmp.charAt(3)=='6') return true; /*R1*/elsereturn false; /*R2*/}else{if (tmp.charAt(2) == '0' && tmp.charAt(3) == '0') {return false; /*R3*/}if (tmp.charAt(3)=='0'||tmp.charAt(3)=='4'||tmp.charAt(3)=='8')return true; /*R4*/}return false; /*R5*/ }

這個代碼中有bug嗎?它的代碼風格有什么問題(根據前面說過的)?

閱讀小練習

2016

當你判斷2016年時會發生什么:

leap(2016)
  • [x] 在 R1處返回true

  • [ ] 在 R2處返回false

  • [ ] 在 R3處返回false

  • [ ] 在 R4處返回true

  • [ ] 在 R5處返回false

  • [ ] 在程序運行前報錯

  • [ ] 在程序運行時報錯

2017

當你判斷2017年時會發生什么:

leap(2017)
  • [ ] 在 R1處返回true

  • [x] 在 R2處返回false

  • [ ] 在 R3處返回false

  • [ ] 在 R4處返回true

  • [ ] 在 R5處返回false

  • [ ] 在程序運行前報錯

  • [ ] 在程序運行時報錯

2050

當你判斷2050年時會發生什么:

leap(2050)
  • [ ] 在 R1處返回true

  • [x] 在 R2處返回false

  • [ ] 在 R3處返回false

  • [ ] 在 R4處返回true

  • [ ] 在 R5處返回false

  • [ ] 在程序運行前報錯

  • [ ] 在程序運行時報錯

10016

當你判斷10016年時會發生什么:

leap(10016)
  • [ ] 在 R1處返回true

  • [ ] 在 R2處返回false

  • [ ] 在 R3處返回false

  • [ ] 在 R4處返回true

  • [x] 在 R5處返回false

  • [ ] 在程序運行前報錯

  • [ ] 在程序運行時報錯

916

當你判斷916年時會發生什么:

leap(916)
  • [ ] 在 R1處返回true

  • [ ] 在 R2處返回false

  • [ ] 在 R3處返回false

  • [ ] 在 R4處返回true

  • [ ] 在 R5處返回false

  • [ ] 在程序運行前報錯

  • [x] 在程序運行時報錯

幻數

在這個方法了幻數一共出現了幾次(重復的也按多次算)?

12

DRY

假設你寫了一個幫助方法:

public static boolean isDivisibleBy(int number, int factor) { return number % factor == 0; }

接著 leap() 使用這個 isDivisibleBy(year, ...)方法重寫,并且正確的使用 leap year algorithm中描述的算法,這時該方法中會出現幾個幻數?

3


使用好的名稱

好的方法名和變量名都是比較長而且能自我解釋的。這種時候注釋通常都不必要,因為名字就已經解釋了它的用途。

例如,你可以這樣寫:

int tmp = 86400; // tmp is the number of seconds in a day (don't do this!)

或這樣寫:

int secondsPerDay = 86400;

通常來說, tmp, temp, 和 data 這樣變量名是很糟糕的(最懶的程序員的標志)。每一個局部變量都是暫時的(temporary),每一個變量也都是數據(data)。所以這些命名都是無意義的。我們應該使用更長、更有描述性的命名。

每一種語言都有它自己的命名傳統。在Python中,類通常是大寫的,變量通常是小寫,并且單詞是用“_”來區分開的(words_are_separated_by_underscores)。在Java中:

  • methodsAreNamedWithCamelCaseLikeThis (方法)
  • variablesAreAlsoCamelCase (譯者注:駝峰命名法)
  • CONSTANTS_ARE_IN_ALL_CAPS_WITH_UNDERSCORES (常量)
  • ClassesAreCapitalized (類)
  • packages.are.lowercase.and.separated.by.dots (包)

ALL_CAPS_WITH_UNDERSCORES 是用來表示 static final 這樣的常量,所有在方法內部聲明的方法,包括用final修飾的,都使用camelCaseNames.

方法的名字通常都是動詞,例如 getDate 或者 isUpperCase, 而變量和類的名字通常都是名詞。盡量選用簡潔的命名,但是要避免縮寫:例如, message 而不是 msg, word而不是 wd. 因為看你代碼的程序員可能是非英語母語的!這些縮寫可能在他們看來很難懂。

另外要避免使用一個字母當變量的名字,除了在一些傳統上根據能看懂的情況。例如x和y在用于坐標系的時候就很清晰,i和j用于變量的循環變量的時候就很清晰。但是如果你的代碼充斥了像 e, f, g, 和 h這樣的單字母變量,讀者會很難理解它們的用途的。

閱讀小練習

更好的方法名

public static boolean leap(int y) {String tmp = String.valueOf(y);if (tmp.charAt(2) == '1' || tmp.charAt(2) == '3' || tmp.charAt(2) == 5 || tmp.charAt(2) == '7' || tmp.charAt(2) == '9') {if (tmp.charAt(3)=='2'||tmp.charAt(3)=='6') return true;elsereturn false;}else{if (tmp.charAt(2) == '0' && tmp.charAt(3) == '0') {return false;}if (tmp.charAt(3)=='0'||tmp.charAt(3)=='4'||tmp.charAt(3)=='8')return true;}return false; }

下面哪一個方法名比 leap這個名字 更合適?

  • [ ] leap

  • [x] isLeapYear

  • [ ] IsLeapYear

  • [ ] is_divisible_by_4

更好的方法名

下面哪一個變量名比 tmp 更合適?

  • [ ] leapYearString

  • [x] yearString

  • [ ] temp

  • [ ] secondsPerDay

  • [ ] s


使用空白符幫助讀者

注意使用前后一致的空格縮進。leap就是一個典型的反面例子。dayofYear就好的多。事實上, dayOfYear很好的將各個行用縮進進行了分隔,它們開始來很適合人們閱讀。

在代碼行中添加一些一致的空格有利于人們的閱讀。leap這個例子就將很多代碼“雜糅”在一起——記得加一些空格。

另外要注意的是,永遠不要使用Tab字符 (譯者注:即\t)來進行縮進,只能使用空格字符。這里強調的是不要使用\t字符,不是說鍵盤上的這個按鍵(譯者注:很多編輯器和IDE都會自動把Tab按鍵作為設置好幾個連續的空格輸入)。因為不同的工具在顯示\t字符的時候長度不一樣,有的是8個空格,有的是4個空格,有的是2個空格,所以在你用“git diff”或者其他的編輯器看同一份代碼很可能就會顯示的不一樣。永遠將你用的文本編輯器設置為按下Tab鍵輸入空格而非\t 。


“難聞的”例子 #3

下面是本次閱讀的第三個例子,它呈現了我們剩下要講的要點:

public static int LONG_WORD_LENGTH = 5; public static String longestWord;public static void countLongWords(List<String> words) {int n = 0;longestWord = "";for (String word: words) {if (word.length() > LONG_WORD_LENGTH) ++n;if (word.length() > longestWord.length()) longestWord = word;}System.out.println(n); }


不要使用全局變量

避免使用全局變量,現在我們把這個詞拆開具體分析:

  • “變量”,說明它的值是可以修改的
  • “全局的”,說明它可以從程序的任何地方訪問

為什么全局變量是不好的 列出了一系列全局變量的缺點,可以參考一下。

在Java中,全局變量被聲明為 public static 。 public 修飾符代表它可以從任何地方訪問,而 static代表這個變量只會有一個實例化的值。

然而,如果我們加上另一個關鍵詞final : public static final,并且這個變量的類型是不可更改的(immutable,譯者注:參考第二篇閱讀“Java基礎”),那么這個對象就變成了一個“全局常量”。一個全局常量可以在任何位置讀取,但是永遠不會被賦予新的值或對象,所以風險也就沒有了。全局常量是很常見的,而且很有用。

通常來說,我們應該使用參數傳遞和返回值而非全局變量,或者將它們放到你調用的方法的所屬類中。我們會在后面的閱讀中介紹很多這樣的方法。

在快照圖中的各種變量

在我們畫快照圖的時候,區別不同種類的變量是很重要的(譯者注:參考第二篇閱讀“Java基礎”):

  • 方法里面的局部變量
  • 一個實例化對象中的實例化變量
  • 一個類中的靜態變量

當方法被調用的時候,局部變量產生,當方法返回時,局部變量消失。如果一個方法被多次同時調用(例如遞歸),這些方法里面的局部變量互相獨立,彼此不會影響。

當一個對象用new實例化后,對象中實例化的變量產生,當這個對象被垃圾回收時,這個變量消失。每一個實例化對象都有它自己的實例化變量。

當程序啟動時(更準確點說是包含該靜態變量的類被加載的時候),靜態變量就產生了,它會一直存活到程序結束。

下面這個例子中使用到了上面三種變量:

class Payment {public double value;public static double taxRate = 0.05;public static void main(String[] args) {Payment p = new Payment();p.value = 100;taxRate = 0.05;System.out.println(p.value * (1 + taxRate));} }

下面這個快照圖描述了各個變量之間的區別:

局部變量p和args顯示在一個棧幀中,它們在main函數被調用的時候動態生成,main函數返回時它們也會跟著消失。而println是在main函數調用它的時候生成的。

實例化變量 value 會在每一個Payment類型的對象中出現。

靜態變量 taxRate 出現在Payment類型的對象之外,因為它是屬于Payment這個類的。任何數量的 Payment 類型的對象都可以被創建或銷毀(同時它們含有的實例化變量 value 也會跟著一起創建和銷毀),但是在整個程序中有且僅有一個Payment類,所以這里也有且僅有一個Payment.taxRate 變量。 System.out 是另一個在這段代碼中使用到的靜態變量,所以在快照圖中也將它顯示出來了。

閱讀小練習

辨識出全局變量

在上面第三個例子中,哪一些是全局變量?

  • [ ] countLongWords

  • [ ] n

  • [x] LONG_WORD_LENGTH

  • [x] longestWord

  • [ ] word

  • [ ] words

final的效果

使用final關鍵詞是避開使用全局變量風險的一個辦法。如果我們在第三個例子中分別對以下變量使用final關鍵詞會發什么什么?

n -> 程序運行前報錯

LONG_WORD_LENGTH -> 成為常量

longestWord -> 程序運行前報錯

word -> 成為常量

words -> 成為常量


方法應該返回結果,而不是打印它

countLongWords 并不具備可更改性。它最后向控制臺輸出結果, System.out.這意味著如果你想在另一個地方使用它,其中結果可能會做其他的用途,例如參與運算而不是顯示出來,程序就得重寫。

通常來說,只有最高層的代碼才會處理與人/控制臺的交互。唯一的例外是debug的時候,你需要將一些關鍵值打印出來。但是這一部分代碼不會是你設計的一部分,只有在debug的時候才能出現。


總結

代碼評審是一種廣泛應用的軟件質量提升方法。它可以檢測出代碼中的各種問題,但是作為一個初學課程,這篇閱讀材料只提及了下面幾個好代碼通用的原則:

  • 不要重復你的代碼(DRY)
  • 僅在需要的地方做注釋
  • 快速失敗/報錯
  • 避免使用幻數
  • 一個變量有且僅有一個目的
  • 使用好的命名
  • 避免使用全局變量
  • 返回結果而非打印它
  • 使用空白符提升可讀性

下面把今天學的內容和我們的三個目標聯系起來:

  • 遠離bug. 通常來說,代碼評審使用人的審查來發現bug。DRY使得你只用在一處地方修復bug,避免bug的遺漏。注釋使得原作者的假設很清晰,避免了別的程序員在更改代碼的時候引入新的bug。快速報錯/失敗使得bug能夠盡早發現,避免程序一直錯更多。避免使用全局變量使得修改bug更容易,因為特定的變量只能在特定的區域修改。
  • 易讀性. 對于隱晦或者讓人困惑的bug,代碼評審可能是唯一的發現方法,因為閱讀者需要嘗試理解代碼。使用明智的注釋、避免幻數、變量目的單一化、選擇好的命名、使用空白字符都可以提升代碼的易讀性。
  • 可更改性. DRY的代碼更具有可更改性,因為代碼只需要在一處進行更改。返回結果而不是打印它使得代碼更可能被用作新的用途。

轉載于:https://www.cnblogs.com/liqiuhao/p/8531425.html

總結

以上是生活随笔為你收集整理的麻省理工18年春软件构造课程阅读04“代码评审”的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久久精品网站视频 | 九九国产精品视频 | 在线国产中文字幕 | 日操干| 欧美黄污视频 | 婷色| 激情黄色av| 国模精品一区二区三区 | 99久久精品国产欧美主题曲 | 国产又粗又猛又色 | 99999精品| 97精品国产97久久久久久免费 | 综合久久网站 | 国产精品观看在线亚洲人成网 | 三级av在线| 日韩免费精品 | 伊人欧美 | 国产精品不卡在线播放 | 国产 欧美 在线 | 欧美少妇影院 | 国产在线传媒 | 国产精品手机视频 | 日韩动漫免费观看高清完整版在线观看 | 黄色资源在线 | 成年人免费在线看 | 国产小视频在线观看免费 | 午夜av一区| 国产美女在线免费观看 | 欧美一区二区视频97 | 欧美做受69 | 国产精品久久久久三级 | 日韩中文在线电影 | 在线免费视频你懂的 | 成人在线免费av | 91精品亚洲影视在线观看 | 色综合天天视频在线观看 | 波多野结衣网址 | 久久久久免费精品视频 | 伊人成人激情 | 国产在线观看91 | h视频日本| 俺要去色综合狠狠 | 久草视频在线新免费 | 97精品在线 | 激情av一区二区 | 成人在线免费观看视视频 | 最新中文字幕在线播放 | 久操操 | 欧洲亚洲女同hd | 国产精品毛片久久久久久久 | 亚洲免费观看在线视频 | 国产在线观看,日本 | 成人午夜电影在线播放 | 国产精品久久久久久吹潮天美传媒 | 国产精品一码二码三码在线 | 国产va精品免费观看 | 91热| 玖玖爱在线观看 | 久久国产精品偷 | 精品久久久成人 | 日韩av片免费在线观看 | 久久综合影视 | 亚洲视频第一页 | 中文字幕免费久久 | 久久久久国产免费免费 | 国产免费视频在线 | 成人三级视频 | 国产视频999 | 狠狠狠狠狠狠狠 | 美女久久久久久久 | 日韩精品久久中文字幕 | 毛片一级免费一级 | 久久激情电影 | 热re99久久精品国产99热 | 丁香婷婷久久久综合精品国产 | 五月综合色婷婷 | 日韩av片免费在线观看 | 五月亚洲综合 | 99中文字幕在线观看 | 永久精品视频 | 久久99热国产 | 欧美精品久久久久久久免费 | 日韩精品一区二区三区外面 | 天天操天天操天天干 | 国际精品久久久 | 96精品视频 | 一区二区三区免费在线播放 | 午夜99| 精品国产一二三四区 | 天天做日日做天天爽视频免费 | 手机av看片 | 亚洲综合情 | 欧美在线观看小视频 | 91丨精品丨蝌蚪丨白丝jk | 国产在线资源 | 成年人毛片在线观看 | 最新黄色av网址 | 国产特黄色片 | 欧美在线观看视频 | 久久精品日韩 | 欧美成年人在线观看 | 亚洲精品美女久久久 | 99久久精品国产毛片 | 亚洲欧美日韩国产一区二区 | 99视频精品在线 | 成人理论在线观看 | 国产成人不卡 | 久久视 | av中文字幕在线观看网站 | 久久精品欧美 | a视频免费 | 亚洲91中文字幕无线码三区 | 国产系列精品av | 99热在线国产精品 | 91香蕉嫩草 | 97视频在线| 日韩在线视频观看免费 | 欧美一级欧美一级 | 日韩黄色网络 | 激情深爱.com | 成人a级网站 | 国产伦理久久精品久久久久_ | 中文字幕在线观看免费高清完整版 | 国产精品久久久久久久久免费看 | 婷婷综合激情 | 精品免费99久久 | 久久久久久久久久久久久国产精品 | 粉嫩av一区二区三区入口 | 99热精品免费观看 | 国产小视频免费观看 | 亚洲五月婷婷 | 黄色三级在线看 | 在线观看黄a | 久久涩涩网站 | 日韩av电影免费观看 | 成人影音av | 国产精品视频永久免费播放 | 精品久久久国产 | 视频在线观看日韩 | 中文字幕成人网 | 国产亚洲一区二区在线观看 | 国产性天天综合网 | 日韩 国产| 欧美一二三在线 | 久久久免费看片 | 国产精品久久久区三区天天噜 | 日韩电影一区二区三区在线观看 | 色网站在线 | 色香天天 | 丁香六月婷婷激情 | 在线欧美a | 超碰公开在线观看 | 欧美福利视频一区 | 日韩在线视频一区 | 欧美少妇xx| 亚洲黄色在线看 | 五月天丁香亚洲 | 日韩 精品 一区 国产 麻豆 | 中文字幕韩在线第一页 | 91欧美精品 | 中文字幕日本特黄aa毛片 | av黄色免费网站 | 久久综合九色综合久久久精品综合 | 99re久久精品国产 | 四虎国产精品免费观看视频优播 | 久久久黄视频 | 西西4444www大胆无视频 | 国产亚洲成av片在线观看 | 在线国产99 | 99热9 | 福利片免费看 | 超碰99在线 | 免费在线播放黄色 | 中文字幕av最新更新 | 丁香视频免费观看 | 808电影免费观看三年 | 97品白浆高清久久久久久 | 国产精品一区二区av日韩在线 | 免费看黄在线看 | 免费av大片| 美女视频黄是免费的 | 在线观看国产一区二区 | 91重口视频| 激情欧美xxxx | a'aaa级片在线观看 | 久久综合九色九九 | 成人免费视频a | 天天天天天天天操 | 中文字幕国产一区 | 欧美夫妻性生活电影 | 久久久久久久久电影 | 99在线视频精品 | 夜夜高潮夜夜爽国产伦精品 | 日韩最新av | 久久精品这里精品 | 91在线精品秘密一区二区 | 免费在线一区二区三区 | 五月婷婷视频在线观看 | 人人舔人人射 | 欧美巨乳网 | 国模精品一区二区三区 | 久要激情网 | 国产精品久久久久久久久费观看 | 日韩av在线影视 | 久久精品一二三区白丝高潮 | 国产视频在线观看一区二区 | 黄色三级免费网址 | 国产精品不卡在线观看 | 国产精品2018 | 网站你懂的 | 欧美另类交在线观看 | 色九九影院 | www国产亚洲精品久久麻豆 | 999久久久久 | 成人黄大片视频在线观看 | 国产乱码精品一区二区三区介绍 | 亚洲精品视频第一页 | 97色狠狠 | 国产精品久久久久av免费 | 色婷婷婷 | 婷婷久操 | 97超碰国产精品 | 欧美日韩国产一区二区在线观看 | 久久在线精品 | 99久久这里只有精品 | 丁香六月婷 | 国产一二三区在线观看 | 在线黄色国产电影 | 国产一级视屏 | 欧美日韩免费观看一区=区三区 | 色国产精品一区在线观看 | 一级黄色电影网站 | 六月丁香社区 | av线上看| 免费三级黄色片 | 国产精品porn| 黄色的网站免费看 | 亚洲精品一区二区三区在线观看 | 欧美日韩国产一区二区三区 | 国产香蕉97碰碰久久人人 | 最近中文字幕大全中文字幕免费 | 蜜桃视频色 | 免费黄色网址大全 | 97天堂| 91成人在线网站 | 天天干天天爽 | 日韩视频二区 | 国产一级性生活视频 | 天天干天天射天天爽 | 国产视频1 | 国产精品igao视频网入口 | 日韩乱码在线 | 日韩免费电影一区二区 | 欧美日韩一区二区在线观看 | 国产精品无av码在线观看 | 黄色中文字幕在线 | www色av| 日韩免费中文字幕 | 免费在线一区二区 | av在线播放快速免费阴 | 欧美污在线观看 | 99在线精品视频 | 中文字幕av在线不卡 | 黄在线| 欧美日比视频 | 黄色www在线观看 | 久久国语露脸国产精品电影 | 欧美一级淫片videoshd | 我爱av激情网 | 最新中文字幕在线观看视频 | 久久久首页 | 久久久精品国产免费观看同学 | 亚洲一区日韩在线 | 欧美日韩国产在线观看 | 久久久96| www.黄色网.com | 中文字幕在线不卡国产视频 | 狠狠色网| 成人av观看| 国产 欧美 日本 | 天天射色综合 | 亚洲视频国产 | 在线观看免费福利 | 91香蕉亚洲精品 | 久久久久久久综合色一本 | 亚洲国产精品推荐 | 亚洲伦理一区 | 亚洲成年人在线播放 | 欧美黑吊大战白妞欧美 | 97av.com | 在线成人性视频 | 高清av在线免费观看 | 日韩欧美综合 | 免费在线观看视频a | 又爽又黄又刺激的视频 | 日韩激情中文字幕 | 日韩有码欧美 | 五月婷婷综合在线观看 | 色婷在线| 亚洲精品国产精品国自产 | 欧美色图另类 | 在线欧美国产 | 人人干人人添 | 成人免费视频播放 | 五月天婷婷在线播放 | 一级性av | 免费大片av | 最新日韩精品 | 久草视频播放 | 黄色三级在线 | 亚洲乱码久久久 | 国产视频在 | 视频国产 | 日日久视频 | 五月激情片 | 天天爱天天操天天射 | 国产一区视频导航 | 中文字幕黄色网 | 99精品视频免费观看视频 | 久久96国产精品久久99软件 | 丁香婷婷射 | 国产无套一区二区三区久久 | 天天搞天天干 | 久久免费毛片视频 | 久草在线免费播放 | 久久免费精品视频 | 天天干夜夜夜 | 免费看色网站 | 国内精品久久久久久久97牛牛 | 天天操天天色天天射 | 日韩国产欧美在线视频 | 在线有码中文 | 精品嫩模福利一区二区蜜臀 | 日日操天天操夜夜操 | 婷婷综合成人 | 国产高清免费视频 | 麻豆精品91 | 国产精品久久久区三区天天噜 | 亚洲v精品 | 亚洲黄色影院 | 在线观看岛国片 | 国产剧情在线一区 | 九九久久国产精品 | 欧美亚洲国产精品久久高清浪潮 | 成人一区二区在线观看 | 国产女人免费看a级丨片 | 亚洲传媒在线 | 在线 精品 国产 | 蜜臀av夜夜澡人人爽人人桃色 | 久久人人精品 | 久久久久久99精品 | 操操日| 国产精品久久久久久久久久久久午 | 91一区二区三区在线观看 | 国产日韩欧美视频在线观看 | 特级毛片在线观看 | 亚州精品成人 | 亚洲黄色片 | 天天干天天干天天射 | 久久久久久久免费 | 欧美精品在线免费 | 日本免费一二三区 | 日日骑 | 超碰人人91 | 久久一区二区三区国产精品 | 久久久久久久久网站 | 五月激情婷婷丁香 | 日韩电影一区二区在线 | 国产手机视频 | 久久精品视频一 | 国产99久久九九精品免费 | 视频三区 | 亚洲高清在线观看视频 | 国产精品一区二区美女视频免费看 | 国产精品一区专区欧美日韩 | www.天天操 | 欧美精品免费一区二区 | 婷婷激情久久 | 91在线看黄 | 国产中文字幕精品 | 免费看黄色小说的网站 | 国产尤物在线视频 | 午夜精品久久久久久久99热影院 | 日韩精品高清视频 | 天天干天天操天天 | 91av小视频 | 黄色特一级片 | 97人人模人人爽人人喊中文字 | ww视频在线观看 | 欧美一区在线观看视频 | 国产麻豆果冻传媒在线观看 | 91亚洲精品乱码久久久久久蜜桃 | 久久国产区 | 成人99免费视频 | 国产成人精品福利 | 日韩av影视在线观看 | 国产专区在线看 | 人人看人人艹 | av片在线观看| 精品免费一区二区三区 | 2022久久国产露脸精品国产 | 99热国内精品 | 香蕉在线视频观看 | 亚洲va欧美va人人爽 | 91av视频免费在线观看 | 99热超碰| 美国三级黄色大片 | 久一网站 | 91久久国产自产拍夜夜嗨 | 亚洲一区日韩 | 日韩高清成人在线 | 中文字幕一区在线观看视频 | 毛片随便看 | 韩国一区在线 | 天天草天天 | www国产精品com | 国产成人精品久久二区二区 | av电影免费在线 | 久草综合在线 | 在线观看国产91 | 久久久久久久久久久久久久电影 | 久久爱资源网 | 欧洲av在线 | 日日噜噜噜噜夜夜爽亚洲精品 | 国产精品久久久久久久久搜平片 | 午夜精品视频免费在线观看 | 国产午夜三级一区二区三桃花影视 | 国产精品久久久毛片 | 00av视频| 精品国产123 | 欧美精品首页 | 久久激情视频 久久 | 欧美91成人网 | 天天碰天天操视频 | 黄色av三级在线 | 日日摸日日添夜夜爽97 | 麻豆91精品视频 | 欧美精品三级在线观看 | 中文字幕在线不卡国产视频 | 免费精品视频在线 | 国产成人在线看 | 3d黄动漫免费看 | 在线播放日韩 | 国产伦精品一区二区三区免费 | 91激情视频在线 | 91在线最新 | 日韩精品一区不卡 | 色99在线 | 中文字幕在线看片 | 国产精品一区二区在线免费观看 | 久久99久久99精品免费看小说 | 91成版人在线观看入口 | 悠悠av资源片 | 中文字幕日韩免费视频 | 丁香狠狠| 中文日韩在线视频 | 精品国产免费观看 | 国产精品扒开做爽爽的视频 | 久久久午夜视频 | 国产99精品 | 亚洲精品乱码久久久久v最新版 | 在线有码中文字幕 | 成人免费观看完整版电影 | 99av在线视频 | 国产精品二区在线观看 | 欧美综合国产 | 免费在线国产黄色 | 久久网站免费 | 9在线观看免费高清完整版在线观看明 | 91成人黄色| 视频在线一区二区三区 | 成人a视频片观看免费 | 黄色一级免费网站 | 精品国产aⅴ麻豆 | 在线播放视频一区 | 99热在线免费观看 | a电影在线观看 | 岛国片在线 | 国产99在线免费 | 99精品成人 | 国产午夜精品免费一区二区三区视频 | 精品一区二三区 | 一本一道久久a久久综合蜜桃 | 一区二区电影在线观看 | 在线观看精品黄av片免费 | 国产成人一区三区 | 99热官网| 天天摸天天操天天舔 | 悠悠av资源片 | 激情视频一区二区 | www.av在线播放 | av性网站 | 久久久亚洲精华液 | 国产精品va在线 | 欧美日韩不卡在线观看 | 少妇高潮冒白浆 | 免费高清影视 | 欧美激情视频三区 | 精品福利视频在线观看 | 手机看片| www.国产在线观看 | 国产高清免费在线观看 | 久久精品久久精品久久精品 | 中文字幕888 | 亚洲高清91 | 999久久久精品视频 日韩高清www | 天天综合操 | 免费看麻豆| 91在线精品秘密一区二区 | 手机成人免费视频 | 波多野结衣电影一区二区三区 | 欧美 激情 国产 91 在线 | 一区二区三区影院 | 亚洲精品h | 久久福利精品 | 国产亚洲久一区二区 | 国产一级片在线播放 | 国产精品麻豆欧美日韩ww | 久久成年人网站 | 公与妇乱理三级xxx 在线观看视频在线观看 | 国产精品21区 | 国产免费不卡 | 久久成人综合 | 久草视频看看 | 日产中文字幕 | 日日爱av| 九九久久国产 | 91人人爱 | 中文字幕首页 | 丁香激情综合 | 日韩高清免费观看 | 日韩电影中文字幕在线 | 久久一区二区三区日韩 | a天堂最新版中文在线地址 久久99久久精品国产 | 精品视频在线观看 | 97热在线观看 | 绯色av一区 | 美女视频黄色免费 | 九九欧美视频 | 免费看成人 | 久久激情五月婷婷 | 成年在线观看 | 日韩四虎| 五月亚洲婷婷 | 男女免费av| 国产香蕉视频在线观看 | 久久综合九色综合97_ 久久久 | 久久综合久久综合久久 | 国产免费中文字幕 | 久久久久久高潮国产精品视 | 久久久精品网站 | 香蕉成人在线视频 | 国产免费人人看 | 日日干精品 | 国产成人不卡 | 一区二区三区精品久久久 | 日日夜夜天天久久 | 黄色小网站在线观看 | 91精品电影 | 亚洲黄色av网址 | 日本黄色大片免费看 | 日韩综合一区二区三区 | 伊人成人久久 | 日韩视频www| 96久久 | 久久99国产精品免费网站 | 日韩电影一区二区三区在线观看 | 国产伦理一区 | 国产免费观看高清完整版 | 精品中文字幕在线 | 免费国产视频 | 国产精品午夜久久 | 国产亚洲精品成人av久久ww | 日韩欧美一区二区三区在线观看 | 激情五月网站 | 精品视频123区在线观看 | 99久久99视频| 欧美性生活久久 | 韩日精品在线 | 18+视频网站链接 | 一区免费观看 | 欧美成年黄网站色视频 | av黄色在线| 成人av资源站| 婷婷网站天天婷婷网站 | 免费欧美高清视频 | av短片在线观看 | 在线草 | 五月婷婷网站 | 欧美三级高清 | 91大神免费在线观看 | 亚洲国产精品激情在线观看 | 99这里只有精品视频 | 欧美日韩69 | 久久免费黄色 | se婷婷 | 高清国产午夜精品久久久久久 | 久久人人97超碰国产公开结果 | 久久一区二区三区超碰国产精品 | 国产精品永久在线观看 | 日本三级吹潮在线 | 久久国内精品 | 免费日韩 精品中文字幕视频在线 | 五月婷婷丁香综合 | 91av电影| 97超碰人人看 | 国产网站在线免费观看 | 久久不色 | 天天插天天 | 日本黄区免费视频观看 | 人人精品 | 久久久久一区二区三区四区 | 国产盗摄精品一区二区 | 国产精品久久久久久久久久久不卡 | 99热99re6国产在线播放 | 久草视频资源 | 亚洲激色 | 日韩av看片| 综合网五月天 | 国产资源网 | 亚洲黄色免费网站 | 日韩av中文在线观看 | 中文字幕在线观看第三页 | 粉嫩av一区二区三区四区在线观看 | 91av电影在线| 亚洲影视资源 | 天天夜夜操 | 国产精品女主播一区二区三区 | 国产xvideos免费视频播放 | 免费av成人在线 | 欧美一二三专区 | 在线看不卡av | 中文字幕亚洲欧美 | 精品免费观看视频 | 中文字幕资源在线观看 | 精品国产_亚洲人成在线 | 国产资源| 欧美另类色图 | 久久久久久久久久久精 | 成人av在线播放网站 | 免费a视频在线 | 成年人黄色免费视频 | 色综合久久久久久中文网 | 九九99视频| 国产精品久免费的黄网站 | 99国产情侣在线播放 | 欧美日韩免费一区二区三区 | 久久手机看片 | 婷婷亚洲五月色综合 | 久久艹在线观看 | 视频91 | 国产手机精品视频 | 成人免费 在线播放 | 国产一区二区在线影院 | 日操干 | 香蕉视频网站在线观看 | 免费视频久久 | 99在线观看精品 | 亚洲电影图片小说 | 91精品欧美| 国产精品久久99综合免费观看尤物 | 日韩av影视在线观看 | 五月天婷亚洲天综合网精品偷 | 日韩久久久久久久久 | 91三级在线观看 | 国产三级国产精品国产专区50 | 欧美 高跟鞋交 xxxxhd | 少妇bbb好爽| 久久免费视频7 | 久久精品视频免费 | 久久久久国产精品视频 | 俺要去色综合狠狠 | 91麻豆精品国产91久久久无限制版 | 米奇影视7777 | 91在线91拍拍在线91 | 91在线视频免费观看 | 色91在线 | 日韩精品亚洲专区在线观看 | 在线观看黄a| 五月激情姐姐 | 国产一区二区三区高清播放 | 亚洲 综合 国产 精品 | 视频成人永久免费视频 | 日本精品久久久久 | 一级一级一片免费 | 国产在线综合视频 | 国产精品99久久久久久有的能看 | 欧美精选一区二区三区 | 国产99久久久国产 | 丁香视频全集免费观看 | 精品国产乱码一区二区三区在线 | 美腿丝袜一区二区三区 | 99在线精品免费视频九九视 | 精品不卡av | 99热官网| 天天色天天射综合网 | 久久精品国产一区二区 | 国产一区二区三区免费在线观看 | 欧美成人一区二区 | 亚洲国产精品久久久久久 | 色婷婷av在线 | 国产精品一区二区麻豆 | 国产精品久久一区二区三区不卡 | 久章草在线 | 欧美电影黄色 | 在线看v片 | 一级免费黄色 | 97免费中文视频在线观看 | 国产无套精品久久久久久 | 精品一区三区 | 国产破处精品 | 国产精品久久久久久久久久三级 | 狠狠色综合欧美激情 | 久久人人添人人爽添人人88v | 亚洲美女精品区人人人人 | 亚洲最大av网 | 亚洲综合视频在线观看 | 亚洲成人av片 | 天天干中文字幕 | 美女在线国产 | 国产精品一区二区久久久 | 91丨精品丨蝌蚪丨白丝jk | 成人av在线影院 | 1024手机基地在线观看 | 丁香五香天综合情 | 久久免费的精品国产v∧ | 天天射网 | 最新中文字幕视频 | 激情网站免费观看 | 99精品欧美一区二区蜜桃免费 | 日韩精品一区二区三区高清免费 | 人人添人人澡人人澡人人人爽 | 国产精品系列在线观看 | av.com在线| 日韩一区二区三区不卡 | 97福利社| 久久影视网| 美女免费网站 | 99视频这里有精品 | 精品在线不卡 | 91自拍91 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 最近免费中文字幕大全高清10 | 国内精品久久久久久久 | 中文av免费| 亚洲人久久| 欧美一区二区视频97 | www免费网站在线观看 | 日韩黄色av网站 | 高清av免费观看 | 国产中文字幕一区二区三区 | 嫩草伊人久久精品少妇av | 在线观看一级视频 | 国产拍揄自揄精品视频麻豆 | 东方av在线免费观看 | 国产午夜精品视频 | 国产精品第一视频 | 国产麻豆剧果冻传媒视频播放量 | 99re中文字幕 | 国产手机视频在线播放 | 国产精品久久久免费 | 亚洲1级片 | 久久久蜜桃一区二区 | 免费色av | 狠狠狠狠狠狠干 | 天天操狠狠操 | 最新av免费在线 | 日韩在线观看影院 | 国产色一区 | 在线免费观看不卡av | 国产视频一区在线播放 | 欧美激情在线看 | 日日草视频 | 欧美日韩精品久久久 | 久久草精品 | 国内精品视频一区二区三区八戒 | 夜夜骑天天操 | 天天艹 | 激情伊人五月天久久综合 | 玖玖玖在线观看 | 美女视频黄色免费 | 亚洲第一伊人 | 国产精品二区在线观看 | 亚洲精品黄 | 丁香六月中文字幕 | 精品视频免费播放 | 国产精品久久麻豆 | 美女视频黄是免费的 | www日| 亚洲免费在线 | 热99在线 | 日韩在线观看三区 | 亚洲最新在线视频 | 国产在线精品观看 | 日韩色中色 | 成年人黄色免费网站 | av中文字幕在线观看网站 | 久久区二区 | 午夜国产在线 | 国产精品久久久久久久午夜 | 日韩高清精品一区二区 | 久久久久伦理电影 | 超碰在线色 | 亚洲黄网址| 日韩欧美有码在线 | 日本午夜免费福利视频 | 日韩在线观看小视频 | 午夜国产福利在线观看 | 激情视频网页 | 日韩狠狠操 | 成人动漫一区二区 | 国内丰满少妇猛烈精品播 | 91免费在线播放 | 欧美性色综合网站 | 国产性xxxx| 国产高清在线不卡 | 亚洲激情在线观看 | 国产黄色精品在线观看 | 操操综合网 | 成人毛片在线观看视频 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 久久精品国产一区二区电影 | 亚洲精品乱码久久久久久蜜桃91 | 久久免费国产 | 成人av资源网站 | 国内丰满少妇猛烈精品播放 | 色网站免费在线观看 | 久久午夜免费视频 | 久久久久久久久久免费 | 久综合网 | 亚洲成人精品久久 | 中文字幕av日韩 | 久草精品免费 | 亚洲爱视频 | 国产一区免费视频 | 西西444www大胆无视频 | 天天操天天操天天 | 久久99亚洲精品久久 | 亚洲国产成人精品久久 | 一区二区三区免费在线观看视频 | 免费在线观看av网址 | 一区二区三区在线视频观看58 | 国产日韩一区在线 | 成人精品视频久久久久 | 国产小视频在线看 | 国产日本亚洲高清 | 国产高清不卡一区二区三区 | 久久久久久久久久久成人 | 日日夜夜草 | 国产精品久久久久久久久免费 | 成人av电影在线 | 国产高清视频网 | 色 免费观看 | 久久亚洲综合色 | 国产精品专区在线 | 偷拍区另类综合在线 | 日韩乱色精品一区二区 | 亚洲成免费| 91亚洲精品久久久中文字幕 | 久久久999免费视频 日韩网站在线 | 日本黄色免费网站 | 免费特级黄毛片 | 五月激情婷婷丁香 | 久久电影色 | 一本一本久久aa综合精品 | 国产精品va | 亚洲成人精品在线 | 韩国三级在线一区 | 国产成人av在线 | 亚洲日本一区二区在线 | 亚洲精品在线免费 | 日韩欧美在线高清 | 日本三级国产 | 久热免费 | 国产中文字幕在线观看 | 国产精品不卡av | 在线视频18在线视频4k | 久草免费电影 | 国产精品第二十页 | 日韩大片免费在线观看 | 中文字幕一区二区三区四区视频 | 成人h视频在线播放 | 操高跟美女 | 亚洲午夜久久久影院 | 精品国偷自产国产一区 | 中文字幕免费一区二区 | 日韩精品视频免费 | av 一区二区三区四区 | 国产成人精品午夜在线播放 | 国产精品久久久久影视 | 国产精品高潮呻吟久久久久 | 久久久精品国产免费观看一区二区 | 久久久影院一区二区三区 | 91九色成人蝌蚪首页 | 日韩美精品视频 | 干亚洲少妇 | 嫩小bbbb摸bbb摸bbb | 在线最新av | 久久综合毛片 | 三级在线视频观看 | 精品中文字幕在线 | 视频一区二区在线观看 | 亚洲午夜精品久久久 | 免费日韩三级 | 精品国产成人在线 | 在线观看免费视频你懂的 | 午夜精品一区二区三区在线视频 | 国产a网站 | 女人18精品一区二区三区 | 国产综合精品一区二区三区 | 免费在线电影网址大全 | 国产69精品久久99不卡的观看体验 | 久久久免费播放 | 亚洲免费永久精品国产 | 国产成本人视频在线观看 | 日韩精品一区二区不卡 | 久草免费看| 国产视频精品免费播放 | 伊人永久在线 | 国产精品国产毛片 | 日本mv大片欧洲mv大片 | 91传媒在线 | 一本一道久久a久久综合蜜桃 | 黄毛片在线观看 | 国产成人精品一区二区三区在线 | 婷婷伊人网 | 日韩高清一二区 | 香蕉精品视频在线观看 | 91精品免费在线 | 看片一区二区三区 | 99视频99| 国产综合福利在线 | 手机av电影在线 | av电影免费在线看 | 91手机视频在线 | 国产99久久久国产精品成人免费 | 激情欧美一区二区三区免费看 | 国产一级视频在线免费观看 | 日韩在线观看免费 | 草久久久久久久 | 精品不卡视频 | 亚洲精品动漫成人3d无尽在线 | 成人av影视在线 | 国产精品黄网站在线观看 | 激情五月婷婷丁香 | 婷婷色网 | 3d黄动漫免费看 | 手机在线欧美 | 国产一区在线视频 | 久久久精品国产一区二区 | 欧美激情精品久久久久久变态 | 日本黄区免费视频观看 | 久久丁香| 99福利片 | 日韩精品视频在线观看网址 | 91黄色在线观看 | 久久久黄色av | 免费日韩视 | 99久久久久成人国产免费 | 少妇精品久久久一区二区免费 | 麻豆va一区二区三区久久浪 | 欧美日韩1区 | 久久精品一 | 免费高清男女打扑克视频 | 一级欧美日韩 | 国产黄色免费 | 久久网址| 91久久国产自产拍夜夜嗨 | 中文十次啦 | 波多野结衣亚洲一区二区 | 国产精品久久久久毛片大屁完整版 | 精品一区久久 | 欧美日韩一级在线 | 久久免费国产精品1 | 国产一级二级三级在线观看 | 婷婷激情站 | 六月色丁| 日韩黄色免费在线观看 | 日韩视频免费观看高清完整版在线 | 中文字幕亚洲不卡 | 18pao国产成视频永久免费 | www91在线观看| 超碰97国产精品人人cao | 国产成人精品久久二区二区 | 日韩特黄一级欧美毛片特黄 | 综合中文字幕 | 中文伊人 | 国产老妇av | 免费成人在线观看 | 中文在线免费看视频 | 美女视频免费精品 | 综合精品在线 | 国产亚洲久一区二区 | 午夜精品一区二区三区四区 | 免费成人黄色片 | 国产成人精品久久亚洲高清不卡 | 91在线www | 久久99爱视频 |