Javaでプログラムを組んでいて、よくCheck Styleで警告を出されるマジックナンバー。
組んだアプリを実行しても、マジックナンバーによる影響は特にないので、今までずっと放置してきました。でも、なんとなく警告が残ってしまうのはイヤなので、マジックナンバーというものを調べてみました。
魔法の数字
プログラムのソースコードの中に突然表れる具体的な数値のことをマジックナンバーと呼ぶんだそうです。プログラムを書いた時点ではその数値が何を意味しているのかを理解していますが、他の人が見たり、時間が経って数値の意味を忘れてしまったとき、「意味はわからないけどプログラムは正常に処理を終える魔法の数字」という意味合いを持っているとのこと。
例えば、以下のようなソースコード。
private boolean checkUserCount(int argUserCount) {
boolean status = true;
if (argUserCount >= 10) {
this.setMessageOfError = "ユーザー数が最大です";
status = false;
}
return status;
}
こんな処理があったとします。argUserCountが10以上だったらエラーとする処理ですが、この「10」というのがマジックナンバーというようです。
1回しか登場しない数値だったり、今後も一切変更なしの完全固定な数値だったりする場合は、よくこういう書き方をしてしまいますが、Check Style的にはあまりよろしくない様子。確かに、100%絶対変更がない数値だ、とは言い切れないですし。
また、「10」という数値だけを見た場合に、これが何を表している数値なのかもわかりにくい。例えば最大数なのか最小数なのか、など。
数値に名前をつけてあげる
そんなわけで、定数に置き換えてあげることで警告は出なくなります。
private final int MAX_USER = 10;
private boolean checkUserCount(int argUserCount) {
boolean status = true;
if (argUserCount >= MAX_USER) {
this.setMessageOfError = "ユーザー数が最大です";
status = false;
}
return status;
}
たとえ1度しか登場しない数値でも、定数にすることで数値の意味がわかりますし、もし変更することになっても変更箇所が1箇所ですみます。
マジックナンバーを使わないということは、大事なことなんだなぁ、と再認識しました。
ということで、数値を扱う場合は極力定数を使って、数値にわかりやすい名前を持たせてあげましょう。ただ「10」と書かれても意味がわかりにくいですが、「MAX_USER」と書かれれば「あぁ、最大ユーザー数なんだな」と気付けるようになります。
・・・でも、あまり良くないとは分かっていても、やっぱり直接数値で書いてしまうことって、結構あるんですよね。気をつけないと。
コメント