為什麼不允許程式碼裡出現“魔數”

edithfang發表於2015-01-25
遲早會有人給出案例說這樣太離譜了。其中的一個案例是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
相關閱讀
評論(1)

相關文章