ivaneeo's blog

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

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks

          #

          作法(Mechanics)
            • 在client class中建立一個函數,用來提供你需要的功能。
                • ==》這個函數不應該取用client class的任何特性。如果它需要一個值,把該值當作參數傳給它。
            • 以server class實體作為該函數的第一個參數。
            • 將該函數注釋為:[外加函數(foreign method),應在server class實現。]
                • ==》這么一來,將來如果有機會將外加函數搬移到server class中,你便可以輕松找出這些外加函數。
          posted @ 2005-08-31 14:21 ivaneeo 閱讀(255) | 評論 (0)編輯 收藏

          動機(Motivation)
          進行本項重構時,如果你以外加函數實現一項功能,那就是一個明確信號;這個函數原本應該在提供服務的(server) class中加以實現。

          如果你發現自己為一個server class建立了大量外加函數,或如果你發現有許多classes都需要同樣的外加函數,你就不應該再使用本項重構,而應該使用Introduce Local Extensiong(164)。
          posted @ 2005-08-31 14:15 ivaneeo 閱讀(169) | 評論 (0)編輯 收藏

          你所使用的server class需要一個額外函數,但你無法修改這個class。

          在client class中建立一個函數,并以一個server class實體作為第一引數(argument)。

          Date newStart = new Date(previousEnd.getYear(), previousEnd.getMonth(), previousEnd.getDate() + 1);
                                                           126.gif
          Date newStart = nextDay(previousEnd);

          private static Date nextDay(Date arg) {
              return new Date(arg.getYear(), arg.getMonth(), arg.getDate() + 1);
          }
          posted @ 2005-08-31 14:09 ivaneeo 閱讀(164) | 評論 (0)編輯 收藏

          范例(Examples)
          上一項重構結束時,Person將Department隱藏起來了:
          class Person...
              Department _department;
              public Person getManager() {
                 return _department.getManager();
              }

          class Department...
              private Person _manager;
              public Department(Person manager) {
                 _manager = manager;
              }
          為了找出某人的經理,客戶代碼可能這樣寫:
              manager = john.getManager();
          首先在Person中建立一個[受托對象(delegate)取得函數]:
              manager  = john.getDepartment.getManager();
          然后逐一處理每個委托函數。

          為方便起見,我也可能想要保留一部分委托關系(delegations)。此外我也可能希望對某些客戶隱藏委托關系,并讓另一些用戶直接使用受托對象。
          posted @ 2005-08-31 14:03 ivaneeo 閱讀(209) | 評論 (0)編輯 收藏

          作法(Mechanics)
            • 建立一個函數,用以取用delegate(受托對象)。
            • 對于每個委托函數(delegate method),在server中刪除該函數,并將[客戶對該函數的調用]替換為[對delegate(受托對象)的調用]。
            • 處理每個委托函數后,編譯、測試。
          posted @ 2005-08-31 13:54 ivaneeo 閱讀(141) | 評論 (0)編輯 收藏

          動機(Motivation)
          Hide Delegate(157)的[動機]欄,我談到了[封 裝delegated object(受托對象)]的好處。但是這層封裝也是要付出代價的,它的代價就是:每當客戶要使用delegate(受托類)的新特性時,你就必須在 server端添加一個簡單委托函數。隨著delegate的特性(功能)越來越多,這一過程會讓你痛苦不已。server完全變成了一個[中間人],此 時你就應該讓客戶直接調用delegate。
          posted @ 2005-08-31 13:51 ivaneeo 閱讀(133) | 評論 (0)編輯 收藏

          某個class做了過多的簡單委托動作(simple delegation)。

          讓客戶直接調用delegate(受托類)。

          Remove_Middle_Man.png
          posted @ 2005-08-31 13:45 ivaneeo 閱讀(176) | 評論 (0)編輯 收藏

          范例(Examples)
          本例從兩個classes開始,代表[人]的Person和代表[部門]的Department:
          class Person {
              Department _department;

              public Department getDepartment() {
                 return _department;
              }
              public void setDepartment(Department arg) {
                 _department = arg;
              }
          }

          class Department {
              private String _chargeCode;
              private Person _manager;

              public Department(Person manager) {
                 _manager = manager;
              }

              public Person getManager() {
                 return _manager;
              }
          ...

          如果客戶希望知道某人的經理是誰,他必須先取得Department對象:
              manager = john.getDepartment().getManager();
          這樣的編碼就是對客戶揭露了Department工作原理,于是客戶知道:Department用以追蹤[經理]這條信息。如果對客戶隱藏Department,可以減少耦合(coupling)。為了這一目的,我在Person中建立一個簡單的委托函數:
              public Person getManager() {
                 return _department.getManager();
              }
          現在,我得修改Person的所有客戶,讓它們改用新函數:
              manager = john.getManager();
          只要完成了對Department所有函數的委托關系,并相應修改了 Person的所有客戶,我就可以移除Person中的訪問函數個體Department()了。
          posted @ 2005-08-31 13:35 ivaneeo 閱讀(196) | 評論 (0)編輯 收藏

          作法(Mechanics)
            • 對于每一個委托關系中的函數,在server端建立一個簡單的委托函數(delegating method)。
            • 調整客戶,令它只調用server提供的函數(不得跳過徑自調用下層)。
                • ==》如果client(客戶)和server不在同一個package,考慮修改委托函數(delegating method)的訪問權限,讓client得以在package之外調用它。
            • 每次調整后,編譯并測試。
            • 如果將來不再有任何客戶需要取用圖的Delegate(委托類),便可移除server中的相關訪問函數(accessor for the delegate)。
            • 編譯,測試。
          posted @ 2005-08-31 13:21 ivaneeo 閱讀(157) | 評論 (0)編輯 收藏

          動機(Motivation)
          如果某個客戶調用了[建立了server object(服務對象)的某個值域基礎之上]的函數,那么客戶就必須知曉這一委托對象(delegate object)。萬一委托關系發生變化,客戶也得相應變化。你可以在server端放置一個簡單的委托函數(delegating method),將委托關系隱藏起來,從而去除這種依存性。這么一來即便將來發生關系上的變化,變化將被限制在server中,不會涉及客戶。

          Delegate.png
          posted @ 2005-08-31 13:09 ivaneeo 閱讀(224) | 評論 (0)編輯 收藏

          僅列出標題
          共67頁: First 上一頁 43 44 45 46 47 48 49 50 51 下一頁 Last 
          主站蜘蛛池模板: 河池市| 乌拉特中旗| 邓州市| 东源县| 故城县| 会泽县| 信宜市| 舒城县| 华坪县| 罗定市| 花莲市| 上林县| 迁西县| 鹤峰县| 班戈县| 海淀区| 原平市| 长宁区| 咸丰县| 潍坊市| 寿宁县| 肥西县| 故城县| 竹北市| 兴安县| 珠海市| 武穴市| 芜湖市| 浑源县| 曲松县| 旌德县| 噶尔县| 盐城市| 福海县| 仁寿县| 鄂托克前旗| 开鲁县| 博爱县| 绥德县| 临西县| 上犹县|