程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP雜談《重構-改善既有代碼的設計》之對象之間搬移特性

PHP雜談《重構-改善既有代碼的設計》之對象之間搬移特性

編輯:關於PHP編程

思維導圖 

 

 
 


介紹
 
 承接上文PHP 雜談《重構-改善既有代碼的設計》之重新組織你的函數,繼續說重構方面的內容。
 
 
 專業術語
 
delegate:委托
encapsulate:封裝
introduce:引入
 
 前言
 
”決定把責任放在哪裡“——運用重構改變原先的設計。
 


 



解釋:
  1、Class承擔過多而臃腫不堪——Extract Class將一部分責任分離出去。
  2、Class不負責任——Inline Class將它融入另一個Class。
  3、Class使用另一個Class——Hide Delegate隱藏關系。
  4、承接(3)Delegate Class經常變化——Remove Middle Man。
 
 Move Method
 
如果一個類中的方法與另一個類有很多的交流,那麼我們就在另一個類中建立一個有類似功能的新函數,將舊函數變成一個單純的Delegating Method, 或是將舊函數移除。
 






 
類圖:

 
動機:
  1、如果一個類與另一個類有高度耦合,我就會Move Method。——class更簡單,更干淨利落的實現系統交付的任務。
  2、移動一些值域,就要檢查是否使用另一個類的次數必使用所駐對象的次數還多。
 Move Field
 
狀況:你的class中的field被另一個class更多的用到。那麼在另一個class裡建立new field,修改舊的field。 



 


Extract Class
 
狀況:一個類做了兩個類做的事,那麼建立一個新Class,將相關的Field和Method從舊Class移到新Class。
 
 




 

 
Inline Class
狀況:你的某個Class沒有做太多事情(沒有承擔足夠責任),那麼將Class的所有特性搬移到另一個Class中,然後移除原Class
動機:Inline ClassExtract Class相反。——把Extract Class例子反過去,因為PhoneNumber只用作讀取codenumber
 
 Hide Delegate
 
狀況:客戶直接調用Server ObjectDelegate ClassMethod,那麼在Server端建立客戶所需的函數Method,用以隱藏委托關系。
 
 學過對象技術的人都知道,雖然php允許你將field聲明為public,但你還應該隱藏fieldprivate)。隨著經驗日漸豐富,有更多值得封裝的東西。
 
看下面一個例子:
 
 $person->getDepartment()->getManager()明顯揭露了,要想找到Xiaocai的領導,必須要經過department,所以我們要做的事隱藏department。——可以減少耦合性。
 


 
 Remove Middle Man
 
狀況:如果某個Class做了過多的Simple Delegate,那麼我們就直接調用Delegate Class
動機:在Hide Delegate中的例子裡當Department有更多新方法的時候,我們為了Hide Delegate,就要必須在Person裡添加相應的方法做Delegate之用。這時候的Person完全變成了一個Middle Man,此時我們就應該直接調用Delegate Class——Department
 重構的意義就在於:你永遠不必說對不起,只要你把出問題的地方修補好就行了。
 
 
 


 
 


Introduce Foreign Method
 
狀況:有一個類Client需要使用的類PreviousEnd中一個額外函數,但你無法修改這個類PreviousEnd,那麼你就在Client中建立一個函數,並以一個PreviousEnd實體做為參數。
 





 
 


  總結
 
需要注意一下,“Extract Class”和“Inline Class”,”Hide Delegate“和”Remove Middle Man",都是相反的過程,具體理解,可以看前言中的那張流程圖。
 
“Hide Delegate"我們常用於使用少量的”Delegate Method“的時候,而”Remove Middle Man“,用於調用很多”Delegate Method“的時候,我們可以直接使用Delegate Class,進行調用,而有的Delegate Method我們視情況保留一部分。
 
“Extract Class”和“Inline Class”,"Extract Class"經常用於承擔那過多責任而變得臃腫不堪的Class中,而“Inline Class”經常用於當前的這個類”太不負責的“時候使用。——我個人是寧願“Extract Class”,也不願“Inline Class”。
 
摘自  川山甲

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved