マジックナンバー (プログラム)
出典: フリー百科事典『ウィキペディア(Wikipedia)』
プログラムにおけるマジックナンバー(魔法数字)とは、何らかの識別子として用いられるプログラム中に書かれた具体的な数値(「10」「123」など、数字によって記述される値)である。 そのプログラムの製作者は数値の意図を把握しているが、他のプログラマーまたは製作者本人がマジックナンバーの意図を忘れたとき閲覧すると 「この数字の意味はわからないが、とにかくプログラムは正しく動く。まるで魔法の数字だ」という皮肉を含む。
次のような理由で、マジックナンバーはプログラム中に含まれないことが好ましいとされる。
- その数値の持つ意味がわかりづらい
- 数値を変更する場合に、複数の箇所を変更しなければならない可能性がある
例1: zeikomi = 1.05 * nedan
例1は、nedanに商品価格を入力することでzeikomiに消費税込みの価格が得られる、という計算式である。 しかし消費税の税率とは変化し得るものであり、例1は税率が5%以外に変更されたとき修正が必要となる。 このとき「1.05」はマジックナンバーであり「なぜ1.05なのか」という意図が不明瞭である。 マジックナンバーを除くと例2となり、式に意図が示されるため修正が容易になる。
例2:
ZEIRITU = 0.05
zeikomi = (1.0 + ZEIRITU) * nedan
printfColor関数は第一引数の文字列を第二引数でRGBのフルカラーで指定した色で表現する関数であるとする。(この関数は標準ライブラリに存在しない架空の関数である)
例3: printfColor("color text", 0xffffff)
例3の場合、color textという文字列が「白色」で表示される。 ただし0xffffffは直感的に「白色」と伝えることは困難なマジックナンバーである。 マジックナンバーを除く一つの手法は以下のものである。
例4:
white = 0xffffff
printfColor("color text", white)
これらマジックナンバーを避けるため、マジックナンバーが書いてある箇所を定数や列挙型に置き換えるといった処置がとられる。定数は意味のわかりやすいような名前を付けるため、一読して数値の意味を理解できるからである。 もちろんここで、定数の初期化の際に書かれる数値までマジックナンバーとは呼ばない。
また、1や0はそれ自体が「真」・「偽」などの意味(真理値)を示しうる数値であり、マジックナンバーとは呼ばないこともある。
また、マジックナンバーは、データ構造体の中にある本質的な意味を持たない数値を指すことがある。これはデータ構造体を識別し、間違った型として扱われる事を防ぐために使われる。

