マジックナンバー
日本語 | 魔法数字 |
英語 | magic number |
ふりがな | まじっくなんばー |
フリガナ | マジックナンバー |
プログラム中に突如出てくる整数リテラルや浮動小数点リテラルのこと。
たとえば「System.out.println( 100 );」と書かれていた場合、この「100」がマジックナンバーである。
このようなリテラルは、プログラムを書いた者以外にとって「謎の数字」である。よく分からないが、とにかくちゃんと機能している重要な数字、という意味で「マジックナンバー」と呼ばれる。
マジックナンバーは極力避けた方がよい。
前述したように、マジックナンバーは一見、その数字がどういう意味を持つのかわかりにくい。そのため、記述者以外がプログラムを修正するのが難しくなる。
また、同じマジックナンバーがプログラム中に含まれている際に、同じ意味の値なのか分からないという問題がある。「System.out.println( 100 );」という行がある場合、前述の「100」とこの「100」が同じ意味の「100」か分からず、一方を変更した際にもう一方も変更すべきかわかりにくい。
以上の問題から、マジックナンバーを書いてはならない。
できる限りstatic finalフィールドを用いることが望ましい。詳しくは「static final」の項目を参照。
「ハードコーディング」もほぼ同じ意味。
「マジックナンバー」を書く「行為」が「ハードコーディング」と言える。
たとえば「System.out.println( 100 );」と書かれていた場合、この「100」がマジックナンバーである。
このようなリテラルは、プログラムを書いた者以外にとって「謎の数字」である。よく分からないが、とにかくちゃんと機能している重要な数字、という意味で「マジックナンバー」と呼ばれる。
マジックナンバーは極力避けた方がよい。
前述したように、マジックナンバーは一見、その数字がどういう意味を持つのかわかりにくい。そのため、記述者以外がプログラムを修正するのが難しくなる。
また、同じマジックナンバーがプログラム中に含まれている際に、同じ意味の値なのか分からないという問題がある。「System.out.println( 100 );」という行がある場合、前述の「100」とこの「100」が同じ意味の「100」か分からず、一方を変更した際にもう一方も変更すべきかわかりにくい。
以上の問題から、マジックナンバーを書いてはならない。
できる限りstatic finalフィールドを用いることが望ましい。詳しくは「static final」の項目を参照。
「ハードコーディング」もほぼ同じ意味。
「マジックナンバー」を書く「行為」が「ハードコーディング」と言える。
参考サイト
- (参考サイトはありません)
public class Sample
{
public static void main( String[] args )
{
// これがマジックナンバーです。
// ↓
System.out.println( 100 );
// 100
// しかし、この「100」という数字がどういう
// 意味なのか、わかりません。
// 修正する際に、プログラムを読み解く必要が
// あります。
// また、同じマジックナンバーがあると、
// 同じ意味かわかりません。
// これもマジックナンバーです。
// ↓
System.out.println( 100 );
// 100
// この100が上の100と同じ意味か分からないので、
// 上の100を変更する際、この100も変更すればいいのか
// これまたプログラムを調べる必要があります。
// なので、このようなマジックナンバーを使用せず、
// static finalフィールドを使用するようにしましょう。
}
}
{
public static void main( String[] args )
{
// これがマジックナンバーです。
// ↓
System.out.println( 100 );
// 100
// しかし、この「100」という数字がどういう
// 意味なのか、わかりません。
// 修正する際に、プログラムを読み解く必要が
// あります。
// また、同じマジックナンバーがあると、
// 同じ意味かわかりません。
// これもマジックナンバーです。
// ↓
System.out.println( 100 );
// 100
// この100が上の100と同じ意味か分からないので、
// 上の100を変更する際、この100も変更すればいいのか
// これまたプログラムを調べる必要があります。
// なので、このようなマジックナンバーを使用せず、
// static finalフィールドを使用するようにしましょう。
}
}
public class Sample { public static void main( String[] args ) { // これがマジックナンバーです。 // ↓ System.out.println( 100 ); // 100 // しかし、この「100」という数字がどういう // 意味なのか、わかりません。 // 修正する際に、プログラムを読み解く必要が // あります。 // また、同じマジックナンバーがあると、 // 同じ意味かわかりません。 // これもマジックナンバーです。 // ↓ System.out.println( 100 ); // 100 // この100が上の100と同じ意味か分からないので、 // 上の100を変更する際、この100も変更すればいいのか // これまたプログラムを調べる必要があります。 // なので、このようなマジックナンバーを使用せず、 // static finalフィールドを使用するようにしましょう。 } }