重构:Move Method
Move Method就是将方法迁移到合适的位置。
条件:当一个方法被其他类使用比在它所在类中的使用还要频繁时,我们就需要将方法迁移到更频繁地使用它的类中(Move Method重构)
范例如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class BankAccount
{
public BankAccount(int accountNum)
{
AccountNum = accountNum;
}
public int AccountNum { get; private set; }
public double CalculateInterestRate()
{
if (AccountNum > 800)
return 0.02;
if (AccountNum > 10&&AccountNum<=800)
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; }
}
}
{
public BankAccount(int accountNum)
{
AccountNum = accountNum;
}
public int AccountNum { get; private set; }
public double CalculateInterestRate()
{
if (AccountNum > 800)
return 0.02;
if (AccountNum > 10&&AccountNum<=800)
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; }
}
}
发现后者比前者使用标注中的方法的频率更高,因此将该方法移动至后者中。
修改后代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class BankAccount
{
public BankAccount(int accountNum)
{
AccountNum = accountNum;
}
public int AccountNum { 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.AccountNum > 800)
return 0.02;
if (Account.AccountNum > 10 && Account.AccountNum <= 800)
return 0.03;
return 0.05;
}
}
{
public BankAccount(int accountNum)
{
AccountNum = accountNum;
}
public int AccountNum { 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.AccountNum > 800)
return 0.02;
if (Account.AccountNum > 10 && Account.AccountNum <= 800)
return 0.03;
return 0.05;
}
}
代码操作更加清晰,直观。功能单一化。