プログラミングの世界ではマジックナンバーを避けるように言われることが多いです。
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++の聖書、ストラウストラップを読みましょう。
コメント