『重构--改善既有代码的设计』读书笔记----Remove Middle Man
如果你發(fā)現(xiàn)某個(gè)類做了過(guò)多的簡(jiǎn)單委托動(dòng)作,你就可以考慮是否可以讓客戶直接去調(diào)用受托類。在Hide Delegate中,我們介紹了封裝受托對(duì)象的好處,但好處歸好處也存在代價(jià),就是當(dāng)你每次需要在受托對(duì)象中增加新函數(shù)的時(shí)候你都需要在委托的服務(wù)對(duì)象中增加相應(yīng)的函數(shù)來(lái)委托。隨著受托對(duì)象特性越來(lái)越多,你會(huì)發(fā)現(xiàn)你所要處理的東西變得越來(lái)越復(fù)雜,你會(huì)感覺(jué)這個(gè)服務(wù)對(duì)象完全成為了一個(gè)中間人(Middle Man),此時(shí)你就應(yīng)該考慮能否讓客戶直接去調(diào)用受托對(duì)象。
你不需要去考慮什么程度的封裝才是合理,重構(gòu)帶給你Hide Delegate和Remove Middle Man的可能,你不需要去考慮這個(gè)問(wèn)題,因?yàn)槟悴豢赡軙?huì)考慮的很周到,需求是不斷變化的,隨著系統(tǒng)設(shè)計(jì)的更新,你的“合適的隱藏程度”也會(huì)發(fā)生相應(yīng)的變化,昨天恰如其分的封裝可能到了今天就變得臃腫不堪,重構(gòu)的意義在于:你永遠(yuǎn)不必說(shuō)對(duì)不起,只要把問(wèn)題的地方修補(bǔ)好就行了。
做法:
- 在服務(wù)對(duì)象上建立一個(gè)新函數(shù)用于獲得受托函數(shù)。
- 對(duì)于每一個(gè)委托函數(shù),在服務(wù)類中刪除該函數(shù),并讓需要調(diào)用該函數(shù)的客戶轉(zhuǎn)而調(diào)用受托對(duì)象。
- 處理每個(gè)委托函數(shù)之后都進(jìn)行編譯,測(cè)試。
例子:
class Person {public:Person *manager() const{return m_department->manager();}private:Department *m_department;};class Department {public:Department(Person *person) :m_manager(person){}Person *manager() const{return m_manager;}private:Person *m_manager; };在這里我們拿Hide Delegate的例子來(lái)解釋,可以看到Person是Department的服務(wù)對(duì)象,Department是Person的受托類,當(dāng)客戶端代碼
manager = john.manager();要去獲取的時(shí)候,都是通過(guò)Person進(jìn)行間接獲取。但如果大量函數(shù)都需要你這么做,你就必須在Person裝安裝大量的簡(jiǎn)單委托函數(shù)來(lái)處理這個(gè)問(wèn)題。這就是應(yīng)該移除中間人的時(shí)候了,首先在Person中建立一個(gè)函數(shù)用于獲得受托對(duì)象。
class Person {public:Department *deparment() const{return m_department;} };然后逐一處理每個(gè)委托函數(shù),針對(duì)這樣的函數(shù),我們要找到通過(guò)Person使用的函數(shù),并對(duì)他們進(jìn)行修改,讓他首先獲得受托對(duì)象然后直接使用后者。
manager = johon.department()->manager();然后我就可以刪除服務(wù)對(duì)象中的委托函數(shù)了,如果我遺漏了什么,編譯器會(huì)告訴我。為了方便起見,可能會(huì)有情況會(huì)去保留部分委托關(guān)系,此外也有可能需要會(huì)對(duì)客戶隱藏委托關(guān)系,讓另外一些客戶直接使用受托對(duì)象,基于這些原因,你也可以適當(dāng)?shù)谋A粢恍┖?jiǎn)單的委托函數(shù)并把它們放在原地。
?
轉(zhuǎn)載于:https://www.cnblogs.com/rickyk/p/4168705.html
總結(jié)
以上是生活随笔為你收集整理的『重构--改善既有代码的设计』读书笔记----Remove Middle Man的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【FFmpeg】FFmpeg常用基本命令
- 下一篇: 象棋中常用的最小值最大值算法及剪枝算法