マジックナンバーを避ける方法 C++編 constとenum class

プログラミングC++

プログラミングの世界ではマジックナンバーを避けるように言われることが多いです。

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++の知識

プログラミングコンテストみたいなときはマジックナンバーを使っても大丈夫です。その場だけですから。

C++の聖書、ストラウストラップを読みましょう。

コメント

スポンサーリンク
スポンサーリンク
スポンサーリンク
スポンサーリンク
スポンサーリンク
タイトルとURLをコピーしました