<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ivaneeo's blog

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

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks
    實例代碼:
    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();    //取得一筆租借記錄

           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 ++;
              if((each.getMovie().getPriceCode() == Movie.NEW_RELEASE) &&
                 each.getDaysRented() > 1)
                 frequentRenterPoints ++;

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

    第一步驟是找出代碼的邏輯泥團并運用Extract Method(110).本例一個明顯的邏輯泥團就是switch語句,把它提煉(extract)到獨立函數中似乎比較好.

    首先我得在這段代碼里頭找出函數內的局部變量(local variables)和參數(parameters).我找到了兩個:each和thisAmount,前者并未被修改,后者會被修改.任何不會被修改的 變量都可以被我當成參數傳入新的函數,至于會被修改的變量就需格外小心.如果只有一個變量會被修改,我可以把它當作返回值.thisAmount是個臨時 變量,其值在每次循環起始處被設為0,并且在switch語句之前不會改變,所以我可以把新函數的返回值賦予它.

    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 ++;
              if((each.getMovie().getPriceCode() == Movie.NEW_RELEASE) &&
                 each.getDaysRented() > 1)
                 frequentRenterPoints ++;

              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 double amountFor(Rental each) {
        double 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;
    }

    現在,已經把原本的函數分為兩塊,可以分別處理它們.我不喜歡amountFor()內的某些變量名稱,現在是修改它們的時候.
    下面是原本的代碼:
       public double amountFor(Rental each) {
        double 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;
    }

    下面是易名后的代碼:
    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;
    }
    posted on 2005-08-15 10:15 ivaneeo 閱讀(415) 評論(0)  編輯  收藏 所屬分類: refactoring-從地獄中重生
    主站蜘蛛池模板: 91免费资源网站入口| 久久精品免费一区二区| 亚洲 综合 国产 欧洲 丝袜| 在线亚洲高清揄拍自拍一品区| 国产成人精品免费视频网页大全 | 国产99视频精品免费专区| 国产亚洲日韩在线三区| 免费无码H肉动漫在线观看麻豆| 亚洲精品国偷自产在线| 国产高清不卡免费视频| 亚洲国产精品婷婷久久| 亚洲免费视频播放| 亚洲熟妇无码一区二区三区导航| 成年美女黄网站色大免费视频| 亚洲成在人线在线播放无码| 全部免费国产潢色一级| 羞羞视频免费网站在线看| 亚洲成AV人片在线观看WWW| 久久免费看黄a级毛片| 国产精品高清视亚洲一区二区| 国产精品无码一二区免费| 特级做a爰片毛片免费看| 亚洲AV无码码潮喷在线观看| 18成禁人视频免费网站| 亚洲成aⅴ人片久青草影院按摩 | 国产偷国产偷亚洲高清日韩| 精品四虎免费观看国产高清午夜| 亚洲精品乱码久久久久久下载 | 国产成人精品免费直播| 中国一级毛片视频免费看| 亚洲人成在线观看| 四虎成人精品一区二区免费网站| 免费一级毛片在线播放视频免费观看永久| 亚洲无线观看国产精品| h视频在线免费看| 特色特黄a毛片高清免费观看| 久久精品国产亚洲av麻豆色欲| 精品国产免费观看| 国产一区二区免费视频| 久久久久亚洲AV无码去区首| 亚洲理论电影在线观看|