在 Leri 的基础上,我会更多地考虑跟踪器可能需要做的事情。
我倾向于做这样的事情:
public interface ITracker {
void BeginTracking();
void Track(ITrackerEvent trackerEvent);
void EndTracking();
}
然后所有的跟踪器都知道他们什么时候开始,什么时候结束。这很重要,因为跟踪器可能持有不应持有超过必要时间的资源。如果跟踪器不需要使用BeginTracking
或EndTracking
,则实现是微不足道的。简单的实现不是泄漏的抽象。泄漏抽象是一种不适用于所有实现的抽象。
现在假设您完全反对在每个跟踪器中使用两种额外的方法(为什么?)。相反,您可以使用带外的 ITrackerEvents 并涵盖 Begin 和 End 的语义含义。我不喜欢这个。它要求每个跟踪器都有特殊的代码来处理带外事件。
你也可以有一个单独的界面
public interface IDemarcatedTracker : ITracker {
void BeginTracking();
void EndTracking();
}
这要求您在调用代码中有特殊情况代码以检查 ITracker 是否也是 IDemarcatedTracker:
public void BeginTracking(ITracker tracker)
{
IDemarcatedTracker demarcatedTracker = tracker as IDemarcatedTracker;
if (demarcatedTracker != null)
demarcatedTracker.BeginTracking();
}
并且不要过度吹嘘事情,但我也想知道当跟踪器失败时应该发生什么?只是一味的抛出异常?这就是抽象实际上存在漏洞的地方。跟踪器没有任何流程可以让您知道它无法跟踪。
在您的情况下,您可能希望返回布尔值(有限信息)、错误代码(更多信息)或错误类/结构。或者您可能希望抛出一个标准异常。或者您可能希望 Begin() 方法包含一个委托,以便在跟踪中发生错误时调用。