ivaneeo's blog

自由的力量,自由的生活。

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks
搬移[金额计算]代码
观察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();
    }
posted on 2005-08-15 11:03 ivaneeo 阅读(179) 评论(0)  编辑  收藏 所属分类: refactoring-从地狱中重生

只有注册用户登录后才能发表评论。


网站导航: