学习 重构--改善既有的代码 (一)

  续 http://blog.csdn.net/f562867448/article/details/6719460 

      现在跟着书学校重构statament

  (很多书上都这样说过:让你的代码尽量简洁,减少重复代码)

         书中例子

重构前:
      public String statement() {
       double totalAmount = 0;        //总消费金。
       int frequentRenterPoints = 0;        //常客积点
       Enumeration rentals = _rentals.elements();
       String result = "Rental Record for " + getName() + "\n";
       while (rentals.hasMoreElements()) {
           double thisAmount = 0;
           Rental each = (Rental) rentals.nextElement();        //取得一笔租借记。
 
          //determine amounts for each line
           switch (each.getMovie().getPriceCode()) {        //取得影片出租价格
               case Movie.REGULAR:                        //普通片
                   thisAmount += 2;
                   if (each.getDaysRented() > 2)
                       thisAmount += (each.getDaysRented() - 2) * 1.5;
                   break;
               case Movie.NEW_RELEASE:                //新片
                   thisAmount += each.getDaysRented() * 3;
                   break;
               case Movie.CHILDRENS:                //儿童。
                   thisAmount += 1.5;
                   if (each.getDaysRented() > 3)
                       thisAmount += (each.getDaysRented() - 3) * 1.5;
                   break;
 
           }
 
           // add frequent renter points        (累计常客积点。
           frequentRenterPoints ++;
           // add bonus for a two day new release rental
           if ((each.getMovie().getPriceCode() == Movie.NEW_RELEASE) &&
each.getDaysRented() > 1) frequentRenterPoints ++;
 
           //show figures for this rental(显示此笔租借记录)
           result += "\t" + each.getMovie().getTitle()+ "\t" +
String.valueOf(thisAmount) + "\n";
           totalAmount += thisAmount;
 
       }
       //add footer lines(结尾打印)
       result +=  "Amount owed is " + String.valueOf(totalAmount) + "\n";
       result += "You earned " + String.valueOf(frequentRenterPoints) +
" frequent renter points";
       return result;
 
   }

第一次修改后:

public String statement() {
     double totalAmount = 0;
     int frequentRenterPoints = 0;
     Enumeration rentals = _rentals.elements();
     String result = "Rental Record for " + getName() + "\n";
     while (rentals.hasMoreElements()) {
         double thisAmount = 0;
         Rental each = (Rental) rentals.nextElement();
 
         thisAmount = amountFor(each);  //计算一笔租片费。
 
         // add frequent renter points
         frequentRenterPoints ++;
         // add bonus for a two day new release rental
         if ((each.getMovie().getPriceCode() == Movie.NEW_RELEASE) &&
             each.getDaysRented() > 1) frequentRenterPoints ++;
 
         //show figures for this rental
         result += "\t" + each.getMovie().getTitle()+ "\t" +
             String.valueOf(thisAmount) + "\n";
         totalAmount += thisAmount;
 
      }
      //add footer lines
      result +=  "Amount owed is " + String.valueOf(totalAmount) + "\n";
      result += "You earned " + String.valueOf(frequentRenterPoints) +
           " frequent renter points";
      return result;
 
   }
}
private int amountFor(Rental each) {    //计算一笔租片费。
  int thisAmount = 0;
   switch (each.getMovie().getPriceCode()) {
       case Movie.REGULAR:            //普通片
           thisAmount += 2;
           if (each.getDaysRented() > 2)
               thisAmount += (each.getDaysRented() - 2) * 1.5;
           break;
       case Movie.NEW_RELEASE:  //新片
           thisAmount += each.getDaysRented() * 3;
           break;
       case Movie.CHILDRENS:         //儿童。
           thisAmount += 1.5;
           if (each.getDaysRented() > 3)
               thisAmount += (each.getDaysRented() - 3) * 1.5;
           break;
 
   }
 return thisAmount;


 

 return thisAmount;

例子中把取得租片费写成了一个private方法!

   没做一次修改建议测试一下,这样即使有错误也可以很快点找到。不要自认天才,一个很细小的问题可能导致你后面一大对的bug。所以多做测试,这并不会浪费你的时间。

 

作者继续修了一下private int amountFor(Rental each) ,将传入参数 each 改成了 aRental  这个修改我觉得很有必要,让人一眼就看出了参数所指向的对象,更让人容易理解!虽然只是在一个简短的方法内!

书中作者感觉

感觉这个金额计算应该放在Rental class ,将Rental 类改成

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;
  }


 

提炼【常客积点计算】

取出临时变量

  这些我就不copy书了

 

最后一步运用了多态,例子中Movie 有不同种类,如果我们把每一个种类的Movie 用一个类来表示明显更容易运用   每个类extends Movie类就可以了。这样添加公用就在父类里添加 ,不同Movie种类的方法在各自的类中添加!这样以后维护的时候明显轻松许多!

 

 

 

    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值