ivaneeo's blog

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

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks
          范例(Examples)
          class IntRange {
              private int _low, _high;
             
              boolean includes(int arg) {
                 return arg >= _low && arg <= _high;
              }

              void grow(int factor) {
                 _high = _high * factor;
              }

              IntRange(int low, int high) {
                 _low = low;
                 _high = high;
              }
          為了封裝_low和_high這兩個值域,我先定義[取值/設值函數](如果此前沒有定義的話),并使用它們:
          class IntRange {
              private int _low, _high;
             
              boolean includes(int arg) {
                 return arg >= _low && arg <= _high;
              }

              void grow(int factor) {
                 _high = _high * factor;
              }

              int getLow() {
                 return _low;
              }

              int getHigh() {
                 return _high;
              }

              void setLow(int arg) {
                 _low = arg;
              }

              void setHigh(int arg) {
                 _high = arg;
              }
          使用本項重構時,一般說來,設值函數被認為應該在[對象創建后]才使用,所以初始化過程中的行為有可能與設值函數的行為不同。這種情況下,我也許在構造函數中直接訪問值域,要不就是建立另一個獨立的初始化函數:
          IntRange(int low, int high) {
              initialize(low, high);
          }
          private void initialize(int low, int high) {
              _low = low;
              _high = high;
          }
          一旦你擁有一個subclass,上述所有動作的價值就體現出來了。如下所示:
          class CappedRange extends IntRange {
              CappedRange(int low, int high, int cap) {
                 super(low, high);
                 _cap = cap;
              }

              private int _cap;

              int getCap() {
                 return _cap;
              }
              
              int getHigh() {
                 return Math.min(super.getHigh(), getCap());
              }
          }
          現在,我可以CappedRange class中覆寫getHigh(),從而加入對cap的考慮,而不必修改IntRange class的任何行為。
          posted on 2005-08-31 15:57 ivaneeo 閱讀(220) 評論(0)  編輯  收藏 所屬分類: refactoring-從地獄中重生
          主站蜘蛛池模板: 高邮市| 巴南区| 宝兴县| 油尖旺区| 泾川县| 澎湖县| 阳信县| 台东县| 镇江市| 京山县| 汤阴县| 平安县| 西城区| 双辽市| 永康市| 安泽县| 靖安县| 建德市| 德惠市| 砀山县| 康平县| 历史| 雷山县| 龙陵县| 樟树市| 行唐县| 那坡县| 宁波市| 大足县| 永济市| 松潘县| 乌拉特后旗| 曲水县| 公主岭市| 疏勒县| 阳曲县| 涟水县| 大冶市| 思南县| 汶川县| 灵川县|