Spiga

一天一个重构方法(30):搬移方法

2009-09-03 16:09:16

Move Method:搬移方法

你的程序中,有个方法与所驻class之外的另一个class进行更多交流:调用后者,或被后者调用。那么请将方法迁移到合适的class中

public class BankAccount
{
	public BankAccount(int accountAge, int creditScore,
	AccountInterest accountInterest)
	{
		AccountAge = accountAge;
		CreditScore = creditScore;
		AccountInterest = accountInterest;
	}
	public int AccountAge { get; private set; }
	public int CreditScore { get; private set; }
	public AccountInterest AccountInterest { get; private set; }
	public double CalculateInterestRate()
	{
		if (CreditScore > 800)
			return 0.02;
		if (AccountAge > 10)
			return 0.03;
		return 0.05;
	}
}
public class AccountInterest
{
	public BankAccount Account { get; private set; }
	public AccountInterest(BankAccount account)
	{
		Account = account;
	}
	public double InterestRate
	{
		get { return Account.CalculateInterestRate(); }
	}
	public bool IntroductoryRate
	{
		get { return Account.CalculateInterestRate() < 0.05; }
	}
}

这里值得注意的是BankAccount.CalculateInterest 方法。当一个方法被其他类使用比在它所在类中的使用还要频繁时,我们就需要使用迁移方法重构了——将方法迁移到更频繁地使用它的类中。由于依赖关系,该重构并不能应用于所有实例,但人们还是经常低估它的价值。最终的代码应该是这样的:

public class BankAccount
{
	public BankAccount(int accountAge, int creditScore,
	AccountInterest accountInterest)
	{
		AccountAge = accountAge;
		CreditScore = creditScore;
		AccountInterest = accountInterest;
	}
	public int AccountAge { get; private set; }
	public int CreditScore { get; private set; }
	public AccountInterest AccountInterest { get; private set; }
}
public class AccountInterest
{
	public BankAccount Account { get; private set; }
	public AccountInterest(BankAccount account)
	{
		Account = account;
	}
	public double InterestRate
	{
		get { return CalculateInterestRate(); }
	}
	public bool IntroductoryRate
	{
		get { return CalculateInterestRate() < 0.05; }
	}
	public double CalculateInterestRate()
	{
		if (Account.CreditScore > 800)
			return 0.02;
		if (Account.AccountAge > 10)
			return 0.03;
		return 0.05;
	}
}