プログラミングの世界ではマジックナンバーを避けるように言われることが多いです。
C++でどうやって避けるかを説明します。
いくつか方法がありますが、基本的にはconstかenum classを使うのがよいと思います。
マジックナンバー
マジックナンバーとは、ソースコード上に現れる具体的な数値のことです。
簡単にコードを分けの分からないものにすることができるので、使わないようなコーディング規約を作ることがほとんどです。
マジックナンバーの例
マジックナンバーとはコード上に出てくる具体的な数字のことです。
例えば、以下のコードを見てどう思いますか?
if (a == 1){
//何か
}else if (a == 2){
//何か
} else {
//何か
}
1が何か、2が何かよく分かりません。仕様書などない場合は前後から1や2の意味を類推しなければなりません。
コーディングしているときは明らかだったかもしれませんが、その後にメンテナンスができなくなるコードです。
このように、1や2のように意味が分からない数字のことをマジックナンバーと呼びます。
せめて、以下のようにコメントに書くべきです。
if (a == 1){// 受付可能状態
//何か
}else if (a == 2){// 実行中
//何か
} else {
//何か
}
コメントだと忘れてしまうかもしれません。他にいい方法があります。
これからいくつかの方法を紹介します。
C言語のマクロdefine
まず、C言語でも使えるところで、defineです。
※この方法はお薦めしません。飛ばしても構いません。
#define MY_STATUS_ACCEPT 1
#define MY_STATUS_DOING 2
if (a == MY_STATUS_ACCEPT){
//何か
}else if (a == MY_STATUS_DOING){
//何か
} else {
//何か
}
これであれば、意味が分かると思います。C言語ではよく使われます。
以下のような注意事項を守って使いましょう。(使わない方がよいと思います)
- defineはどこに書いてもいいですが、普通はヘッダファイルを作ってまとめて書きます
- 全部大文字で書くのが昔からの慣習です
- defineはコンパイル前に評価されますのでnamespaceやclassに制限されません。製品の中で一意の名前になるように、命名規則をしっかりと考えましょう
- defineはコンパイル前に評価されるので、時折デバグを困難にします。覚悟してください。
constを使う
constを使うと言うのがスマートな解です。
const int myStatusAccept = 1;
const int myStatusDoing = 2;
if (a == myStatusAccept){
//何か
}else if (a == myStatusDoing){
//何か
} else {
//何か
}
関数内だけで使う定数は関数内でconstの定義をしましょう。クラス内でしか使わない定数は、privateメンバでconstで定義しておきます。定数の使用範囲をなるべくしぼっておきましょう。
enum classを使う
上記のように、「状態」を管理しているときなどは一緒に扱いたい、と思います。
classのpublic変数にしてしまえばいいんじゃない?
class MyStatus {
public:
int Accept = 1;
int Doing = 2;
};
上記はclassですが、値を入れておくためだけの箱です。値を入れておくための箱という役割のものがenum classです。以下のようにして使います。
enum class MyStatus {
Accept,
Doing,
};
MyStatus a = MyStatus::Accept;
if (a == MyStatus::Accept){
//何か
}else if (a == MyStatus::Doing){
//何か
} else {
//何か
}
Accept, Doingに具体的な数字を割り当てる必要もありませんし、重複しないかという心配の必要がありません。aをintでなくMyStatusで宣言しておくと、あり得ない値と比較してしまうのも避けることができます。
※古いC++にはenumというのがありました。思わぬバグを作ってしまうことがありますのでenumではなくenum classを使ってください。enumについてはあえて説明はしません。
まとめ
C++でマジックナンバーを避ける方法を説明しました。
constかenum classを使ってください。
プログラミングコンテストみたいなときはマジックナンバーを使っても大丈夫です。その場だけですから。
C++の聖書、ストラウストラップを読みましょう。




コメント