【发布时间】:2014-01-18 07:50:24
【问题描述】:
为了提高我的设计技能,我最近热衷于面向对象的设计。这个问题是关于我经常看到的特定设计选择,但不明白其中的原理。我知道设计选择倾向于主观,但我想知道其他人对此有何看法,以了解我的设计直觉是变好还是变坏。
我在看Robert C Martin(Uncle Bob) -Clean Architecture and Design-2012 COHAA The Path to Agility Conference。在演讲中,他讲述了一个关于开发Fitnesse 的故事。我对软件不熟悉,所以我查了一下,找到the project hosted on github。
在浏览项目时,WikiPage interface 引起了我的注意:PageCrawler getPageCrawler(); 方法。所以我查看PageCrawler interface 看看它是什么样子的。在检查这个接口时,我认为PageCrawler 中的方法看起来应该属于WikiPage,并且WikiPage 可以合理地实现该接口。
我认为将两者分开可能会导致WikiPage 暴露内部结构,以便抓取页面所需的信息可供抓取它的对象访问。此外,BaseWikiPage 抽象类只是返回一个新的PageCrawlerImpl,据我所见,项目中没有其他PageCrawler 实现。
我在其他项目中看到过这种类型的代码,其中一个接口/类的方法返回另一个接口/类的对象,其方法可以合理地属于第一个类。在尝试了解 Fitnesse 开发人员的意图时,我提出这种设计的唯一原因是,通过实现 WikiPage 创建新 wiki 页面的开发人员不需要重新实现爬取功能,即无论 wiki 页面的实现如何,爬行功能都应该是相同的。这是这样设计的目的,还是我遗漏了什么?
我在 SO 上找到了Implementing an interface vs. providing an interface 问题,但它并不完全相同,并且没有提供太多关于何时可以设计此类东西的见解。
【问题讨论】:
标签: oop design-patterns interface