国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

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

2020-03-22 20:02:28
字體:
來源:轉載
供稿:網友

  • 介紹

    承接上文PHP 雜談《重構-改善既有代碼的設計》之 重新組織你的函數 ,繼續說重構方面的內容。

    專業術語

    delegate:委托
    encapsulate:封裝
    introduce:引入

    前言

    ”決定把責任放在哪里“——運用重構改變原先的設計。

    解釋:

      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。——html' target='_blank'>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實體做為參數。


    總結

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

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

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 深州市| 汪清县| 虎林市| 湘西| 靖安县| 西平县| 江西省| 贵阳市| 镇宁| 娱乐| 泸西县| 祥云县| 昌宁县| 汶上县| 宁波市| 巴彦淖尔市| 丰顺县| 宾阳县| 鞍山市| 石屏县| 三河市| 大邑县| 凉山| 喀喇沁旗| 保康县| 石阡县| 察哈| 灌云县| 长垣县| 安陆市| 怀来县| 河曲县| 正蓝旗| 长寿区| 许昌县| 香港 | 上犹县| 织金县| 马公市| 屯留县| 永春县|