« 【メモ】perlの変数スコープ | トップページ | Fillfactorの設定値 »

2014.01.31

マジックナンバーへの対処法

プログラムを書いている中で、『マジックナンバーを使わない』という規約を使ったプロジェクトに参加することも近年では割合あるんじゃないだろうか。
良いことですね。

ただ、
 マジックナンバーを使わない=定数を使う
という実装方法が主眼になるあまり、なぜマジックナンバーがいかんのか、という視点が抜け落ちたプログラムを見てこけっとなることもしばしば・・・・

最近見たソースでそんな疑問をすごくいだいたのが下記のような処理。

IF(a == constants.INTEGER_ONE){     //処理 }
というような処理。 INTRGER_ONE定数の中身がint型の1であろう、ということは想像がつくのだが、正直「だから何?」と思われるんでないだろうか?

この変数aについては1が真、0が偽を表す、と内部的には定義してあったらしいが、であればなおさらboolean型に定義して、isで処理すべき・・・・
おそろしいのはこのINTEGER_ONE定数は、int型の1である、という意味しかもってないので、整数値の1が要求される場面ではいつも違う意味として登場するのである。

同一プログラム内であったのが

for(i=INTEGER_ZERO; i < INTEGER_FIVE; i++){
    //処理
}

いやその、5回ループをしたいんだろうけど、その5回ってどこから来たロジックなの?
これって、マジックナンバー対策効果になってるの?
for(i=0; i < 5; i++)

と書いてくれたほうが直感的にわかりやすいんだけど・・・
もちろん本当であればINTEGER_FIVEの変わりに何をループさせるのかが明確に想像できる変数や定数を使うほうが良いのは間違いないことではあるが。

極めつけは

tax = (amount * INTEGER_FIVE) / INTEGER_HUNDRED

・・・・消費税計算がしたかったらしいです。。。。
システムハンガリアン同様、形式から入るとこんな結果になるという、バッドデザインパターンということで……


<追記>
超同感です。
[迷信] ソースコード中の即値を全廃せよ



|

« 【メモ】perlの変数スコープ | トップページ | Fillfactorの設定値 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2022/59042703

この記事へのトラックバック一覧です: マジックナンバーへの対処法:

« 【メモ】perlの変数スコープ | トップページ | Fillfactorの設定値 »