マジックナンバー

LABO

はじめに

これは、社内で行ったプログラミングについての、ディスカッションの内容をまとめた物です。
そのため、たまに話し言葉になったり表記が揺れるかも知れませんがご容赦を。
たまに出てくるコードは説明のための疑似言語なので突っ込みは勘弁してください。

これは何だ?

たまに、プログラム解析していると唐突にこんな記述が出てくることがある。

_tanka = _tankaPerPound * 2.205;

ポンド(重量)単価に何か係数の様な物を掛けているのは分かるのだが、数字の意味が分からない。
こうなると「これは何の係数だ?」って設計書をひっくり返したり、プログラムの他の所で使ってないか探したり、推測したり…

この2.205の数字をマジックナンバーと呼んだりします。

この調べたり悩んだりする時間が、作業をしていると本当にもったいなのです。
もしこのプログラムを書いた人が、ちょっとでも自分以外の人が見るこに想像を働かせてくれたら。
このちょっとした気配りが、組織全体の生産性を上げてくれるのです。

せめて左側の変数の名前をこうしてくれていれば、ポンドに係数掛けてKg単価にしてるんだなと分かるんだが

_tankaPerKg = _tankaPerPound * 2.205;

まぁ、こんな事が日常茶飯事です。

これは仕方ない場合も多いのです。
こういったことが悪いと分かっているプログラマーでも、緊急に修正してとりあえず動かさなければならないとか言う場合は、近視眼的に対応してしまう事はあります。
いずれ直さないとならないと分かって居つつ、機会が無く埋没していく。
これは自分もあります。

私ならこんな感じにします。
左辺の変数名も変数の役割がわかる様に変え定数で定義します。

CONST POUND_TO_KG = 2.205;

_tankaPerKg = _tankaPerPound * POUND_TO_KG;

どうするか?

まだ開発開始前

困ったことに、気の利くプログラマな当たり前にマジックナンバーは回避する。
その為、コーディング規約に乗せるのも恥ずかしい。
なので、コーディングのアンチパターン集として初心者に配布しておくとかかなぁ…
やっぱり、日ごろの意識づけしかない気がします。
この活動もその意識づけの一つではあるので。

ちゃんと時間が取れるとき

マジックナンバーに名前をつけることです。
出来れば、定数化、ドメイン化が望ましい。
この辺はプロジェクト単位になると思うので、プロジェクト内で対応の仕方を決めておくといい。
どうしても時間がないときは、せめて一旦名前付き変数を定義したのちに数値を代入すると、わかりやすくなります。

ちょっと時間が取れないとき

どうしても忙しくて、定数化やドメイン化の対応まで手が回らない場合は、せめて数字の意味をコメント化しておく。
まぁ、この手間ができるならちゃんと定数なり名前つけろという話だけど

/* 2.205はポンドからKgに変換する係数 */
&Tanka = &TankaPerPond * 2.205

どすうればマジックナンバーを減らせるか

これは、やっぱりマジックナバーは恥ずかしいという意識を持つしか無い気がします。
意識づけの為、こうしてプログラミングディスカッションを行っている感じです。

もう一つはルール化ですが、これは当たり前すぎてこんなルールを掲げていると、他社から助っ人が来たときにちょっと恥ずかしい。
また、ルール化には弊害があって、何故それが必要かを考えること無くルールに従う人間が増えてしまうと言うこと。
だから、ルールと言うよりは何故の部分を根気よく教えていくしか無いのでしょうね。

でも、他社からの助っ人のレベルもあるから載せておいた方がいいのか…悩む。
ルールが細かくなりすぎると、逆にルールを読まない人が増えるからね…適度が難しい。


コメント

タイトルとURLをコピーしました