佐々木屋

技術的なことから趣味まで色々書きます

マジックナンバーはシンボリック定数に置き換える

課題

以下のコードのどこが問題でしょうか。

string[] colorNames = {"桃", "黒", "黄", "青", "赤" };
for (int i = 2; i <= colorNames.Length - 1; i++) {
    Console.WriteLine(colorNames[i]);
}
Dim colorNames As String() = {"桃", "黒", "黄", "青", "赤"}
For i As Integer = 2 To colorNames.Length - 1
    Console.WriteLine(colorNames(i))
Next


リファクタリング

2行目のfor文に使われている定数が問題です。これは何を意味しているのか分かりにくいのです。このような数をマジックナンバーと呼びます。
条件分岐やループ制御などでよく使われるマジックナンバーですが、局所的な使用で無ければ出来る限り無い方が良いです。後で見返した場合、何の数字なのか判別出来なくなる可能性が高い為です。

こういったマジックナンバーはシンボリック定数(意味のある定数)に変更します。シンボリック定数は共通で使用されるなら別の静的クラスでpublicスコープで定義します。その際必ずconst、若しくはstatic readonlyとします。

リファクタリング

const int YELLOW_ID = 2;

string[] colorNames = { "桃", "黒", "黄", "青", "赤" };
for (int i = YELLOW_ID; i < colorNames.Length - 1; i++) {
    Console.WriteLine(colorNames[i]);
}
Const YELLOW_ID As Integer = 2

Dim colorNames As String() = {"桃", "黒", "黄", "青", "赤"}
For i As Integer = YELLOW_ID To colorNames.Length - 1
    Console.WriteLine(colorNames(i))
Next



シンボリック定数の有利な点の一つとして、改廃に強いことも挙げられます。例えば、同じ意味のシンボリック定数を複数個所で使用する場合です。定数宣言の部分だけを変更すれば完了しますが、マジックナンバーを利用している場合は使用されれているすべての箇所を変更しなければなりません。