亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

索引:

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

 專(zhuān)業(yè)術(shù)語(yǔ)
 
delegate:委托
encapsulate:封裝
introduce:引入
wrapper:覆蓋
 
 前言
 
”決定把責(zé)任放在哪里“——運(yùn)用重構(gòu)改變?cè)鹊脑O(shè)計(jì)。
 

解釋?zhuān)?/STRONG>

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

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

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

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

 

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

 

類(lèi)圖:

 

動(dòng)機(jī):

  1、如果一個(gè)類(lèi)與另一個(gè)類(lèi)有高度耦合,我就會(huì)Move Method。——class更簡(jiǎn)單,更干凈利落的實(shí)現(xiàn)系統(tǒng)交付的任務(wù)。

  2、移動(dòng)一些值域,就要檢查是否使用另一個(gè)類(lèi)的次數(shù)必使用所駐對(duì)象的次數(shù)還多。

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

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

 

 

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

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

 

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

 

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

 

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

使用Subclass方法
 

或使用Wrapper

 總結(jié)

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

相關(guān)文章

  • php檢查頁(yè)面是否被百度收錄

    php檢查頁(yè)面是否被百度收錄

    這篇文章主要介紹了php檢查頁(yè)面是否被百度收錄,使用php實(shí)現(xiàn)批處理檢測(cè)頁(yè)面是否被百度收錄的功能,感興趣的小伙伴們可以參考一下
    2015-10-10
  • php頁(yè)面函數(shù)設(shè)置超時(shí)限制的方法

    php頁(yè)面函數(shù)設(shè)置超時(shí)限制的方法

    這篇文章主要介紹了php頁(yè)面函數(shù)設(shè)置超時(shí)限制的方法,可通過(guò)函數(shù)控制超時(shí)限制,也可通過(guò)修改php配置文件實(shí)現(xiàn)修改超時(shí)限制,需要的朋友可以參考下
    2014-12-12
  • 詳解php反序列化

    詳解php反序列化

    這篇文章主要介紹了php反序列化的相關(guān)知識(shí),文中講解非常細(xì)致,代碼幫助各位更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • PHP提交表單失敗后如何保留已經(jīng)填寫(xiě)的信息

    PHP提交表單失敗后如何保留已經(jīng)填寫(xiě)的信息

    這篇文章主要介紹了PHP提交表單失敗后如何保留已經(jīng)填寫(xiě)的信息,需要的朋友可以參考下
    2014-06-06
  • PHP Primary script unknown 解決方法總結(jié)

    PHP Primary script unknown 解決方法總結(jié)

    在本篇文章里小編給大家整理的是關(guān)于PHP Primary script unknown 終極解決方法以及相關(guān)知識(shí)點(diǎn),有需要的朋友們參考學(xué)習(xí)下。
    2019-08-08
  • php獲取文件類(lèi)型和文件信息的方法

    php獲取文件類(lèi)型和文件信息的方法

    這篇文章主要介紹了php獲取文件類(lèi)型和文件信息的方法,可實(shí)現(xiàn)獲取文件類(lèi)型、大小、修改時(shí)間等功能,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下
    2015-07-07
  • php的閉包(Closure)匿名函數(shù)詳解

    php的閉包(Closure)匿名函數(shù)詳解

    本文主要給大家介紹的是php5.3引入的PHP匿名函數(shù),也就是閉包(Closure),以及閉包的作用,非常詳細(xì),這里推薦給有需要的小伙伴們。
    2015-02-02
  • PHP實(shí)現(xiàn)抓取HTTPS內(nèi)容

    PHP實(shí)現(xiàn)抓取HTTPS內(nèi)容

    這篇文章主要介紹了PHP實(shí)現(xiàn)抓取HTTPS內(nèi)容,以及遇到的問(wèn)題的解決方法,需要的朋友可以參考下
    2014-12-12
  • How do I change MySQL timezone?

    How do I change MySQL timezone?

    The MySQL timezone is set to MST (-7 hours GMT/UTC) and is not configurable by you. MySQL is only capable of having 1 timezone setting per mysql daemon. Therefore, you cannot select NOW() and expect a result in a timezone other than MST.
    2008-03-03
  • PHP實(shí)現(xiàn)基于棧的后綴表達(dá)式求值功能

    PHP實(shí)現(xiàn)基于棧的后綴表達(dá)式求值功能

    這篇文章主要介紹了PHP實(shí)現(xiàn)基于棧的后綴表達(dá)式求值功能,簡(jiǎn)單描述了后綴表達(dá)式的概念并結(jié)合實(shí)例形式分析了php使用棧實(shí)現(xiàn)后綴表達(dá)式求值的相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11

最新評(píng)論