ivaneeo's blog

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

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks
          現在我要對getCharge()實施Move Method(142).下面是重構前的代碼:
          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;
          }

          搬移動作很簡單。下面是重構后的代碼:
          class Movie...
              double getCharge(int daysRented) {
                 return _price.getCharge(daysRented);
              }


          class Price...
             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;
          }

          搬移之后,我就可以開始運用Replace Conditional with Polymorphism(255)了。
          下面是重構前的代碼:
          class Price...
             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;
          }

          我的作法是一次取出一個case分支,在相應的class內建一個覆寫函數(override method)。先從RegularPrice開始:
          class RegularPrice...
              double getCharge(int daysRented) {
                 double result = 2;
                 if(daysRented > 2)
                    result += (daysRented - 2) * 1.5;
                 return result;
              }

          class ChildernsPrice...
              double getCharge(int daysRented) {
                 double result = 1.5;
                 if(daysRented > 3)
                    result += (daysRented - 3) * 1.5;
                 return result;
              }

          class NewReleasePrice...
          double getCharge(int daysRented) {
                 return daysRented * 3;
              }

          處理完所有case分支之后,我就把Price.getCharge()聲明為abstract:
          class Price...
              abstract double getCharge(int daysRented);
          posted on 2005-08-15 17:21 ivaneeo 閱讀(171) 評論(0)  編輯  收藏 所屬分類: refactoring-從地獄中重生
          主站蜘蛛池模板: 乌兰浩特市| 名山县| 吕梁市| 威信县| 尉犁县| 浠水县| 通河县| 稻城县| 固安县| 呼和浩特市| 上饶县| 弥渡县| 渭源县| 鄯善县| 曲阳县| 皮山县| 嘉义县| 敦煌市| 屯昌县| 玉林市| 邵阳市| 灵宝市| 乌兰浩特市| 灵丘县| 民乐县| 临桂县| 武冈市| 和林格尔县| 威远县| 双鸭山市| 五家渠市| 鄯善县| 临西县| 四会市| 阿拉善左旗| 江津市| 敦煌市| 油尖旺区| 河间市| 晋州市| 宣武区|