ivaneeo's blog

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

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks
          運(yùn)用多態(tài)(polymorphism)取代與價(jià)格相關(guān)的條件邏輯
          這個問題的第一部分是switch語句。在另一個對象的屬性(attribute)基礎(chǔ)上運(yùn)用switch語句,并不是什么好注意。如果不得不使用,也應(yīng)該在對象自己的數(shù)據(jù)上使用,而不是在別人的數(shù)據(jù)上使用。
          class Rental...
          double getCharge() {
              double result = 0;
              switch(getMovie().getPriceCode()) {   //取得影片出租價(jià)格
                    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;
          }

          這暗示getCharge()應(yīng)該移到Movie class里頭去:
          class Movie...
          double getCharge(int daysRented) {
              double result = 0;
              switch(getPriceCode()) {   //取得影片出租價(jià)格
                    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;
          }

          為了讓它得以運(yùn)作,我必須把[租期長度]作為參數(shù)傳遞進(jìn)去。當(dāng)然,[租期長度]來自 Rental對象.計(jì)算費(fèi)用時需要兩份數(shù)據(jù):[租期長度]和[影片類型]。為什么我選擇[將租期長度傳給Movie對象]而不是[將影片類型傳給 Rental對象]呢?因?yàn)楸鞠到y(tǒng)可能發(fā)生的變化是加入新影片類型,這種變化帶有不穩(wěn)定傾向。如果影片類型有所變化,我希望掀起最小的漣漪,所以我選擇在 Movie對象內(nèi)計(jì)算費(fèi)用。

          我把上述計(jì)費(fèi)方法放進(jìn)Movie class里頭,然后修改Rental的getCharge(),讓它使用這個新函數(shù):
          class Rental...
              double getCharge() {
                 return _movie.getCharge(_daysRented);
              }
          posted on 2005-08-15 14:54 ivaneeo 閱讀(186) 評論(0)  編輯  收藏 所屬分類: refactoring-從地獄中重生
          主站蜘蛛池模板: 灌阳县| 五大连池市| 始兴县| 江城| 景德镇市| 博乐市| 蓬溪县| 双江| 五常市| 乡宁县| 德阳市| 延寿县| 安庆市| 南安市| 五莲县| 湛江市| 获嘉县| 浠水县| 南充市| 长葛市| 嘉禾县| 惠来县| 隆回县| 广水市| 东港市| 庄浪县| 桂平市| 惠来县| 竹北市| 扶风县| 滁州市| 潮州市| 海淀区| 宜州市| 积石山| 夏津县| 合山市| 永胜县| 循化| 治县。| 县级市|