Replace Method with Method Object Query(メソッドオブジェクトによるメソッドの置き換え)


HOME > プログラミング > リファクタリング > Replace Method with Method Object リファクタリング プログラムの体質改善テクニック

Replace Method with Method Objectとは、長いメソッドをリファクタリングしようとしたときに、ローカル変数がたくさんあってExtract Methodなどが単純に行えないときに使用するテクニックです。
Extract Classでクラスを抽出してローカル変数をフィールド変数にして、適用しやすくなったExtract Methodを行っていくという流れになります。

リファクタリング前:

using System;

public class StockFinder
{
	//...

	public Code GetNextTargetStock(DateTime date, Data data)
	{
		int temp1 = 0;
		int temp2 = 0;
		int temp3 = 0;

		int result = 0;

		//
		//date, data, temp1, 2, 3を使用した長い計算

		//...

		return result;
	}
}


 

リファクタリング後:

using System;

public class StockFinder
{
	//...

	TargetStockFinder targetStockFinder = new TargetStockFinder();
	Code targetStock = targetStockFinder.GetNextTargetStock();
}

public class TargetStockFinder
{
	private DateTime date;
	private Data data;

	private int temp1;
	private int temp2;
	private int temp3;

	int result;

	//コンストラクタに必要なパラメーターを渡す
	//元のメソッドの引数とほぼ同じになるはず
	public TargetStockFinder(DateTime date, Data data)
	{
		this.date = date;
		this.data = data;
	}

	public Code GetNextTargetStock()
	{
		return Compute1() + (Compute2() * Compute3());
	}

	//Extract Methodを使って小さいメソッドに分割していく

	private int Compute1()
	{
		return temp1 + temp2 * GetAppropriateWait();
	}

	private int GetAppropriateWait()
	{
		//...
	}

	//...
}

	  

Copyright(c) 2012 WoodenSoldier Software