低質量軟件編程產生的成本價格細目表
英文原文:How much should global variables cost?
注意:下面這個清單里描述的事情并不是你絕對不能做的,它只是用量化的方法來讓你知道編程上的這些做法將會產生的負面代價。
這些費用是在代碼審查時你將要付出的。
不遵守編碼風格
費用: $0.02
代碼庫中的程序編碼風格一致雖然不是很重要,但值得你去遵守。
在提交代碼的說明信息上偷懶
費用: $0.50
這主要是為了以后的查找。請細讀這篇代碼提交說明信息指導(英文)。
使用局部變量
費用: $1.00
大多數的局部變量都最好使用方法代替。注意:代碼塊參數除外。
多于一行的方法
費用: $1.50
對多于一行代碼的方法要保持高度警惕。
超過 5 行的方法
費用: $3.00
一個方法應該只做一個事情。一個事情應該用不了 5 行代碼就能完成。
很長的類
費用: $5.00
根據童子軍(Boy Scout)法則:同性戀應該被禁止。哦,不,是另外一條:盡量只留下你會用到的代碼。當你遇到一個比較長的類時,花點功夫精簡它們。
使用魔幻數字
費用: $7.00
在代碼中你只可以使用兩個數字:0 和1。其它的都應該用具有名字的常量代替。
在條件判斷中使用`` 或 `&&`
費用: $7.00
當你發現有 `if foo && bar` 時,把它提取到一個方法里,用來說明`foo && bar` 究竟是什么意思。
使用 case 或 switch 語句
費用: $15
一個 swith 語句基本上不是只做一個事情。它通常還會牽涉到其它類。
傳遞布爾參數
費用: $15
依賴布爾參數的程序流轉叫做控制耦合,這是一種完全不應該的高耦合。
類名用 Manager 結尾
費用: $30
“Manager”是一個很含糊的詞,傳達不了任何意思。使用它,很有可能你的類承擔了過多的責任。
過度使用附加支持
費用: $10/object created
盡量簡化你測試時需要的附加支持工具。如果能用臨時對象代替,就避免使用數據庫。
測試中屏蔽某些功能
費用: $10/屏蔽的方法
如果你在測試 Foo 類,你就不應該屏蔽或短路 Foo 中的任何方法。你越想這樣做,越說明你需要從 Foo 中把這些功能提煉出來放到其它地方。
在數據庫中觀察集成測試效果
費用: $20
集成測試應該通過 UI 來驗證。不要去窺探數據庫。
注釋
費用: $200/行
一千個注釋中頂多只有一條有合理存在的理由。其它的你應該改進代碼,直到不需要注釋。
注釋中包含 TODO 或 FIXME
費用: $500/行
我不在意代碼分支中存在不多的 TODO 注釋,但絕對不要把它們合并的代碼庫中。“FIXME”實際上是“fuck you”你的同事。
無意義的命名
費用: $50/代碼審查者的疑惑
一定要努力努力好好給代碼命名。當系統有變化時及時修改、改進你的命名。當發現有更好的名稱時,不要等待,立即換掉。
靜態方法或類方法
費用: $50/個
Ruby 里的類方法具有可變全局狀態。想辦法重構它們。
不必要的屬性狀態變化
費用: $100/變化
與其修改一個現有的記錄,不如創建一個新的,或 return 一個。與其刪除,不如做標記。Rich Hickey 對此有一些你值得一讀的思考。
一個類有多個職責
費用: $200/額外職責
一個類應該只有一個職責或目的。幾乎沒有人因為使得類太小而出錯。鑒于此,你的類很可能太大。
重復的代碼
費用: $500
編程中幾乎沒有任何原則你必須遵守的,但避免代碼重復是個例外。代碼復制給維護造成困難,嚴重影響代碼質量。
重復的測試代碼
費用: $500
測試代碼并不是產品代碼的次要附屬物。它們的質量同等重要。更嚴重的:維護一個糟糕的測試套件代碼可能會讓你欲哭無淚。
未經測試的代碼
費用: $1,000/行
未經測試的代碼自誕生之時起就成了負擔。這樣做很不專業。
感謝 Paul Graham 先生的“On Lisp”,本文是受他的在某些函數上收稅的想法而啟發。