读程序设计实践
風(fēng)格
全局變量用具有描述意義的名字,局部變量用短名字。
保持一致性。
函數(shù)采用動作性的名字。
要準(zhǔn)確。
以縮行形式顯示程序結(jié)構(gòu)。
使用表達(dá)式的自然形式。
利用括號排除歧義。
分解復(fù)雜的表達(dá)式。
要清晰。
當(dāng)心副作用。
使用一致的縮行和加括號風(fēng)格。
為了一致性,使用習(xí)慣用法。
用 else-if 處理多路選擇。
避免使用函數(shù)宏。
給宏的體和參數(shù)都加上括號。
給神秘的數(shù)起個名字。
把數(shù)定義為常量,不要定義為宏。
使用字符形式的常量,不要用整數(shù)。
利用語言去計算對象的大小。
不要大談明顯的東西。
給函數(shù)和全局?jǐn)?shù)據(jù)加注釋。
不要注釋不好的代碼,應(yīng)該重寫。
不要與代碼矛盾。
澄清情況,不要添亂。
界面
隱蔽實現(xiàn)的細(xì)節(jié)。
選擇一小組正交的基本操作。
不要在用戶背后搞小動作。
在各處都用同樣方式做同樣的事。
釋放資源與分配資源應(yīng)該在同一層次進(jìn)行。
在低層檢查錯誤,在高層處理。
只把異常用在異常的情況。
排錯
尋找熟悉的模式。
檢查最近的改動。
不要兩次犯同樣錯誤。
現(xiàn)在排除,而不是以后。
取得堆棧軌跡。
鍵入前仔細(xì)讀一讀。
把你的代碼解釋給別人。
把錯誤弄成可以重現(xiàn)的。
分而治之。
研究錯誤的計數(shù)特性。
顯示輸出,使搜索局部化。
寫自檢測代碼。
寫記錄文件。
畫一個圖。
使用工具。
保留記錄。
測試
測試代碼的邊界情況。
測試前條件和后條件。
使用斷言。
做防御性程序設(shè)計。
檢查錯誤的返回值。
以遞增方式做測試。
首先測試最簡單的部分。
弄清所期望的輸出。
檢驗?zāi)切?yīng)當(dāng)保持的特征。
比較相互獨立的實現(xiàn)。
度量測試的覆蓋面。
自動回歸測試。
自動計時測量。
使用輪廓程序。
集中注意熱點。
畫一個圖。
使用更好的算法或數(shù)據(jù)結(jié)構(gòu)。
讓編譯程序做優(yōu)化。
調(diào)整代碼。
不要優(yōu)化無關(guān)緊要的東西。
收集公共表達(dá)式。
用低代價操作代替高代價操作。
鋪開或者刪除代碼。
緩存頻繁使用的值。
寫專用的存儲分配程序。
對輸入輸出做緩沖。
特殊情況特殊處理。
預(yù)先算出某些值。
使用近似值。
在某個低級語言里重寫代碼。
使用盡可能小的數(shù)據(jù)類型以節(jié)約存儲。
不存儲容易重算的東西。
可移植性
盯緊標(biāo)準(zhǔn)。
在主流中做程序設(shè)計。
警惕語言的麻煩特性。
用多個編譯系統(tǒng)試驗。
使用標(biāo)準(zhǔn)庫。
只使用到處都能用的特征。
避免條件編譯。
把系統(tǒng)依賴性局限到獨立文件里。
把系統(tǒng)依賴性隱藏在界面后面。
用正文做數(shù)據(jù)交換。
數(shù)據(jù)交換時用固定的字節(jié)序。
如果改變規(guī)范就應(yīng)該改變名字。
維護(hù)現(xiàn)存程序與數(shù)據(jù)的相容性。
不要假定是 A S C I I。
不要假定是英語。
全局變量用具有描述意義的名字,局部變量用短名字。
保持一致性。
函數(shù)采用動作性的名字。
要準(zhǔn)確。
以縮行形式顯示程序結(jié)構(gòu)。
使用表達(dá)式的自然形式。
利用括號排除歧義。
分解復(fù)雜的表達(dá)式。
要清晰。
當(dāng)心副作用。
使用一致的縮行和加括號風(fēng)格。
為了一致性,使用習(xí)慣用法。
用 else-if 處理多路選擇。
避免使用函數(shù)宏。
給宏的體和參數(shù)都加上括號。
給神秘的數(shù)起個名字。
把數(shù)定義為常量,不要定義為宏。
使用字符形式的常量,不要用整數(shù)。
利用語言去計算對象的大小。
不要大談明顯的東西。
給函數(shù)和全局?jǐn)?shù)據(jù)加注釋。
不要注釋不好的代碼,應(yīng)該重寫。
不要與代碼矛盾。
澄清情況,不要添亂。
界面
隱蔽實現(xiàn)的細(xì)節(jié)。
選擇一小組正交的基本操作。
不要在用戶背后搞小動作。
在各處都用同樣方式做同樣的事。
釋放資源與分配資源應(yīng)該在同一層次進(jìn)行。
在低層檢查錯誤,在高層處理。
只把異常用在異常的情況。
排錯
尋找熟悉的模式。
檢查最近的改動。
不要兩次犯同樣錯誤。
現(xiàn)在排除,而不是以后。
取得堆棧軌跡。
鍵入前仔細(xì)讀一讀。
把你的代碼解釋給別人。
把錯誤弄成可以重現(xiàn)的。
分而治之。
研究錯誤的計數(shù)特性。
顯示輸出,使搜索局部化。
寫自檢測代碼。
寫記錄文件。
畫一個圖。
使用工具。
保留記錄。
測試
測試代碼的邊界情況。
測試前條件和后條件。
使用斷言。
做防御性程序設(shè)計。
檢查錯誤的返回值。
以遞增方式做測試。
首先測試最簡單的部分。
弄清所期望的輸出。
檢驗?zāi)切?yīng)當(dāng)保持的特征。
比較相互獨立的實現(xiàn)。
度量測試的覆蓋面。
自動回歸測試。
建立自包容測試。
自動計時測量。
使用輪廓程序。
集中注意熱點。
畫一個圖。
使用更好的算法或數(shù)據(jù)結(jié)構(gòu)。
讓編譯程序做優(yōu)化。
調(diào)整代碼。
不要優(yōu)化無關(guān)緊要的東西。
收集公共表達(dá)式。
用低代價操作代替高代價操作。
鋪開或者刪除代碼。
緩存頻繁使用的值。
寫專用的存儲分配程序。
對輸入輸出做緩沖。
特殊情況特殊處理。
預(yù)先算出某些值。
使用近似值。
在某個低級語言里重寫代碼。
使用盡可能小的數(shù)據(jù)類型以節(jié)約存儲。
不存儲容易重算的東西。
可移植性
盯緊標(biāo)準(zhǔn)。
在主流中做程序設(shè)計。
警惕語言的麻煩特性。
用多個編譯系統(tǒng)試驗。
使用標(biāo)準(zhǔn)庫。
只使用到處都能用的特征。
避免條件編譯。
把系統(tǒng)依賴性局限到獨立文件里。
把系統(tǒng)依賴性隱藏在界面后面。
用正文做數(shù)據(jù)交換。
數(shù)據(jù)交換時用固定的字節(jié)序。
如果改變規(guī)范就應(yīng)該改變名字。
維護(hù)現(xiàn)存程序與數(shù)據(jù)的相容性。
不要假定是 A S C I I。
不要假定是英語。
總結(jié)