Spiga

一天一个重构方法(14):参数化方法

2009-06-07 03:23:21

Parameterize Method:另方法携带参数

若干方法做了类似的工作,但在方法本体中却包括了不同的值,可以建立单一方法,以参数表达那些不同的值。

先看一个简单的例子:

public void TenPercentRaise()
{
	salary *= 1.1;
}

public void FivePercentRaise()
{
	salary *= 1.05;
}

这段代码可以替换如下:

public void Raise(double factor)
{
	salary *= (1 + factor);
}

上面的那个例子太简单,所有人都能做到。下面是一个稍微复杂一点的例子:

public double BaseCharge()
{
	double result = Math.Min(LastUsage(), 100) * 0.03;
	if (LastUsage() > 100)
	{
		result += (Math.Min(LastUsage(), 200) - 100) * 0.05;
	}
	if (LastUsage() > 200)
	{
		result += (LastUsage() - 200) * 0.07;
	}
	return result;
}

上述代码可以替换如下:

public double BaseCharge()
{
	double result = UsageInRange(0, 100) * 0.03;
	result += UsageInRange(100,200) * 0.05;
	result += UsageInRange(200, int.MaxValue) * 0.07;
	return result;
}

private int UsageInRange(int start, int end)
{
	if (LastUsage() > start)
		return Math.Min(LastUsage(), end) - start;
	return 0;
}

本项重构的技巧在于:以可将少量数值视为参数为依据,找出带有重复性的代码。