爲什麼不允許代碼裏出現“魔數”

  在一個新項目中,我最先做的事情之一,就是建立使用諸如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、(這是我在大多數討論中沒有列出的論據)我只是不想去思考它,也不想讓別人思考它。我見過數十個,很可能上百個例子,一個恰當命名的常量會極大地幫助理解一段代碼。我很少看到它損害可讀性的例子,並且沒有一個會嚴重損害可讀性。
  注意:僅僅因爲它是一個常量,並不意味着它必須被公開,包括類級別的字段。如果它只用在一個單獨的方法中,使用局部變量就夠了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章