在下面的 视频, ,提交人需要一个现有类和分配的单一责任原则。他需要一个打印类的工作访问的数据、格式和印刷报告。他打破了每一种方法,其类别,因此他创造了一个数据访问类处理数据的访问,他创造了一个ReportFormatter类,以处理格式的报告,他创建了一个ReportPrinter类处理的印刷的报告。原始报告类然后留下一个方法,Print()要求的ReportPrinter的类方法印刷品。数据访问和ReportFormatter出现有责任,但ReportPrinter依赖于DataAcess和ReportFormatter,所以没这个打破SRP或者我误会吗?

有帮助吗?

解决方案

单一责任原则表明给定的班级应该承担单一责任(或“改变的原因”)。它本身并不表示如何满足这一责任。这样做可以并且经常需要多个其他类作为合作者的合作。

其他提示

不看视频,这听起来像一个合理的设计。SRP不破裂,作为方法处理数据的访问不出现在ReportPrinter类中,仅有的概念说,"我可以叫什么来获得的数据的我想要的。"

你可以把它推进一步,并有一名协调员类只负责协调的活动数据的接入类别,格式类和打印机的类。你也可以安排的对象不同的方式,就像有的协调人发送数据的格式,将其发送给打印机,并协调员不(直接)知道有关打印机。

事情已经知道关于协调的努力,狭隘地专注的对象。这成为他们的责任。它是好的要知道有关概念或概念的是什么其他目的将这样做,所以,只要你不知道也不关心 如何 他们这样做。思想的接口,作为"接缝的责任"是一个良好的开端。

它也可以是有益的,如果你认为的对象,如将数据传递给各方,而不是"做"的事情。所以ReportFormatter返回(或转发的)一个新的对象,表示格式的报告,而不是(在概念上)执行对象,在现有的报告。

SRP不解决依赖关系。将课程分解为单一责任类将有助于以后打破这些依赖关系。 SRP解决了一起提到的两个原则之一:内聚和耦合。 SRP具有高内聚力,并且依赖性可以指示高耦合。良好的设计具有高内聚力和低耦合性。有时这两个原则可能不一致。

没有。它不会打破SRP。

假设

DataAccess implements IDataAccess    

ReportFormatter  implements IReportFormatter 

ReportPrinter implements IReportPrinter 

事件虽然 ReportPrinter依赖于DataAccess和ReportFormatter ,但 IDataAccess或IReportFormatter 的合同中的任何更改都应该由 DataAccess和ReportFormatter 分别。 ReportPrinter 不担心这些类中的责任更改。

您可以 Composition 或实施 Mediator 模式以提供宽松这三个类之间的耦合,并完成工作。将 coupling 部分与责任保持一致。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top