最近我一直在進行面向對象的設計狂歡,努力提高設計技能。這個問題是關於我經常看到的一個特定的設計選擇,並且不理解其基本原理。我知道設計選擇傾向於主觀,但我想知道別人怎麼看待這個,以確定我的設計本能是否越來越好。我正在看Robert C Martin(Uncle Bob) -Clean Architecture and Design-2012 COHAA The Path to Agility Conference。在講話中,他講述了一個關於開發Fitnesse的故事。我對軟件不熟悉,所以我查找並找到the project hosted on github。實現接口vs返回實現接口的對象的方法
在瀏覽項目時,有一件事在WikiPage
interface:PageCrawler getPageCrawler();
方法中引起了我的注意。所以我查了一下PageCrawler
interface看看是什麼樣子。在檢查這個接口時,我認爲PageCrawler
中的方法看起來像是屬於WikiPage
,而WikiPage
可以合理地實現接口。
我認爲將兩者分開可能會導致WikiPage
公開內部消息,以便抓取該頁面所需的信息可供抓取它的對象訪問。而且,BaseWikiPage
抽象類只是返回一個新的PageCrawlerImpl
,並且從我所看到的項目中沒有其他PageCrawler
實現。
我在其他項目中看到過這種類型的代碼,其中一個接口/類的方法返回另一個接口/類的對象的方法可以合理地屬於第一個類。在試圖看到Fitnesse開發人員的意圖時,我想出了這個設計的唯一原因是,通過實現WikiPage
創建新wiki頁面的開發人員不需要重新實現爬網功能,即爬網功能無論維基頁面的實現如何,都應該是相同的。這是這種設計的目的,還是我錯過了什麼?
我在SO上發現了Implementing an interface vs. providing an interface問題,但它並不完全相同,也沒有給出很多關於何時可以設計這樣的東西的信息。
感謝喬恩,我沒有這麼想。但是,我對ISP的解釋是不同的。我認爲ISP將責任分離爲內聚接口並通過實現接口來組成對象,而不一定從實現接口的方法返回對象。在這種情況下,我認爲'PageCrawler'接口本身的存在就是使用ISP。如果'WikiPage'實現它,'PageCrawler'接口的客戶端仍然不知道實現者是'WikiPage'。 – TheSecretSquad
此外,聽起來好像你說'WikiPage'的客戶端不應該瞭解'PageCrawler'方法(這是你的意思?),但他們仍然可以訪問他們,除非他們依賴於似乎一個多餘的消息('getPageCrawler')。如果使用裝飾器,這會不會更好,例如,使用'WikiPage'實現'PageCrawler',然後'WikiPage'可以選擇委託給一個內部也實現'PageCrawler'的單獨對象?我想我的觀點是:他們說'WikiPage'有一個'PageCrawler',但對我來說'WikiPage'是_crawlable_。 – TheSecretSquad