2. 移动方法
资料参考:https://blog.csdn.net/knightswarrior/article/details/9447815
概念:本文所讲的移动方法就是方法放在合适的位置(通常指放在合适的类中)。
正文:移动方法是一个很简单也很常见的重构,只要是系统就会存在很多类,那么类里面包括很多方法,如果一个方法经常被另外一个类使用(比本身的类使用还多)或者这个方法本身就不应该放在这个类里面,那么这个适合应该考虑把它移到合适的类中。代码如下:
1 /** 2 * 银行账户 3 */ 4 class BankAccount { 5 private final int accountAge; 6 7 private final int creditScore; 8 9 public BankAccount(int accountAge, int creditScore) { 10 this.accountAge = accountAge; 11 this.creditScore = creditScore; 12 } 13 14 /** 15 * 计算利率 16 * 17 * @return 利率 18 */ 19 public double calculateInterestRate() { 20 if (creditScore > 800) { 21 return 0.02; 22 } 23 24 if (accountAge > 10) { 25 return 0.03; 26 } 27 28 return 0.05; 29 } 30 }
1 /** 2 * 账户利息 3 */ 4 class AccountInterest { 5 private BankAccount bankAccount; 6 7 public AccountInterest(BankAccount bankAccount) { 8 this.bankAccount = bankAccount; 9 } 10 11 /** 12 * 获取利率 13 * 14 * @return 利率 15 */ 16 public double interestRate() { 17 return bankAccount.calculateInterestRate(); 18 } 19 20 /** 21 * 是否是优惠的利率 22 * 23 * @return true:是;false:否 24 */ 25 public boolean introductoryRate() { 26 return bankAccount.calculateInterestRate() < 0.05; 27 } 28 }
移动以后大家可以看到BankAccount类的职责也单一,同时CalculateInterestRate也放到了经常使用且适合它的类中了,所以此重构是一个比较好的重构,能让整个代码变得更加合理。
1 /** 2 * 银行账户 3 */ 4 class BankAccount { 5 private final int accountAge; 6 7 private final int creditScore; 8 9 public BankAccount(int accountAge, int creditScore) { 10 this.accountAge = accountAge; 11 this.creditScore = creditScore; 12 } 13 14 /** 15 * 获取账户年数 16 * 17 * @return 账户年数 18 */ 19 public int getAccountAge() { 20 return accountAge; 21 } 22 23 /** 24 * 获取信用分数 25 * 26 * @return 信用分数 27 */ 28 public int getCreditScore() { 29 return creditScore; 30 } 31 }
1 /** 2 * 账户利息 3 */ 4 class AccountInterest { 5 private final BankAccount bankAccount; 6 7 public AccountInterest(BankAccount bankAccount) { 8 this.bankAccount = bankAccount; 9 } 10 11 /** 12 * 获取利率 13 * 14 * @return 利率 15 */ 16 public double interestRate() { 17 return calculateInterestRate(); 18 } 19 20 /** 21 * 是否是优惠的利率 22 * 23 * @return true:是;false:否 24 */ 25 public boolean introductoryRate() { 26 return calculateInterestRate() < 0.05; 27 } 28 29 private double calculateInterestRate() { 30 if (bankAccount.getCreditScore() > 800) { 31 return 0.02; 32 } 33 34 if (bankAccount.getAccountAge() > 10) { 35 return 0.03; 36 } 37 38 return 0.05; 39 } 40 }