Code Complete部分筆記

妎妎發表於2017-07-17

Ch 7. 高質量的子程式
1) 子程式(函式,過程)應具有良好的內聚性,專注於做一件事情。
2) 應有一套子程式的命名規則。
3) 子程式之間儘可能正交,降低耦合度。
4) 子程式的引數應該呈現出一致的抽象性。
5) 引數應有統一的順序:輸入引數,可變引數,輸出引數(儘量不超過7個)。
6) 每個分支都應有正確的返回值。

Ch 8. 防正規化程式設計(部分)
1) 子程式應該檢查引數,保護自己。
2) 使用斷言式程式設計(assert),並注意前條件和後條件。
3) 新增輔助除錯的程式碼。

Ch 10. 使用變數的一般注意事項
1) 變數的宣告和初始化位置應緊靠其第一次使用的位置。
2) 計數器和累加器在使用之前應進行初始化。
3) 將變數的引用點集中,使其跨度儘量小。
4)變數的繫結時間儘可能晚。

Ch 12. 基本資料型別
1) 避免使用magic number.
2) 考慮除零錯誤。
3) 避免混合型別的比較。
4) 整數除法得到整數。
5) 避免數量級差距太大資料的運算。
6) 中間資料的溢位。
7) 對浮點做等量比較。

Ch 14. 組織直線型程式碼
1)程式碼應體現語句間的依賴關係。
2)相關的語句應被組織在一起。
3)儘量避免寫出需要上下跳躍閱讀的程式碼。

Ch 15. 使用條件語句
1)正常情況應放在if裡。
2)應把複雜的條件判斷封裝在布林函式裡。
3)最後應用else反映出其他情況。

Ch 16. 迴圈控制
1)在合適的情況下用while取代for迴圈。
2)把內務處理集中放在迴圈開頭或尾部。
3)內部程式碼不應修改迴圈下標。
4) 下標名要有意義,避免串話。
5)在合適的情況下建立安全計數器。
6) 保證迴圈在任何情況下都能夠退出。

Ch 18. 表驅動法
1)把複雜邏輯或高消耗運算轉換為查表的方式非常好。
2)直接訪問表:直接構造陣列。
3)索引訪問表:先訪問key再訪問實際表項。
4)階梯訪問表:適用於範圍型鍵值的對映,用陣列構造階梯,對陣列遍歷實現對映。

Ch 19. 一般控制問題
1)用true和false,而不用1和0。
2)按照數軸順序編寫判斷。
3)馴服多重巢狀(to be done)。

Ch 25. 程式碼調整策略
1) 減少程式與作業系統間的互動來提高效能。
2) 減少I/O來提高效能。
3) 用量化的方法找出程式的效能瓶頸。

Ch 26. 程式碼調整方法
26.1(邏輯):
a) 知道答案後停止求值,比如短路求值。
b) 按照出現頻率的大小來調整判斷順序。
c) 用表驅動法代替複雜的表示式。
d) 惰性求值,在需要用到是在進行求值。
26.2(迴圈):
a)把條件判斷提出迴圈(常常會破壞程式碼的可維護性)。
b)將兩個獨立的迴圈合併(副作用同上)。
c)展開迴圈,包括完全展開和不完全展開。
d)將迴圈內部的不變數提出來,避免重複計算。
e) 哨兵值,將需要尋找的值放在陣列末尾,這樣可以同時判斷是否找到和是否到了陣列末尾。
f) 把迭代次數最多的迴圈放在最裡面。比如外部迴圈100次,內部迴圈5次,則一共需要100+100*5 = 600次,而顛倒順序後只需要5+100*5 = 505次。
g) 削減計算強度,用低強度的計算(比如加減)來代替花費高昂的運算(比如乘除)。
26.3 (資料變換):
a) 在合適的情況下儘量使用整型。
b) 在合適的情況下儘量使用低維陣列。
c) 使用快取機制。
26.4(表示式):
a)使用複雜代數式的恆等形式。
b)削減計算強度。
c)編譯器初始化。
d)在不求精度的情況下,可以不採用精度高但運算緩慢的系統函式、標準庫函式。
26.5(子程式):
a) 宣告為行內函數,但是在現代計算機上節約的開銷不明顯。
26.6(用低階語言重寫程式碼):

相關文章