マジックナンバー (プログラム)

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索

プログラムにおけるマジックナンバー(魔法数字)とは、何らかの識別子として用いられるプログラム中に書かれた具体的な数値である。そのプログラムを書いた時点では製作者は数値の意図を把握しているが、他のプログラマーまたは製作者本人がマジックナンバーの意図を忘れたとき閲覧すると「この数字の意味はわからないが、とにかくプログラムは正しく動く。まるで魔法の数字だ」という皮肉を含む。

概要

次のような理由で、マジックナンバーはプログラム中に含まれないことが好ましいとされる。

  • その数値の持つ意味がわかりづらい。
  • 数値を変更する場合に、複数の箇所を変更しなければならない可能性がある。

たとえば、消費税が5%の時に以下のようなコードを書いたとする。

 zeikomi = 1.05 * nedan

これは、nedanに商品の本体価格を入力することでzeikomiに消費税込みの価格が得られる、という計算式である。しかし消費税の税率は変化し得るため、税率が5%以外に変更されたとき修正が必要となる。このとき「1.05」はマジックナンバーであり「なぜ1.05なのか」という意図が不明瞭である。

マジックナンバーを除くと、

 ZEIRITU = 0.05
 zeikomi = (1.0 + ZEIRITU) * nedan

となり、式に意図が示されるため修正が容易になる。

printfColor関数は第一引数の文字列を第二引数でRGBフルカラーで指定した色で表現する関数であるとする。この関数は標準ライブラリに存在しない架空の関数である。

 printfColor("color text", 0xffffff)

この場合、color textという文字列が「白色」で表示される。ただし0xffffffは直感的に「白色」と伝えることは困難なマジックナンバーである。

マジックナンバーを取り除く手法の一つとして、以下のような書き方がある。

 white = 0xffffff
 printfColor("color text", white)

これらマジックナンバーを避けるため、マジックナンバーが書いてある箇所を定数列挙型に置き換えるといった処置がとられる。定数は意味のわかりやすいような名前を付けるため、一読して数値の意味を理解できるからである。ここで、定数の初期化の際に書かれる数値までマジックナンバーとは呼ばない。

また、10はそれ自体が「真」・「偽」などの意味(真理値)を示しうる数値であり、マジックナンバーとは呼ばないこともある。

また、マジックナンバーは、データ構造体の中にある本質的な意味を持たない数値を指すことがある。これはデータ構造体を識別し、間違った型として扱われる事を防ぐために使われる。これについてはフォーマット識別子としてのマジックナンバーを参照。テンプレート:Asbox