為什么不允許代碼里出現“魔數”

jopen 9年前發布 | 11K 次閱讀 Java Java開發

在一個新項目中,我最先做的事情之一,就是建立使用諸如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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!