软件设计重构秘笈2式-01移动方法
概念
本文所讲的移动方法就是方法放在合适的位置(通常指放在合适的类中)。
意图
移动方法是一个很简单也很常见的重构,只要是系统就会存在很多类,那么类里面包括很多方法, 如果一个方法经常被另外一个类使用(比本身的类使用还多)或者这个方法本身就不应该放在这个类里面, 那么这个适合应该考虑把它移到合适的类中。代码如下:
案例
【银行账户】
/**
* 银行账户
*/
class BankAccount {
private final int accountAge;
private final int creditScore;
public BankAccount(int accountAge, int creditScore) {
this.accountAge = accountAge;
this.creditScore = creditScore;
}
/**
* 计算利率
*
* @return 利率
*/
public double calculateInterestRate() {
if (creditScore > 800) {
return 0.02;
}
if (accountAge > 10) {
return 0.03;
}
return 0.05;
}
}
/**
* 账户利息
*/
class AccountInterest {
private BankAccount bankAccount;
public AccountInterest(BankAccount bankAccount) {
this.bankAccount = bankAccount;
}
/**
* 获取利率
*
* @return 利率
*/
public double interestRate() {
return bankAccount.calculateInterestRate();
}
/**
* 是否是优惠的利率
*
* @return true:是;false:否
*/
public boolean introductoryRate() {
return bankAccount.calculateInterestRate() < 0.05;
}
}
重构
【银行账户】 移动以后大家可以看到BankAccount类的职责也单一, 同时CalculateInterestRate也放到了经常使用且适合它的类中了,所以此重构是一个比较好的重构,能让整个代码变得更加合理。
/**
* 银行账户
*/
class BankAccount {
private final int accountAge;
private final int creditScore;
public BankAccount(int accountAge, int creditScore) {
this.accountAge = accountAge;
this.creditScore = creditScore;
}
/**
* 获取账户年数
*
* @return 账户年数
*/
public int getAccountAge() {
return accountAge;
}
/**
* 获取信用分数
*
* @return 信用分数
*/
public int getCreditScore() {
return creditScore;
}
}
/**
* 账户利息
*/
class AccountInterest {
private final BankAccount bankAccount;
public AccountInterest(BankAccount bankAccount) {
this.bankAccount = bankAccount;
}
/**
* 获取利率
*
* @return 利率
*/
public double interestRate() {
return calculateInterestRate();
}
/**
* 是否是优惠的利率
*
* @return true:是;false:否
*/
public boolean introductoryRate() {
return calculateInterestRate() < 0.05;
}
private double calculateInterestRate() {
if (bankAccount.getCreditScore() > 800) {
return 0.02;
}
if (bankAccount.getAccountAge() > 10) {
return 0.03;
}
return 0.05;
}
}