1. 程式人生 > >代碼大全筆記:語句

代碼大全筆記:語句

語句 記錄 實現 rec 水平 衡量 處理 結果 計數

第14章,組織直線型代碼

14.1 必須有明確順序的語句

針對接口編程而不是針對實現編程,則要求接口沒有假定,或者假定很明顯。

1、 設法組織代碼,使依賴關系變得明顯。

2、 使子程序名稱能夠明顯的表示依賴關系。

3、 利用子程序參數明確表示依賴關系。

4、 用註釋對不清晰的依賴關系進行說明。

5、 用斷言或錯誤處理代碼來檢查依賴關系。

14.2 順序無關的語句

如果語句間沒有依賴關系,則可以根據第二標準來來判斷語句或代碼塊的順序:就近原則(Principle of proximity ) 。

1、 使代碼易於自上而下的閱讀。

2、 把相關的語句組織在一起。如果相關語句的管理性很強則要考慮形成一個新的子程序。

本章要點

1、 組織直線型代碼最主要的原則是按照依賴關系進行排列。

2、 可以用好的子程序名,參數列表,註釋以及——如果代碼足夠重要——內務變量(類內部的狀態變量)來使依賴關系變得更加明顯。

3、 如果代碼之間沒有依賴關系,那就設法使相關的語句盡可能的接近。

第15章 使用條件語句

15.1 if 語句

簡單 if-then 語句:

1、 首先寫正常的代碼路徑,再處理不常見的情況。

2、 確保對於等量的分支是正確的。

3、 把正常的情況放在 if 後面而不是 else後面。

4、 讓 if 後面跟一個有意義的句子。

5、 考慮 else子句 有些規範要求 if 後面必須跟 else語句有助於促使程序員考慮 else的情況 。

6、 測試 else子句。

7、 檢查 if 和 else是否弄反了。

If-then-else 語句串:

1、 利用布爾函數調用簡化邏輯判斷 對於復雜的布爾判斷,用一個函數進行封裝。

2、 把常見的放在最前面。可以提高可讀性和性能。

3、 確保所有的情況都考慮到了。

4、 如果語言支持,將它更改為其他的結構。

15.2 case語句

為 case選擇最有效的排列順序:

1、 按字母或數字順序排序。

2、 把正常的情況放在前面。

3、 按執行頻率排列 case子句。

使用 case語句的訣竅:

1、 簡化每種情況對應的操作:使用函數。

2、 不要為了使用 case語句而構造一個費解的變量。

3、 把 default 語句只用於檢查真正的默認情況。

4、 利用 default 語句來檢查錯誤。在 c++和 Java中,避免代碼執行越過一條 case語句的結尾。

5、 在c++中,在 case末尾明確無誤的表明需要穿越執行的程序流程。

第16章 控制循環

16.1 選擇循環的種類

什麽時候使用 while 循環:

什麽時候使用帶退出的循環:

如果把循環條件放在開始或結束處,那就要寫一個半循環。 還要註意把所有的退出條件放在一起,避免將它寫的到處都是。帶退出的循環更容易理解。

什麽時候使用 for 循環:

不需要在內部控制循環, 循環條件是簡單的遞增或遞減。 如果更為復雜, 則要使用 while循環。

16.2 循環控制

防止循環錯誤的方法: 1)減少能夠影響該循環的各種因素的數量。 2)把循環體內部看做一個子程序,把循環控制放在循環體外部。

進入循環:

1、 只從同一個位置進入循環。

2、 把初始化代碼緊放在循環前面。就近原則主張把相關的語句放在一起。如果分開放置,在後期的維護過程中,對程序的更改容易產生錯誤。

3、 用 while(true)表示無限循環。

4、 在適當的情況下多使用 for 循環。For 循環將循環控制代碼集中在一處。 從而有助於形成可讀性強的代碼。

5、 在 while 循環更適用的時候,使用 while 循環。不要把和循環無關的代碼放在循環頭部。

處理好循環體:

1、 用{} 將循環體括起來。

2、 避免空循環。有時候如果把循環檢測和循環執行放在循環頭中,會出現這種情況。

3、 把循環內務操作(?循環的內務操作是指向 i++ ,j++之類的循環控制操作)要麽放在循環的開始,要麽放在循環的結尾。

4、 一個循環只做一件事情。

退出循環:

1、 設法確認循環可以終止。

2、 循環終止條件看起來很明顯。

3、 不要為了推出循環而胡亂的更改下標。為了獲得對循環更多的控制權,可以使用 while循環來實現。

