低質量軟體程式設計產生的成本價格細目表

發表於2013-09-08

注意:下面這個清單裡描述的事情並不是你絕對不能做的,它只是用量化的方法來讓你知道程式設計上的這些做法將會產生的負面代價。

這些費用是在程式碼審查時你將要付出的。

blue-screens1-800x450
不遵守編碼風格

費用: $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”實際上是“f**k”你的同事。

 

無意義的命名

費用: $50/程式碼審查者的疑惑
一定要努力努力好好給程式碼命名。當系統有變化時及時修改、改進你的命名。當發現有更好的名稱時,不要等待,立即換掉。

 

靜態方法或類方法

費用: $50/個
Ruby裡的類方法具有可變全域性狀態。想辦法重構它們。

 

不必要的屬性狀態變化

費用: $100/變化
與其修改一個現有的記錄,不如建立一個新的,或return一個。與其刪除,不如做標記。Rich Hickey 對此有一些你值得一讀的思考。

 

一個類有多個職責

費用: $200/額外職責
一個類應該只有一個職責或目的。幾乎沒有人因為使得類太小而出錯。鑑於此,你的類很可能太大。

 

重複的程式碼

費用: $500
程式設計中幾乎沒有任何原則你必須遵守的,但避免程式碼重複是個例外。程式碼複製給維護造成困難,嚴重影響程式碼質量。

 

重複的測試程式碼

費用: $500
測試程式碼並不是產品程式碼的次要附屬物。它們的質量同等重要。更嚴重的:維護一個糟糕的測試套件程式碼可能會讓你欲哭無淚。

 

未經測試的程式碼

費用: $1,000/行
未經測試的程式碼自誕生之時起就成了負擔。這樣做很不專業。

 

感謝Paul Graham先生的“On Lisp”,本文是受他的在某些函式上收稅的想法而啟發。

相關文章