「マジックナンバー (プログラム)」の版間の差分

削除された内容 追加された内容
Cewbot (会話 | 投稿記録)
m Bot作業依頼: sourceタグをsyntaxhighlightタグに置換 (Category:非推奨のsourceタグを使用しているページ) - log
余計な編集を差し戻し。理由は記事中のコメントを参照。
9行目:
; 例1
 
たとえば、消費税が108%の時に、税込価格 (tax-included price) を求める以下のようなソースコードを[[C言語]]で書いたとする。
<!-- もともとオリジナルのサンプルコードはC言語の文法に沿っていなかったが、型を明示したほうが説明しやすくなるため、Cの文法に従ったコードに書き直した。通貨を扱う場合は専用の型を用いるべきだが、簡単のためdouble型を用いる。 -->
<!-- 警告: ここで提示しているのは、あくまで例題なので、たとえ今後日本の消費税率が8%以外に変更されたとしても、記事およびサンプルコード中の税率をいちいち変更したりしないこと。重要なのは具体的な数値ではなく、概念および説明のほうであることを忘れないこと。 -->
 
<syntaxhighlight lang="c">
double calculateTaxIncludedPrice(double price) {
return 1.108 * price;
}
</syntaxhighlight>
 
これは、<code>price</code>に商品の本体価格を入力することで消費税込みの価格が得られる、という計算式を実装する関数である。しかし消費税の税率 (tax rate) は変化し得るため、税率が108%以外に変更されたとき修正が必要となる。このとき「1.108」はマジックナンバーであり「なぜ1.108なのか」という意図が不明瞭である。
 
ここで、マジックナンバーを取り除くため、名前付きの定数シンボル<code>TaxRate</code>を導入する。
25行目:
<syntaxhighlight lang="c">
double calculateTaxIncludedPrice(double price) {
const double TaxRate = 0.108;
return (1.0 + TaxRate) * price;
}
32行目:
定数シンボルの導入により、式に意図が反映されるため修正が容易になる。
 
; 例2
<code>printColorText()</code>関数は第1引数の文字列を、第2引数で[[RGB]]の[[フルカラー]]値として指定した色で印字する関数であるとする。
 
<syntaxhighlight lang="c">
extern void printColorText(const char* text, uint32_t colorValue);
50 ⟶ 52行目:
これらマジックナンバーを避けるため、マジックナンバーが書いてある箇所を[[定数 (プログラミング)|定数]]や[[列挙型]]に置き換えるといった処置がとられる。定数は意味のわかりやすいような名前を付けることができるため、一読して数値の意味を理解できるからである。ここで、定数の初期化の際に右辺値に書かれる数値までマジックナンバーやハードコーディングとは呼ばない。
 
また、[[1]]や[[0]]はそれ自体が「真」・「偽」などの意味([[真理値]])を示しうる数値であり、使われる文脈によってはマジックナンバーとは呼ばないこともある。ただしC言語では、意味を明確にするため、1/0の数値を直接用いるのではなく、<code>TRUE</code>や<code>FALSE</code>といったシンボルを明示的に定義して利用することがある。
<syntaxhighlight lang="c">
#define TRUE 1