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