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

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

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

    ivaneeo's blog

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

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks
    實(shí)例代碼:
    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()) {   //取得影片出租價(jià)格
              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(累加常客積點(diǎn))
              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(結(jié)尾打印)
        result += "Amount owed is " + String.valueOf(totalAmount) + " \n";
        result += "You earned " + String.valueOf(frequentRenterPoints) +
           "frequent renter points";
        return result;
    }

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

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

    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(累加常客積點(diǎn))
              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(結(jié)尾打印)
        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()) {   //取得影片出租價(jià)格
              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;
    }

    現(xiàn)在,已經(jīng)把原本的函數(shù)分為兩塊,可以分別處理它們.我不喜歡amountFor()內(nèi)的某些變量名稱(chēng),現(xiàn)在是修改它們的時(shí)候.
    下面是原本的代碼:
       public double amountFor(Rental each) {
        double thisAmount = 0;
        switch(each.getMovie().getPriceCode()) {   //取得影片出租價(jià)格
              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()) {   //取得影片出租價(jià)格
              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) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): refactoring-從地獄中重生
    主站蜘蛛池模板: 亚洲免费精彩视频在线观看| 亚洲日韩欧洲无码av夜夜摸| 大地资源在线资源免费观看| 日韩国产精品亚洲а∨天堂免| 亚洲av不卡一区二区三区| 亚洲精品国产福利一二区| 在线观看视频免费国语| 4444www免费看| 免费观看91视频| 成人免费无码H在线观看不卡| 在线观看亚洲精品专区| 456亚洲人成在线播放网站| 亚洲综合视频在线| 亚洲精品白浆高清久久久久久| 免费大香伊蕉在人线国产| 性色av无码免费一区二区三区| 91精品手机国产免费| 午夜网站在线观看免费完整高清观看| 91av免费在线视频| 曰批全过程免费视频观看免费软件 | 国产在线19禁免费观看| 国产啪精品视频网免费| 91精品全国免费观看含羞草| 日本在线免费观看| 久久精品国产大片免费观看| 国产免费网站看v片在线| 国产一二三四区乱码免费| 精品无码一级毛片免费视频观看| 美女被免费视频网站a| 国产精品亚洲专区无码WEB | 国产免费黄色大片| 国产精品国产自线拍免费软件| 四虎影视免费在线| 成人免费无码精品国产电影| 男女交性永久免费视频播放| 国产福利免费在线观看| 亚洲人成色77777在线观看大| 国产精品亚洲mnbav网站| 国产国拍亚洲精品mv在线观看| 亚洲精品视频在线| 亚洲欧洲精品在线|