編碼檢查 表
總結 了《 Writing Clean Code 》的所有 觀 點,教你 編 寫整 潔 無 錯 的代 碼 。使用本表的最好 辦 法是花兩週 時間評審 一下你的 設計 和 編碼實現 。先花幾分 鍾時間 看一看列表,一旦熟悉了 這 些 問題 ,就可以靈活自如地按它寫代 碼 了。此 時 ,就可以把表放在一 邊 了。
一般問題
── 你是否 爲 程序建立了 DEBUG 版本?
── 你是否將 發現 的 錯誤 及 時 改正了?
─一 你是否 堅 持 徹 底 測試 代 碼 .即使耽 誤 了 進 度也在所不惜?
── 你是否依靠 測試組爲 你 測試 代 碼 ?
─一 你是否知道 編碼 的 優 先 順 序?
─一 你的 編譯 程序是否有可 選 的各 種 警告?
關於將更改歸併到主程序
─一 你是否將 編譯 程序的警告(包括可 選 的)都 處 理了?
── 你的代 碼 是否未用 Lint
─一 你的代 碼進 行了 單 元 測試嗎 ?
─一 你是否逐 步 通 過 了 每 一條 編碼 路徑以 觀 察數據流?
─一 你是否逐 步 通 過 了 彙編語 言 層 次上的所有 關鍵 代 碼 ?
── 是否清理 過 了任何代 碼 ?如果是,修改 處經過徹 底 測試 了 嗎 ?
─一 文檔是否指出了使用你的代 碼 有危 險 之 處 ?
── 程序 維護 人 員 是否能 夠 理解你的代 碼 ?
每當實現了一個函數或子系統之時
─一 是否用斷言 證實 了函數參數的有效性?
─一 代 碼 中是否有未定 義 的或者無意 義 的代 碼 ?
─一 代 碼 能否 創 建未定 義 的數據?
─一 有沒有 難 以理解的斷言? 對 它 們 作解 釋 了沒有?
─一 你在代 碼 中是否作 過 任何假 設 ?
─一 是否使用斷言警告可能出 現 的非常情況?
─一 是否作 過 防禦性程序 設計 ?代 碼 是否 隱 藏了 錯誤 ?
─一 是否用第二個算法來 驗證 第一個算法?
─一 是否有可用於確 認 代 碼 或數據的啓 動 ( startup ) 檢查 ?
─一 代 碼 是否包含了隨機行 爲 ?能消除 這 些行 爲嗎 ?
── 你的代 碼 若 產 生了無用信息,你是否在 DEBUG 代 碼 中也把它 們 置 爲 無用信息?
── 代 碼 中是否有稀奇古怪的行 爲 ?
── 若代 碼 是子系 統 的一部分,那 麼 你是否建立了一個子系 統測試 ?
── 在你的 設計 和代 碼 中是否有任意情況?
── 即使程序 員 不感到需要,你也作完整性 檢查嗎 ?
── 你是否因 爲 排 錯 程序太大或太慢,而將有價 值 的 DEBUG 測試 拋置一 邊 ?
── 是否使用了不可移植的數據 類 型?
─一 代 碼 中是否有 變 量或表達式 產 生上溢或下溢?
── 是否準確地 實現 了你的 設計 ? 還 是非常近似地 實現 了你的 設計 ?
── 代 碼 是否不止一次地解同一個 問題 ?
── 是否企 圖 消除代 碼 中的 每 一個 if 語 句?
── 是否用 過 嵌套?:運算符?
── 是否已將 專 用代 碼 孤立出來?
── 是否用到了有 風險 的 語 言 慣 用 語 ?
─一 是否不必要地將不同 類 型的運算符混用?
── 是否 調 用了返回 錯誤 的函數?你能消除 這種調 用 嗎 ?
─一 是否引用了尚未分配的存 儲 空 間 ?
─一 是否引用已 經釋 放了的存 儲 空 間 ?
── 是否不必要地多用了 輸 出 緩 衝存 儲 ?
── 是否向靜 態 或全局 緩 衝區 傳 送了數據?
── 你的函數是否依 賴 於另一個函數的內部 細節 ?
── 是否使用了怪異的或有疑 問 的 C 慣 用 語 ?
── 在代 碼 中是否有 擠 在一行的毛病?
── 代 碼 有不必要的靈活性 嗎 ?你能消除它 們嗎 ?
─一 你的代 碼 是 經過 多次“ 試 着”求解的 結 果 嗎 ?
─一 函數是否小並容易 測試 ?
每當設計了一個函數或子系統後
─一 此特徵是否符合 產 品的市 場 策略?
─一 錯誤 代 碼 是否作 爲 正常返回 值 的特殊情況而 隱 藏起來?
─一 是否 評審 了你的界面,它能保 證難 於出 現誤 操作 嗎 ?
─一 是否具有多用途且面面 俱 到的函數?
─一 你是否有太靈活的(空空洞洞的)函數參數?
─一 當你的函數不再需要 時 ,它是否返回一個 錯誤 條件?
─一 在 調 用點你的函數是出易 讀 ?
─一 你的函數是否有布 爾 量 輸 入?
修改錯誤之時
── 錯誤 無法消失,是否能找到 錯誤 的根源?
─一 是修改了 錯誤 的真正根源, 還 是 僅僅 修改了 錯誤 的症狀?