重构第二式:搬移方法 (Refactoring 2: Move Method)
毋容置疑,搬移方法(Move Method)应该是最常用的重构手段之一,正因为太常用而且较为简单,以至于很多人并不认为它是一种很有价值的重构,但事实并非如此,在最初的代码诞生之后,有些方法可能会被放在一些不合适的地方,例如,一个方法被其他类使用比在它所在的类中的使用还要频繁或者一个方法本身就不应该放在某个类中时,我们应该考虑将它移到更合适的地方。搬移方法,顾名思义就是将方法搬移至合适的位置,如将方法搬移到更频繁地使用它的类中。与搬移方法相似的还有一种重构手段是搬移字段(Move Field),即搬移属性。
在《重构:改善既有代码的设计》一书中,多种坏味都需要使用搬移方法来进行重构,例如依恋情结(Feature Envy)、霰弹式修改(Shotgun Surgery)、平行继承结构(Parallel Inheritance Hierarchies)、异曲同工的类(Alternative Classes with DifferentInterfaces)、狎昵关系(Inappropriate Intimacy)、纯稚的数据类(Data Class)等,通过搬移方法(Move Method)或者搬移字段(Move Field),可以让某些代码待在更合适的位置。因此,Martin Fowler在《重构》一书中指出,“搬移方法”是重构理论的支柱(Moving methods is the bread and butter of refactoring.),可见该重构的重要性。
下面举一个例子来加以说明:
【重构实例】
在某银行系统中包含一个银行账户类BankAccount和账户利息类AccountInterest,重构之前的代码如下:
package sunny.refactoring.two.before;
class BankAccount {
private int accountAge;
private int creditScore;
private AccountInterest accountInterest;
public BankAccount(int accountAge, int creditScore, AccountInterest accountInterest) {
this.accountAge = accountAge;
this.creditScore = creditScore;
this.accountInterest = ac