2024.01.24
マジックナンバーについて
マジックナンバーとは?
ソースコードに直に記述された数値です。数値の意味は開発者が決めていて、開発者側がコメントを記載しなければ他の開発者もパッと見では数値の意味を理解できません。
判定条件などでよく使われることがありますが、基本的にマジックナンバーの使用は禁止しています。
前述で記述したように、開発者側がコメントを記載しなければ他の開発者も数値の意味をすぐ理解できないため、保守しづらいコードになってしまいます。
では、マジックナンバーとは具体的にどのような数値であるかと言うと、数値全てがマジックナンバーに該当します。
マジックナンバーの具体的な使用例をいくつか挙げてみます。
no1
1 2 3 |
if ($apple === 0) { $apple = 'りんごは売り切れです'; } |
no2
1 2 3 |
if ($apple === 1) { $apple = 'りんごは残り1個です'; } |
no3
1 2 3 4 |
$apple = 0; if ($apple === 10) { $apple = 'りんごは残り10個です'; } |
no1〜no3まで例を挙げましたが、判定条件で使用されている数値がマジックナンバーとなります。
マジックナンバーの使用は基本的に禁止と述べましたが、一部例外があります。0と1の数値だけはコードにそのまま記述しても良いという暗黙のルールがあります。それは0と1は「真」・「偽」などの意味(真理値)を表す数値であり、TRUE、FLUSEの書き方が一般的となります。よって0、1はマジックナンバーとは呼ばないこともあります。
マジックナンバーの使用例
弊社でシステムを開発する時は0と1はマジックナンバーと呼ばずに、そのままコードに直接記述することを許容しています。
使用例のno1とno2については使用可能であると説明しましたが、no3の0、1以外の数値に関してはマジックナンバーとして扱い、原則使用禁止となります。ですが、開発する中で、判定条件で0、1以外の数値を使用したい場合もあるかと思います。no3がまさにその例で10を使用したい場合、どのように記述するかと言うと、10と言う数値を定数化し、定数を判定条件に記述する形になります。
記述例を挙げると以下のような記述になります。
no4
1 2 3 |
if ($apple === APPLE_COUNT_10) { $apple = 'りんごは残り10個です'; } |
no4の判定条件の中に「APPLE_COUNT_10」と言う見慣れない定数が記述されていますが、この定数が「10」と同一の意味を持った定数となります。定数は数値データに固有の名前を与えたもので「APPLE_COUNT_10」と言う名前の定数に対して10を定義しています。
このように0、1以外の数値に関してはコードに記述する際は定数化するようにしています。
定数クラスを作成し、そのクラスに0、1以外の数値を定数化し定義することでマジックナンバーを使用せずに0、1以外の数値の判定ができるようになります。
マジックナンバー使用時の注意点
開発者であればマジックナンバーの使用には気をつけていると思いますが、意外とそのままマジックナンバーを使用して記述してしまう方もいると思います。私自身開発規模が大きくなってくると開発時間に終われ、判定条件等でマジックナンバーのまま記述し、後で定数化しようと考えてしまうこともあります。後にマジックナンバーで記述した箇所を定数化すればいいですが、見落とししてそのまましてしまうと保守しづらいコードに繋がってしまいます。
開発ルールでマジックナンバーの使用禁止を掲げていたとしても、数値を定数化するのを忘れてしまった。そのようなことが続いてしまうと見づらいコードに繋がり、保守性の低下に繋がってしまいます。
ですので、たかがマジックナンバーとは思わずに、開発している中で数値を使用する機会があれば、すぐに定数化する癖をつける。また定数化の漏れを防ぐためにコードレビュー時に数値の使用箇所を洗い出し、全て定数化されているのか確認が必要なのです。
納期に間に合わせるのも大事ですが、ルールを無視した開発を続けていればいずれシステムの崩壊に繋がりかねないのです。
たかがマジックナンバーですが、開発する上で一度初心に戻り、本当に開発ルールを守れているか再度コードを見返してみてはどうでしょうか?