天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

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

思維導圖

索引:

Ø Move Method(搬移函數)Ø Move Field (搬移值域)Ø Extract Class (提煉類)Ø Inline Class (將類內聯化,就是把當前的類合并到其他類中)Ø Hide Delegate (隱藏委托關系)Ø Remove Middle Man ( 移除中間人)Ø Introduce Foreign Method (引入外加函數)Ø Introduce Local Extension (引入本地擴展)  介紹  承接上文php 雜談《重構-改善既有代碼的設計》之 重新組織你的函數 ,繼續說重構方面的內容。 
 專業術語 delegate:委托encapsulate:封裝introduce:引入wrapper:覆蓋  前言 ”決定把責任放在哪里“――運用重構改變原先的設計。 

解釋:

  1、Class承擔過多而臃腫不堪――Extract Class將一部分責任分離出去。

  2、Class沒有承擔足夠多的責任,不再有單獨存在的理由――Inline Class將它融入另一個Class。

  3、Class使用另一個Class――Hide Delegate隱藏關系。

  4、承接(3),如果Client通過Middle Man 調用很多的Delegate Class的函數(這里只是簡單調用,只做跳轉,而Middle Man沒有做太多的業務邏輯,如10個Delegate Class中的Method對應10個Middle Man的Method)――Remove Middle Man,直接使用Delegate Class,可以部分使用Delegate Method。

 

 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 Class與Extract Class相反。――把Extract Class例子反過去,因為PhoneNumber只用作讀取code和number。  Hide Delegate 狀況:客戶直接調用Server Object的Delegate Class的Method,那么在Server端建立客戶所需的函數Method,用以隱藏委托關系。  學過對象技術的人都知道,雖然php允許你將field聲明為public,但你還應該隱藏field(private)。隨著經驗日漸豐富,有更多值得封裝的東西。 看下面一個例子:

  $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實體做為參數。

 

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

使用Subclass方法 

或使用Wrapper

 總結

 需要注意一下,“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”。

php技術PHP 雜談《重構-改善既有代碼的設計》之二 對象之間搬移特性,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 久久99精品AV99果冻 | 美国一级大黄一片免费的网站 | 第一会所欧美无码原创 | 恋夜秀场支持安卓版全部视频国产 | 色综合久久五月 | 久久不卡免费视频 | 热久久国产欧美一区二区精品 | 亚州综合网| 99视频在线免费 | 久久中文字幕人妻AV熟女 | 如懿传免费观看在线全集 | 午夜福利不卡片在线播放免费 | 又黄又猛又爽大片免费 | 麻豆AV无码蜜臀AV色哟 | NANANA在线观看高清影院 | 午夜性爽视频男人的天堂在线 | 久久国产精品久久国产精品 | c了瑜伽老师嗷嗷叫一节课视频 | 精品亚洲欧美中文字幕在线看 | 99久久国内精品成人免费 | 国产精华av午夜在线观看 | 无人区乱码1区2区3区网站 | 三级成人电彭 | 精品高潮呻吟99AV无码 | 亚洲精品AV一二三区无码 | 国产一区日韩二区欧美三区 | 久久怡红院国产精品 | 久久精品午夜一区二区福利 | 乐乐亚洲精品综合影院 | 羞羞漫画在线播放 | 国产亚洲人成在线视频 | 久久久久久久久免费视频 | 中文字幕亚洲第一 | 野花日本免费完整版高清版动漫 | 男同志在线观看 | 又黄又爽又无遮挡在线观看免费 | 99国产强伦姧在线看RAPE | 九九精品视频在线播放 | JLZZJLZZJLZ老师好多的水 jk制服喷水 | 国产色综合久久无码有码 | 美女扒开腿让男生桶爽免费APP |