ivaneeo's blog

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

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks
          運用多態(polymorphism)取代與價格相關的條件邏輯
          這個問題的第一部分是switch語句。在另一個對象的屬性(attribute)基礎上運用switch語句,并不是什么好注意。如果不得不使用,也應該在對象自己的數據上使用,而不是在別人的數據上使用。
          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;
          }

          這暗示getCharge()應該移到Movie class里頭去:
          class Movie...
          double getCharge(int daysRented) {
              double result = 0;
              switch(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;
          }

          為了讓它得以運作,我必須把[租期長度]作為參數傳遞進去。當然,[租期長度]來自 Rental對象.計算費用時需要兩份數據:[租期長度]和[影片類型]。為什么我選擇[將租期長度傳給Movie對象]而不是[將影片類型傳給 Rental對象]呢?因為本系統可能發生的變化是加入新影片類型,這種變化帶有不穩定傾向。如果影片類型有所變化,我希望掀起最小的漣漪,所以我選擇在 Movie對象內計算費用。

          我把上述計費方法放進Movie class里頭,然后修改Rental的getCharge(),讓它使用這個新函數:
          class Rental...
              double getCharge() {
                 return _movie.getCharge(_daysRented);
              }
          posted on 2005-08-15 14:54 ivaneeo 閱讀(186) 評論(0)  編輯  收藏 所屬分類: refactoring-從地獄中重生
          主站蜘蛛池模板: 壶关县| 乌拉特前旗| 如东县| 丰宁| 嘉鱼县| 柳州市| 体育| 万安县| 仁怀市| 岑巩县| 墨脱县| 外汇| 北宁市| 枞阳县| 泗洪县| 鹿泉市| 林周县| 仁化县| 嵊州市| 交口县| 黄大仙区| 将乐县| 五台县| 修文县| 吴江市| 洛扎县| 宿州市| 岚皋县| 泰和县| 合水县| 开原市| 新田县| 普兰县| 苏尼特右旗| 名山县| 比如县| 佛坪县| 聂拉木县| 精河县| 霍林郭勒市| 新乡市|