gpt4 book ai didi

c# - 设计问题——如何使用接口(interface)打破类之间的依赖关系?

转载 作者:行者123 更新时间:2023-11-30 18:08:47 24 4
gpt4 key购买 nike

我提前道歉,但这将是一个很长的问题。

我卡住了。我正在尝试同时学习单元测试、C# 和设计模式。 (也许这是我的问题。)因此,我正在阅读单元测试的艺术 (Osherove)、整洁代码 (Martin) 和 Head First Design Patterns (O'Reilly)。

我现在才刚刚开始理解委托(delegate)和事件(如果你要解决我最近的 SO 问题,你会看到)。我还是不太明白 lambda。

为了将所有这一切结合起来,我给自己设置了一个学习项目,我称之为 goAlarms。我有一个 Alarm 类,其中包含您期望的成员(NextAlarmTime、Name、AlarmGroup、Event Trigger 等)

我希望闹钟的“计时器”是可扩展的,所以我创建了一个 IAlarmScheduler 接口(interface),如下所示...

public interface AlarmScheduler
{
Dictionary<string,Alarm> AlarmList { get; }
void Startup();
void Shutdown();
void AddTrigger(string triggerName, string groupName, Alarm alarm);
void RemoveTrigger(string triggerName);
void PauseTrigger(string triggerName);
void ResumeTrigger(string triggerName);
void PauseTriggerGroup(string groupName);
void ResumeTriggerGroup(string groupName);
void SetSnoozeTrigger(string triggerName, int duration);
void SetNextOccurrence (string triggerName, DateTime nextOccurrence);
}

这个 IAlarmScheduler 接口(interface)定义了一个组件,该组件将引发一个警报(触发器),该警报将冒泡到我的警报类并引发警报本身的触发事件。它本质上是“定时器”组件。

我发现 Quartz.net 组件非常适合这个,所以我创建了一个实现 IAlarmScheduler 的 QuartzAlarmScheduler 类。

一切都很好。我的问题是 Alarm 类是抽象的,我想创建很多不同种类的警报。例如,我已经有一个心跳警报(每 (int) 分钟间隔触发)、AppointmentAlarm(在设定的日期和时间触发)、每日警报(每天在 X 触发)等等。

而 Quartz.NET 非常适合处理这个问题。

我的问题是设计问题。我希望能够在我的 Alarm 类(或任何派生类)不了解 Quartz 的情况下实例化任何类型的警报。问题是 Quartz 有很棒的工厂,它们只为我的警报类所需的触发器返回正确的设置。因此,例如,我可以通过使用 TriggerUtils.MakeMinutelyTrigger 为上述心跳警报创建触发器来获取 Quartz 触发器。或每日警报的 TriggerUtils.MakeDailyTrigger。

我想我可以这样总结。间接或直接地,我希望我的警报类能够在不了解它们的情况下使用 TriggerUtils.Make* 类。我知道这是矛盾的,但这就是我问这个问题的原因。

我考虑过将一个委托(delegate)字段放入将分配给这些 Make 方法之一的警报中,但通过这样做,我在警报和 Quartz 之间创建了一个硬依赖关系,我想出于单元测试目的和设计目的避免这种依赖关系。我想根据 here 为 QuartzAlarmScheduler 中的类型使用一个开关但我知道这是糟糕的设计,我正在努力学习好的设计。

你们太棒了,提前感谢你们的回答。

赛斯

最佳答案

也许您可以有一个 AlarmFactory 类,它会返回适当的 IAlarmScheduler 引用类型。这可能是一种隔离 Quartz 的知识及其与不同子类的关系的方法。

我不确定是否有可能做到 IAlarmScheduler 的子类完全不了解 Quartz 的细节,但完全有可能做到 IAlarmScheduler 的客户端。这就是接口(interface)和工厂组合为您所做的。

关于c# - 设计问题——如何使用接口(interface)打破类之间的依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2954447/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com