4、 避免出現依賴於循環下標最終取值的代碼。 更好的具有自描述的做法是, 定義一個變量 ,將循環下標賦值給它。

5、 使用安全計數器:用於在如果循環過多會產生災難性後果的情況下使用。

提前退出循環:

1、 考慮在 while 循環中使用 break 語句而不是使用布爾標記。

2、 對循環中存在過多 break 語句的情況提高警惕。

3、 在循環開始處使用 continue,可以代替 if 判斷,提高可讀性。

4、 對 continue 和 break 的使用保持警惕。它會增加復雜度。

檢查端點:

使用循環變量:

1、 用整數或者枚舉類型表示數組和循環邊界。

2、 在嵌套循環中使用有意義的變量名來提高其可讀性。如果是你使用的二維或者多維的數組,也使用含有意義的變量來表示其數組名稱。避免使用 i,j,k 等無意義的名稱。

3、 用有意義的名字來避免循環下標串話。

4、 把循環變量的作用域限制於循環內部。

循環應該有多長:

1、 循環要盡可能的短,以便能夠一目了然。 嘗試“編寫簡單代碼的原則”,那麽會很少寫出超過20行的循環。一般的,一個函數在7行左右。

2、 把嵌套控制3層內。提取子程序來優化。

3、 把循環體內部的長的語句提取層一個子程序。

4、 要讓長循環格外清晰。

16.3 輕松創建循環——由內而外

先寫一個一般的過程,再把這個過程用循環代替。

本章要點

1、 循環很復雜,保持循環簡單將有助於別人閱讀你的代碼。

2、 保持循環簡單的技巧:避免使用詭異的循環,減少嵌套層次,讓入口和出口一目了然,把內務操作代碼放在一起。

3、 循環下標很容易濫用,因此命名要準確,並且把他們各自僅用於一個用途。

4、 仔細考慮循環,確認他在每一種情況下都可以運行正常,並且在沒一種情況下都可以退出循環。

第十七章,不常見的控制結構

謹慎的使用這些控制結構,將會獲得更多的幫助。

17.1 子程序中有多處返回

1、 如果能夠增強可讀性,那麽就是用 return。

2、 用防衛子句來簡化復雜的錯誤處理。

3、 減少子程序中 return 的數量。

17.2 遞歸

使用遞歸的技巧:

1、 確認遞歸能夠停止。

2、 使用安全計數器防止出現無窮遞歸。

3、 把遞歸限制在一個子程序中。

4、 留心棧空間。

5、 不要用遞歸計算階乘和斐波那契數列。

本章要點

多個 return 可以提高子程序的可讀性,同時避免產生很深的嵌套邏輯。

第十八章,表驅動法

表驅動法是一種編程模型(scheme)——從表中查找信息而不是使用邏輯語句(if或else)。

對於表驅動法一定要慎用。如果邏輯很復雜,導致邏輯判斷鏈很長,使用表驅動法有助於降低復雜度。否則,表驅動法只會增加復雜度。

18.1 表驅動法使用總則

使用表驅動法的兩個問題:

1、 如何從表中查詢條目。三種方法:直接訪問(Directory access) 表,索引訪問(Index access)表,階梯訪問( Stair-step access)表。

2、 表中要保存什麽。可能是數據,函數指針,對象實例等。

18.2 直接訪問表

靈活的消息格式:

這裏介紹了一個通用的表驅動法。核心的思想仍然是通過抽象,隔離變化,使變化的影響降低到最低,使代碼對變化是友好的。

構造查詢鍵值:

1、 復制信息從而能夠直接使用鍵值。

2、 轉換鍵值以使其能夠直接使用。對鍵值進行轉換,得到直接的索引值。這裏可以在增加一個新的查詢表。

3、 把鍵值轉換提取層單獨的子程序。

18.3 索引訪問表

18.4 階梯訪問表

基本思想:表中的記錄對於不同的數據範圍有效,而不是對不同的數據點有效。

註意細節:

1、 留心端點。

2、 考慮用二分查找代替順序查找。

3、 考慮用索引訪問代替階梯訪問。索引訪問速度快,占內存。階梯訪問速度慢,省內存。

4、 把階梯中的查詢操作提取成單獨的子程序。

本章要點

1、 表提供了一種復雜的邏輯和繼承結構的替代方案。如果你發現自己對某個程序的邏輯和繼承關系感到困惑時,那麽問問自己它是否可以通過一個查詢表來簡化。

