為什么不允許代碼里出現“魔數”
在一個新項目中,我最先做的事情之一,就是建立使用諸如Checkstyle和Findbugs之類工具的準則。目的是制定一些代碼規范,以及避免通過靜態代碼分析就能夠檢測到的bug。
遲早會有人給出案例說這樣太離譜了。其中的一個案例是Checkstyle的魔數檢查。它會對任何沒有定義常量就使用的數字字面量給出警告,除了-1、0、1和2。
很多開發者在這個檢查方面都有問題,這可以從結果代碼中看到。我看到過這樣的代碼:
private static final int FOUR = 4;
以及
private static final int FOUR = 5;
和我最喜歡的(我可不會這么做!)
firstname = rs.getString(1); lastname = rs.getString(2); city = rs.getString(2 + 1); zip = rs.getString(2 + 2); country = rs.getString(2 + 2 + 1);
但是還有另一個引發討論的不同案例。它是關于顯而易見的常量,如把小數轉換成百分比的100,或者在字節數和Kb數之間轉換的1024。一些人認為它們不是魔數(或者不是那么糟糕的魔數),因為它們的含義很明顯并且不會改變。
關于這一點我不同意。而且,任何時候我都會把它們寫成常量。下面是原因:
1、 它的含義不是顯而易見的。value*100是什么意思?是把一個小數轉換成百分數?還是把一個以米為單位的長度,轉換成厘米?或者是一個數乘以g*g的 粗略近似數,其中g是地球上的重力加速度?又或者是我把某個數乘以一個數組的長度,而長度恰好是100?說不清楚。使用一個恰當名稱的常量就能搞定。
2、是的,我承認大多數這樣的常量不會改變。但是定義常量(方法、類)的目的不(僅僅)是為了后面的變化,而是為了更容易閱讀、理解和推理。因此在未來值是否會改變的問題是完全不相干的。
3、(這是我在大多數討論中沒有列出的論據)我只是不想去思考它,也不想讓別人思考它。我見過數十個,很可能上百個例子,一個恰當命名的常量會極大地幫助理解一段代碼。我很少看到它損害可讀性的例子,并且沒有一個會嚴重損害可讀性。
注意:僅僅因為它是一個常量,并不意味著它必須被公開,包括類級別的字段。如果它只用在一個單獨的方法中,使用局部變量就夠了。
原文鏈接: dzone 翻譯: ImportNew.com - shenggordon
譯文鏈接: http://www.importnew.com/14627.html