OO设计选择和单一责任原则

时间:2014-04-15 10:09:42

标签: c# design-patterns single-responsibility-principle

我目前正在重构一个应用程序,它实质上定期从各种来源(http,ftp,sql等)下载内容。有一个控制应用程序活动时间的计划。例如,它可以在上午8点到下午16点之间下载内容。应用程序一直在用面向对象语言(C#)编写。

这是我在第一次迭代中提出的一般设计: First iteration design

Scheduler类将负责遵守一般计划。它在预定时间段开始时下载,并在结束时停止下载。调度程序包含许多ITask实现,每个实现都有自己的下载要做。我已经创建了一个抽象的基类实现,它定期调用受保护的抽象方法“StartDownload”。 Task的子类只会实现这种方法,而不必担心时间和调度。

到目前为止,这么好。但是当TDD执行任务基类时,我意识到实际上很难模仿StartDownload的行为。当任务的计时器滴答时,如果它已完成先前的下载迭代,它应该只调用StartDownload。但由于这些是实现细节,因此很难模仿。

这让我想知道Task类是否实际上没有违反单一责任原则。毕竟,它正在处理StartDownload的定期调用。 StartDownload方法负责实际下载。所以我想出了一个更独立的设计: Second iteration design

这里Task类的职责仅限于定期调用客户端。客户唯一的责任是下载内容。现在测试Task类会更容易,因为我可以注入一个IDownloadClient mock。

我确实想知道这是否真的是一个更清晰的设计......现在,Task类似乎有点奇怪,只是一个没有任何子类的单一实现。你们觉得怎么样?

1 个答案:

答案 0 :(得分:0)

  

调度程序包含许多ITask实现,每个实现   有自己的下载工作。

我认为你混合了两个对象,我将其命名为Task和Download。愿每个任务执行多个下载吗?在这种情况下,您的第二个设计更合适,但我错过了Task和IDownloadClient之间的聚合关系。

如果每个任务只占一个下载,那么我将重构第一个设计,确保调度程序实际处理所有任务 - 我的意思是,LastDownload和NextDownload代表什么?