[asin:4797337990:title] 第1章

Java言語で学ぶリファクタリング入門
結城 浩
ソフトバンク クリエイティブ

第1章 シンボリック定数によるマジックナンバーの置き換え.

第1章のまとめ

マジックナンバーは,数字のままなので意味が分かりにくいし,複数箇所に存在すると変更が難しくなるから,シンボリック定数に置き換えましょうという話.

JUnitによるテスト

リファクタリングするには,テストが必要になるので,
まず,[ThinkIT] 第10回:JUnitの利用 (1/4) を参考にJUnitの簡単な使い方を学んだ.

とりあえず,

assertEquals(期待する値, 実際の値);

という使い方を覚える.

この章に関してやってみたこと

  • マジックナンバーを使ったRobotクラスの作成
  • RobotTestクラスの作成
  • テストの実行
  • Robotクラスをリファクタリングしてマジックナンバーをシンボリック定数に置き換える
  • テストの実行
  • RobotTestクラスの変更
  • テストの実行
  • RobotCommandクラスの導入

Robotクラスのorderメソッド

著者のWebサイト『Java言語で学ぶリファクタリング入門』でプログラムをダウンロードできるようだが,自分で作ってみた.

僕の持っている技術((assertEquals()))だと,標準出力に対するテストが分からなかったので,order()メソッドは,Stringを返すように変更した.
下記はリファクタリング後のorder()メソッド.

/**
 * 命令メソッド
 * @param command Robotへの命令
 * @return Robotが実行した動作(文字列)を返す
 */
public String order(int command) {
	if (command == COMMAND_WALK) {
		return this.getName() + " walks.";  
	} else if (command == COMMAND_STOP) {
		return this.getName() + " stops.";  
	} else if (command == COMMAND_JUMP) {
		return this.getName() + " jumps.";  
	} else {
		return ("Command error. command = " + command);
	}
}

RobotTestクラスのtestOrderメソッド

Robotクラスのorder()メソッドに対するテストメソッド.

/**
 * orderメソッドのテストメソッド
 */	
@Test
public void testOrder() {
	Robot robot = new Robot("Andrew");
	assertEquals("Andrew walks.", robot.order(Robot.COMMAND_WALK));
	assertEquals("Andrew stops.", robot.order(Robot.COMMAND_STOP));
	assertEquals("Andrew jumps.", robot.order(Robot.COMMAND_JUMP));
	
	/* リファクタリング
	assertEquals("Andrew walks.", robot.order(0));
	assertEquals("Andrew stops.", robot.order(1));
	assertEquals("Andrew jumps.", robot.order(2));
	*/
	assertEquals("Command error. command = -1", robot.order(-1));
}

感想

このシンボリック定数によるマジックナンバーの置き換えというリファクタリングについては,普段からマジックナンバーを使わないように意識していたので,すんなり理解できた.
第1章の後半に載っていた,マジックナンバーをシンボリック定数に置き換えるだけでなく,新しい型を導入してやる*1というのは,今までやってなかった.これから使っていきたい.


テストについては,もっと勉強が必要.
本の付録のJUnitに関する記述と,著者のWebサイトからダウンロードして見れるプログラムを読もうと思う.

*1:こうすることで,プログラマのミスをコンパイラが検出できる