2010年3月3日水曜日

マジックナンバーは禁止

マジックナンバーとは何でしょうか? リーグ優勝で必要な勝利数のことだろうか? いえ、違います。 マジックナンバーとはプログラム中に書かれた具体的な数字のことです。

例えば
for(i=0;i<100;i++){
    x = i+1050
    y = i+1050+j;
    }
と言うプログラムがあったとします。 この場合、ループ内部の1050と言う数字二つとループを繰り返す100という数字がマジックナンバーに当たります。 これらは使用するとプログラムを他人が見た場合分かりにくくなります。 何故、マジックナンバーがいけないのか?  例えば、初めにプログラムを書いた人は1050という二つの値は同じ物という認識でいたとします。 しかし、他人が見た場合、二つの1050と言う値は違う意味を示すが、たまたま同じになっていると認識してしまうかも知れません。  また、さらに別の人がプログラムを修正した場合、一つの1050と言う値だけを変更し、もう一つの値を変更し忘れてしまう可能性があります。 で、どのように書けば良いのか?
a=1050;
b=100;
for(i=0;i<b;i++){
    x = i+a
    y = i+a+j;
    }
とこのように書くのが良いと思います。これであればaという変数を使っていれば、同じ値であるという事は誰が見てもわかります。 プログラムを見た目で分かるようにしておくとドキュメントも減らせ、後から見る人の苦痛も和らぐと思います。

パラノイアには注意
 でも、盲目的にマジックナンバーを潰すことは避けてください。 これをやると分かりやすいプログラムを書くどころか、神経が参ってしまいます。以下の基準でマジックナンバーを潰すと良いと思います。
  • 同じ意味合いの文字(今回の例である1050など)は一つの定数に置き換える。
  • ループさせる場合は極力配列から要素数を取得するようにし、マジックナンバーを使う
  • 二値判定の場合0,1でなくfalse,trueが使えないか確認する。
潰さなくても良いところ(アレンジして使ってください)
  • ループの始まりの0(ゼロ)
  • 一度しか使わない変数で、これから変更する予定も無い物
  • 仕様上 始まりが0ではなく1から始まる関数へデータを渡す場合の+1
などはそのままマジックナンバーを書いておく方が分かりやすいと思います。

0 件のコメント:

コメントを投稿