Magic Number¶
MagicNumber¶
コード内にマジックナンバーが存在しないかをチェックします.
-1, 0, 1, 2 はマジックナンバーとはみなされません.また,一つの定数を定義する際に複数の数値を用いることは可能です.
static final int SECONDS_PER_DAY = 24 * 60 * 60;
static final double SPECIAL_RATIO = 4.0 / 3.0;
static final double SPECIAL_SUM = 1 + Math.E;
static final double SPECIAL_DIFFERENCE = 4 - Math.PI;
static final Border STANDARD_BORDER = BorderFactory.createEmptyBorder(3, 3, 3, 3);
static final Integer ANSWER_TO_THE_ULTIMATE_QUESTION_OF_LIFE = new Integer(42);
コード例¶
@MyAnnotation(6) // !!! マジックナンバーです
class MyClass {
private field = 7; // !!! マジックナンバーです
void foo() {
int i = i + 1; // マジックナンバーではありません
int j = j + 8; // !!! マジックナンバーです
}
}
このルールのチェックには,Checkstyleの MagicNumber を用いています.
注釈
マジックナンバー ( Magic number ) とは,ソースコード中に書かれた具体的な数字のことを指します. そのプログラムを書いた時点では,プログラマはその数字の意図を把握していますが,他のプログラマーや製作者本人がマジックナンバーの意図を忘れたときに閲覧すると その数字の意図がわからなくなります.
「マジックナンバー」という名前には,「この数字の意味はわからないが,何故かプログラムは正しく動く.まるで魔法の数字だ」という皮肉を含んでいます. なお,本来プログラム中に記述すべきでないリソースを,直接ソースコード中に埋め込むことを ハードコーディング ( Hard coding )といいます.
プログラム内で用いる定数は const 宣言することにより,可読性が上がり,変更を行いやすくなります.
また,数字を変更してしまうことによるバグを削減することができます.