【发布时间】:2014-04-15 10:09:42
【问题描述】:
我目前正在重构一个应用程序,它本质上是定期从各种来源(http、ftp、sql 等)下载内容。有一个时间表可以控制应用程序可以处于活动状态的时间。例如,它可以在上午 8 点到下午 16 点之间下载内容。该应用程序一直使用面向对象的语言 (C#) 编写。
这是我在第一次迭代中提出的一般设计:
Scheduler 类将负责遵守一般时间表。它在预定周期开始时开始下载,并在结束时停止。 Scheduler 包含许多 ITask 实现,每个实现都有自己的下载任务。我创建了一个抽象基类实现,它定期调用受保护的抽象方法“StartDownload”。 Task 的子类只会实现这个方法,不用担心时间和调度问题。
到目前为止,一切都很好。但是在对 Task 基类进行 TDD 时,我意识到实际上很难模拟 StartDownload 的行为。当任务的计时器计时,它应该只在完成上一次下载迭代时才调用 StartDownload。但由于这些是实现细节,因此很难模拟。
这让我想知道 Task 类是否实际上没有违反单一职责原则。毕竟,它负责 StartDownload 的定期调用。 StartDownload 方法负责实际下载。所以我想出了一个更分离的设计:
这里任务类的职责仅限于定期调用客户端。客户的唯一责任是下载内容。测试 Task 类现在会更容易,因为我可以注入一个 IDownloadClient 模拟。
我确实想知道这是否实际上是一个更清晰的设计...... Task 类现在看起来有点奇怪,它只是一个没有任何子类的单一实现。大家觉得呢?
【问题讨论】:
-
这个问题最适合CodeReview。
-
啊,是的,我记得有类似的东西,但我找不到。我会把它放在那里,谢谢!
标签: c# design-patterns single-responsibility-principle