第1章_Java言語で学ぶリファクタリング入門

第1章で学ぶこと

"シンボリック定数によるマジックナンバーの置き換え"
というリファクタリングを学びます。
(マジックナンバーとは、具体的な数値を指します。)

概要

ソースコード中に具体的な数値(マジックナンバー)を
埋め込むのは、よくないコーディングスタイルです。

『理由1』マジックナンバーは意味が分りにくい。

ソースコード中に「(例えば)100」と書いてあっても、
それが何を意味するのかすぐには分からない。
「100」の代わりに、MAX_INPUT_LENGTH(最大入力列長)という
シンボリックな名前がついてたら、意味が分かりやすくなる。

『理由2』マジックナンバーは、複数箇所に書いてあると修正しにくい

ソースコードに散財している「100」の中から最大入力列長を
表すものだけをピックアップし、
「200」に書き換えなければならないのです。
これは大変な手間ですし、間違えやすい。

"シンボリック定数によるマジックナンバーの置き換え"の手順

『手順1』シンボリック定数を宣言する


(1)シンボリック定数を宣言する
Javaでシンボリック定数を作るには、

  • public static finalのクラスフィールドを使う。
  • enumを使う。


public→クラスの外からでも参照できるようにするため。
static→クラスフィールドにするため
final→誤って代入されないようにするため。
※あるクラスの中だけで使われるシンボリック定数を宣言する場合には、
private static finalにすることもある。


(2)マジックナンバーをシンボリック定数で置き換える。
シンボリック定数が出来たので、
ソース中に登場するロボットへのコマンド『0,1,2』を置き換える。


(3)そのシンボリック定数に依存する別のマジックナンバーを探し、
シンボリック定数を使った式に変換する。


(4)コンパイルする


『手順2』テストをする。

(1)
すべてのシンボリック定数の置き換えが終わったら、
コンパイルしてテストをする。


(2)
可能なら、シンボリック定数の値を変更してから
コンパイルしてテストする。


※シンボリック定数にしないほうがいい場合。

  • forループの限界チェックで、配列の長さを表すのに、

シンボリック定数を使うのは不適切。
理由は、Javaの配列には、配列の長さを表すlengthフィールドが元々あるから。

  • 自明な値にシンボリック定数を使うのは、

かえってソースを読みにくくしてしまう。


修正前
if(100 < input.length()){
	・・・
}
修正後
public class Something{
	public static final int MAX_INPUT_LENGTH = 100;
}
if (MAX_INPUT_LENGTH < input.length()){
	・・・
}