2、 使用表的一項關鍵決策時如何去訪問表。你可以采取直接訪問,索引訪問,或者階梯訪問。

3、 使用表的另一項關鍵決策時把什麽內容放在表中。

把表驅動法寫成一個基礎庫。

第十九章,一般控制問題

19.1 布爾表達式

用 TRUE 和 FALSE 做布爾判斷。

簡化復雜的表達式:

1、 拆分復雜的判斷並引入 的布爾變量。

2、 把復雜的表達式做成布爾函數。

3、 用決策表代替復雜的條件。

編寫肯定形式的布爾表達式

1、 在 if 語句中,把判斷條件從否定形式轉化為肯定形式。並且互換 if 和 else中的代碼。

2、 用狄摩根定理簡化否定的布爾判斷——將 not a and not b ---> not ()

用括號使布爾表達式清楚

按照數值的順序編寫數值表達式

與 0 比較的指導原則:

1、 隱式的比較邏輯變量: if (!done)

2、 把數和 0 比較: if (balance != 0)

3、 在 c中顯示的比較字符和零終止符( ’\0 ’ )while (*charPtr != ‘0’)

4、 指針與 NULL 比較。

布爾表達式的常見問題

1、 在 c家族語言中,應該把常量放在比較的左端。

2、 在 Java中, a==b 表示 a和 b 是否引用同一個變量。

3、 a.equals(b)a和 b是否相同。

19.2 復合語句

if 後面即便是只有一條語句,也用括號括起來。

19.3 空語句

1、 小心使用空語句

2、 為空語句創建一個 DoNothing() 預處理宏或者內聯函數。

3、 使用非空的循環體進行優化。使用更加直截了當的編程方法。而不是自作聰明的使用循環的副作用。

19.4 馴服危險的深層嵌套

深層嵌套會降低程序的可讀性,增加復雜性。

避免的方法:

1、 重復檢查條件來簡化嵌套。把一個大的嵌套,更改為幾個小的嵌套。最外面的條件判斷是重復的。

2、 用 break 來簡化嵌套。不是一個很好的辦法。

3、 把嵌套 if 簡化為一組 if-then-else。

4、 把 if 轉換為 case

5、 把申請嵌套抽取出來放進單獨的子程序中。最好的一個方法。

6、 一個更面向對象的方法。用面向對象來代替復雜的嵌套

7、 重新設計深層嵌套的代碼:如果層次很深,則說明你對這一段代碼的理解不深刻。

19.5 編程基礎:結構化編程

結構化編程的三個組成部分:

1、 順序

2、 選擇

3、 叠代:循環

中心:任何一種控制流都可以由順序,選擇和叠代這三種結構生成。對於除這三種之外的任何控制結構—— break,continue ,return ,throw-watch ——都要持一種批判的態度。

19.6 控制結構與復雜度

程序復雜度的一個衡量標準:為了理解程序,你必須在同一時間記住的智力實體的數量。

控制流是程序復雜度的一個很重要的方面(其他的包括變量的個數) 。

對於任何規則的使用,都要記住:沒有絕對的真理,也沒有絕對的謬論。要具體情況具體分析,這才是設計的靈魂。絕對的真理讓我們盲從,絕對的謬論讓我們偏執。

如何度量復雜度:

計算機子程序中決策點數量的技術

1、 從 1 開始,一直往下通過程序。

2、 一旦遇到以下關鍵字,或者同類的詞,就加 1:if,while,repeat,fo

3、 給 case中的每一種情況加 1。

如何處理復雜度的度量結果:

1、 0—5:子程序可能還不錯。

2、 6—10:得想辦法優化。

3、 10+:把子程序的某一部分拆分成另外一個子程序並調用它。

其他類型的復雜度:

1、 所用的數據量。

2、 控制結構中的嵌套層次。

3、 代碼行數。

4、 對同一變量的先後引用之間的代碼行數(跨度) 。

5、 變量生存的代碼行數(生存期) 。

6、 輸入輸出的量

本章要點

1、 使布爾表達式簡單可讀,將有助於提高你的代碼質量。

2、 深層次的嵌套使得代碼難於理解,所幸的是,你可以相對容易的避免這麽做。

3、 結構化編程是一種簡單並且依然適用的思想,你可以通過把順序、選擇、循環三者結合起來而開發出任何程序。

4、 將復雜度降低到最低水平式編寫高質量代碼的關鍵。

代碼大全筆記:語句