第一次使用Extract Method(110) (二)

第一次使用Extract Method(110) (二)
搬移[金额计算]代码
观察amountFor()时,我发现这个函数使用了来自Rental class的信息,却没有使用来自Customer class的信息.

class Customer...
public double amountFor(Rental aRental) {
    double result = 0;
    switch( aRental.getMovie().getPriceCode()) {   //取得影片出租价格
          case Movie.REGULAR:   //普通片
             result+= 2;
             if( aRental.getDaysRented() > 2)
                result+= ( aRental.getDaysRented() - 2) * 1.5;
             break;
          case Movie.NEW_RELEASE:   //新片
             result+= aRental.getDaysRented() * 3;
             break;
          case Movie.CHILDRENS:   //儿童片
             result+= 1.5;
             if( aRental.getDaysRented() > 3)
                result+= ( aRental.getDaysRented() - 3) * 1.5;
             break;
       }
    return result;
}
这立刻使我怀疑它是否被放错了位置.大多数情况下,函数应该放在它使用的数据的所属object(或说class)内,所以amountFor()应该移 到Rental class去.为了这么做,我要运用Move Method(142).首先把代码拷贝到Rental class内,调整代码使之适应新家,然后重新编译.下面这样:

class Rental...
double getCharge() {
    double result = 0;
    switch(getMovie().getPriceCode()) {   //取得影片出租价格
          case Movie.REGULAR:   //普通片
             result+= 2;
             if(getDaysRented() > 2)
                result+= (getDaysRented() - 2) * 1.5;
             break;
          case Movie.NEW_RELEASE:   //新片
             result+= getDaysRented() * 3;
             break;
          case Movie.CHILDRENS:   //儿童片
             result+= 1.5;
             if(getDaysRented() > 3)
                result+= (getDaysRented() - 3) * 1.5;
             break;
       }
    return result;
}
这个例子里,[适应新家]意味去掉参数.此外,我还要在搬移的同时变更函数名称.

现在我可以测试新函数是否正常工作.只要改变Customer.amountFor()函数内容,使它委托(delegate)新函数即可:

class Customer...
    private double amountFor(Rental aRental) {
       return aRental.getCharge();
    }

你可能感兴趣的:(第一次使用Extract Method(110) (二))