最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP 雜談《重構(gòu)-改善既有代碼的設(shè)計》之二 對象之間搬移特性

 更新時間:2012年04月09日 22:20:50   作者:  
承接上文PHP 雜談《重構(gòu)-改善既有代碼的設(shè)計》之 重新組織你的函數(shù) ,繼續(xù)說重構(gòu)方面的內(nèi)容
思維導(dǎo)圖

索引:

Ø Move Method(搬移函數(shù))
Ø Move Field (搬移值域)
Ø Extract Class (提煉類)
Ø Inline Class (將類內(nèi)聯(lián)化,就是把當(dāng)前的類合并到其他類中)
Ø Hide Delegate (隱藏委托關(guān)系)
Ø Remove Middle Man ( 移除中間人)
Ø Introduce Foreign Method (引入外加函數(shù))
Ø Introduce Local Extension (引入本地擴(kuò)展)
 
 介紹
 
 承接上文PHP 雜談《重構(gòu)-改善既有代碼的設(shè)計》之 重新組織你的函數(shù) ,繼續(xù)說重構(gòu)方面的內(nèi)容。
 

 專業(yè)術(shù)語
 
delegate:委托
encapsulate:封裝
introduce:引入
wrapper:覆蓋
 
 前言
 
”決定把責(zé)任放在哪里“——運用重構(gòu)改變原先的設(shè)計。
 

解釋:

  1、Class承擔(dān)過多而臃腫不堪——Extract Class將一部分責(zé)任分離出去。

  2、Class沒有承擔(dān)足夠多的責(zé)任,不再有單獨存在的理由——Inline Class將它融入另一個Class。

  3、Class使用另一個Class——Hide Delegate隱藏關(guān)系。

  4、承接(3),如果Client通過Middle Man 調(diào)用很多的Delegate Class的函數(shù)(這里只是簡單調(diào)用,只做跳轉(zhuǎn),而Middle Man沒有做太多的業(yè)務(wù)邏輯,如10個Delegate Class中的Method對應(yīng)10個Middle Man的Method)——Remove Middle Man,直接使用Delegate Class,可以部分使用Delegate Method。

 

 Move Method
 
如果一個類中的方法與另一個類有很多的交流,那么我們就在另一個類中建立一個有類似功能的新函數(shù),將舊函數(shù)變成一個單純的Delegating Method, 或是將舊函數(shù)移除。

 

類圖:

 

動機(jī):

  1、如果一個類與另一個類有高度耦合,我就會Move Method?!猚lass更簡單,更干凈利落的實現(xiàn)系統(tǒng)交付的任務(wù)。

  2、移動一些值域,就要檢查是否使用另一個類的次數(shù)必使用所駐對象的次數(shù)還多。

 Move Field
 
狀況:你的class中的field被另一個class更多的用到。那么在另一個class里建立new field,修改舊的field。
 

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

 

 

 Inline Class
 
狀況:你的某個Class沒有做太多事情(沒有承擔(dān)足夠責(zé)任),那么將Class的所有特性搬移到另一個Class中,然后移除原Class。
動機(jī):Inline Class與Extract Class相反?!袳xtract Class例子反過去,因為PhoneNumber只用作讀取code和number。
 
 Hide Delegate
 
狀況:客戶直接調(diào)用Server Object的Delegate Class的Method,那么在Server端建立客戶所需的函數(shù)Method,用以隱藏委托關(guān)系。
 
 學(xué)過對象技術(shù)的人都知道,雖然php允許你將field聲明為public,但你還應(yīng)該隱藏field(private)。隨著經(jīng)驗日漸豐富,有更多值得封裝的東西。
 
看下面一個例子:

 
 $person->getDepartment()->getManager()明顯揭露了,要想找到Xiaocai的領(lǐng)導(dǎo),必須要經(jīng)過department,所以我們要做的事隱藏department?!梢詼p少耦合性。
 

 

 Remove Middle Man
 
狀況:如果某個Class做了過多的Simple Delegate,那么我們就直接調(diào)用Delegate Class。
動機(jī):在Hide Delegate中的例子里當(dāng)Department有更多新方法的時候,我們?yōu)榱薍ide Delegate,就要必須在Person里添加相應(yīng)的方法做Delegate之用。這時候的Person完全變成了一個Middle Man,此時我們就應(yīng)該直接調(diào)用Delegate Class——Department。
 重構(gòu)的意義就在于:你永遠(yuǎn)不必說對不起,只要你把出問題的地方修補(bǔ)好就行了。
 
 
 

 

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

 

 Introduce Local Extention
 
狀況:你的Class需要一些額外函數(shù),但你不能修改當(dāng)前的類,那么建立一個新Class,使它包含這些函數(shù)。使用Subclass 或 Wrapper?!@個一般用于你無法修改源碼的情況下使用。
 
 拿上面Introduce Foreign Method例子來說

使用Subclass方法
 

或使用Wrapper

 總結(jié)

 
需要注意一下,“Extract Class”和“Inline Class”,”Hide Delegate“和”Remove Middle Man",都是相反的過程,具體理解,可以看前言中的那張流程圖。
 
“Hide Delegate"我們常用于使用少量的”Delegate Method“的時候,而”Remove Middle Man“,用于調(diào)用很多”Delegate Method“的時候,我們可以直接使用Delegate Class,進(jìn)行調(diào)用,而有的Delegate Method我們視情況保留一部分。
 
“Extract Class”和“Inline Class”,"Extract Class"經(jīng)常用于承擔(dān)那過多責(zé)任而變得臃腫不堪的Class中,而“Inline Class”經(jīng)常用于當(dāng)前的這個類”太不負(fù)責(zé)的“時候使用?!覀€人是寧愿“Extract Class”,也不愿“Inline Class”。

相關(guān)文章

最新評論

英超| 乐都县| 鞍山市| 上饶县| 麻江县| 繁昌县| 武宁县| 罗江县| 贵港市| 炎陵县| 赣榆县| 宿松县| 伊吾县| 白银市| 金昌市| 永新县| 仙居县| 嘉义县| 西安市| 镇远县| 峡江县| 吉木乃县| 酉阳| 阳山县| 娱乐| 西安市| 余姚市| 康保县| 湘阴县| 安平县| 祁东县| 永宁县| 临澧县| 措勤县| 繁昌县| 封开县| 禄丰县| 新建县| 清镇市| 陇南市| 诸城市|