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

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

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

    ivaneeo's blog

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

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks
    范例(Examples)
    我用一個表示[帳戶]的account class來說明這項重構:
    class Account...
        double overdraftCharge() {   //透支金計費,它和其他class的關系似乎比較密切。
           if(_type.isPremium()) {
              double result = 10;
              if(_daysOverdrawn > 7)
                 result += (_daysOverdrawn -7) * 0.85;
              return result;
           }
           else return _daysOverdrawn * 1.75;
        }
        double bankCharge() {
           double result = 4.5;
           if(_daysOverdrawn > 0) result += overdraftCh你arge();
           return result;
        }
        private AccountType _type;
        private int _daysOverdrawn;

    假設有數(shù)種新帳戶,每一種都有自己的[透支金計費規(guī)則]。所以我希望將overdraftCharge()搬移到AccountType class去。

    第一步要做的是:觀察被overdraftCharge()使用的每一特性(features),考慮是否值得將它們與overdraftCharge()一起移動。此例之中我需要讓_daysOverdrawn值域留在Account class,因為其值會隨不同種類的帳戶而變化。然后,我將overdraftCharge()函數(shù)碼拷貝到AccountType中,并做相應調整。
    class AccountType...
        double overdraftCharge(int daysOverdrawn) {
           if(isPremium()) {
              double result = 10;
              if(daysOverdrawn >7)
                 result += (daysOverdrawn - 7) * 0.85;
              return result;
            }
           else return daysOverdrawn * 1.75;
        }
    在這個例子中,[調整]的意思是:(1)對于[使用AccountType特性]的語句,去掉──type;(2)想辦法得到依舊需要的Account class特性。當我需要使用source class特性,我有四種選擇:(1)將這個特性也移到target class;(2)建立或使用一個從target class到source的引用(指涉)關系;(3)將source object當作參數(shù)傳給target method;(4)如果所需特性是個變量,將它當作參數(shù)傳給target method。

    本例中我將_daysOverdrawn變量作為參數(shù)傳給target method(上述(4))。

    調整target method使之通過編譯,而后我就可以將source method的函數(shù)本體替換為一個簡單的委托動作(delegation),然后編譯并測試:
        class Account...
           double overdraftCharge() {
              return _type.overdraftCharge(_daysOverdrawn);
           }
    我可以保留代碼如今的樣子,也可以刪除source method。如果決定刪除,就得找出source method的所有調用者,并將這些調用重新定向,改調用Account的bankCharge():
    bankCharge():
        class Account...
           double bankCharge() {
              double result = 4.5;
              if(_daysOverdrawn > 0)
                 result += _type.overdraftCharge(_daysOverdrawn);
              return result;
            }
    所有調用點都修改完畢后,我就可以刪除source method在Account中的聲明了。我可以在每次刪除之后編譯并測試,也可以一次性批量完成。如果被搬移的函數(shù)不是private,我還需要檢查其 他classes是否使用了這個函數(shù)。在強型(strongly typed)語言中,刪除source method聲明式后,編譯器幫我發(fā)現(xiàn)任何遺漏。

    此例之中被移函數(shù)只取用(指涉)一個值域,所以我只需將這個值域作為參數(shù)傳給target method就行了。如果被移函數(shù)調用了Account中的另一個函數(shù),我就不能這么簡單地處理。這種情況下我必須將source object傳遞給target method:
    class AccountType...
        double overdraftCharge(Account account) {
           if(isPremium()) {
              double result = 10;
              if(account.getDaysOverdrawn() >7)
                 result += (account.getdaysOverdrawn() - 7) * 0.85;
              return result;
            }
           else return daysOverdrawn * 1.75;
        }
    如果我需要source class的多個特性,那么我也會將source object傳遞給target method。不過如果target method需要太多source class特性,就得進一步重構。通常這種情況下我會分解target method,并將其中一部分移回source class。
    posted on 2005-08-30 11:08 ivaneeo 閱讀(222) 評論(0)  編輯  收藏 所屬分類: refactoring-從地獄中重生
    主站蜘蛛池模板: 亚洲国产精品成人| 免费鲁丝片一级在线观看| 国产免费AV片无码永久免费| 在线亚洲高清揄拍自拍一品区| 91香蕉国产线在线观看免费| 亚洲国产精品热久久| 日韩电影免费在线观看| 亚洲国产高清视频| 最近2019中文字幕免费直播| 亚洲国产高清在线精品一区| 免费看污成人午夜网站| 亚洲欧美国产欧美色欲| 热99re久久免费视精品频软件| 小说区亚洲自拍另类| 久久久久亚洲AV成人网人人软件| 和老外3p爽粗大免费视频| 亚洲AV无码乱码国产麻豆| 久久国产免费观看精品3| 亚洲噜噜噜噜噜影院在线播放| 成年男女免费视频网站| 成年网在线观看免费观看网址| 国产亚洲精品高清在线| 99免费在线观看视频| 亚洲一级免费毛片| 日本最新免费不卡二区在线| 国产精品美女久久久免费| 亚洲综合久久综合激情久久| 成年18网站免费视频网站| 欧洲美女大片免费播放器视频| 国产亚洲精品美女久久久| 很黄很色很刺激的视频免费| 国产综合激情在线亚洲第一页| 亚洲日韩精品无码专区网址| 免费成人福利视频| 日韩精品免费一线在线观看| 日产亚洲一区二区三区| 性做久久久久免费看| 中文字幕免费在线观看动作大片| 亚洲福利电影在线观看| 亚洲国产成人久久综合区| 18pao国产成视频永久免费|