继承或包装处理并发的课程



试图提供单位检验(使用量量)ConcurrentQueue<T>的抽象时,我正在辩论我是否失去了使用框架的ConcurrentQueue<T>实现的好处,这取决于我如何撰写抽象。p>在以下代码列表中执行一个或另一个的含义是什么:

public abstract class MyMessageQueue1<T> : ConcurrentQueue<T>
{
    public new virtual void Enqueue(T item)
    {
        base.Enqueue(item);
    }
}
public class MyMessageQueue2<T>
{
    private readonly ConcurrentQueue<T> _concurrentQueue = 
        new ConcurrentQueue<T>();
    public virtual void Enqueue(T item)
    {
        _concurrentQueue.Enqueue(item);
    }
}

在第一个实现(MyMessageQueue1)中,我隐藏了任何基类方法,以便在将呼叫传递给基类之前提供我的实现。

在第二个实现中,我将ConcurrentQueue<T>包装在内部,并在需要时通过呼叫。

MyMessageQueue2是否必须手动处理并发性,或者无关紧要,因为所有调用都传递给包裹的ConcurrentQueue<T>

您在任何一种情况下都不必处理并发,因为您所要做的只是像@nanda所说的那样委派呼叫呼叫。但是,这将有助于我们知道您的理由包装这堂课。从某种意义上说,它不使用任何外部资源(例如文件或数据库),这是相当单位测试的友好友好友好的。在课堂上使用时,您只需让它完成工作,而不是测试自己的功能,该功能使用并发。

如果您要包装它,因为您想验证方法是否以期望的方式使用它,则您可能专注于测试方法的实现而不是方法的行为。这在某些情况下可能很有用,但是您必须意识到这一事实,这不是一个普遍的做法。

在写这样的包装纸时,您会失去一件事。由于包装器具有虚拟方法,因此可以嘲笑它们,因此不能嵌入方法,并且丢失了一些性能。同意是苗条又快速的类,这实际上可能是一个问题。

如果所有包装器所做的都是授权授权,并且包装器没有自己的成员可以保护并发访问,那么对于包装器而言,无关紧要。p>但是您将在此薄包装器上进行单位测试?

最新更新