.net - 为什么.Net框架中的每个类都没有对应的接口(interface)?

标签 .net interface mocking bdd

自从我开始以测试/行为驱动的风格进行开发以来,我很欣赏模拟每个依赖项的能力。

由于像 Moq 这样的模拟框架当被告知要模拟一个接口(interface)时效果最好,我现在几乎为我创建的每个类都实现了一个接口(interface) b/c 很可能我最终必须在测试中模拟它。
好吧,无论如何,对接口(interface)进行编程是一种很好的做法。

有时,我的类依赖于 .Net 类(例如 FileSystemWatcher、DispatcherTimer)。在这种情况下,最好有一个接口(interface),因此我可以依赖 IDispatcherTimer 来代替,以便能够向它传递一个模拟并模拟它的行为,以查看我的被测系统是否正确 react 。

不幸的是,上面提到的两个类都没有实现这样的接口(interface),所以我不得不求助于创建适配器,除了从原始类继承并符合我可以使用的接口(interface)之外什么都不做。

这是 DispatcherTimer 和相应接口(interface)的这样一个适配器:

 using System;
using System.Windows.Threading;

public interface IDispatcherTimer
{
    #region Events

    event EventHandler Tick;

    #endregion

    #region Properties

    Dispatcher Dispatcher { get; }

    TimeSpan Interval { get; set; }

    bool IsEnabled { get; set; }

    object Tag { get; set; }

    #endregion

    #region Public Methods

    void Start();

    void Stop();

    #endregion
}

/// <summary>
/// Adapts the DispatcherTimer class to implement the <see cref="IDispatcherTimer"/> interface.
/// </summary> 
public class DispatcherTimerAdapter : DispatcherTimer, IDispatcherTimer
{
}

虽然这不是世界末日,但我想知道,为什么 .Net 开发人员不花时间让他们的类从一开始就实现这些接口(interface)。这让我感到困惑,特别是因为现在微软内部大力插入良好实践。

有没有人有任何(可能是内部)信息为什么存在这种矛盾?

最佳答案

接口(interface)可能非常有用,不幸的是,.NET 类库中存在遗漏,其中一个(或两个)接口(interface)可以使事情变得更清洁或更简单。

但是,您必须从另一个角度考虑它。 接口(interface)是一种契约。 接口(interface)代表一种协议(protocol),其中合约的消费者和实现者定义他们想要如何交互。当然,类也是如此,但接口(interface)被视为一种更正式和不可变的契约形式。 您不希望界面不断变化。 接口(interface)之所以有用,正是因为它们的稳定性。

话虽如此,创建一个简单地复制一个类的公共(public)接口(interface)的接口(interface)并不一定会创造值(value) .特别是如果接口(interface)不太可能有多个实现者,或者接口(interface)的解耦不会创造明确的值(value)。实际上,您可能会争辩说,过早创建接口(interface)可能是有害的,因为它锁定了可能难以理解或无法清晰捕获抽象的接口(interface)。仅仅因为模拟,作为一种实践,与接口(interface)配合得很好,并不是为每个类创建一个接口(interface)的足够令人信服的理由。

在您引用的示例中,尚不清楚界面是否会创造超出您对轻松模拟的渴望的有意义的值(value)。请记住,添加到 .NET BCL 中的每一种附加类型都会使学习曲线更加陡峭 - 更多类型意味着更多需要学习和理解的东西。

最后,直接回答您的问题, Microsoft 必须决定在每个版本中为 .NET 投入多少时间和精力 .必须设计、实现、记录、测试、维护每个功能和每个类型,等等。由于功能不是免费的,因此必须有一个令人信服的理由来实现它们以克服巨大的成本障碍。延迟 .NET 的发布以添加可能永远不会广泛使用(甚至可能有害)的接口(interface)可能不是大多数开发人员所希望的。

关于.net - 为什么.Net框架中的每个类都没有对应的接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2370905/

相关文章:

c# - automapper bool 属性为是或否

.net - 我可以使用属性让 .net 模拟另一个用户吗?

sql-server - 我可以在 SQL Server 中强制用户进行某些设置吗?

azure - 无法通过 Azure 门户中的 Powershell 运行命令启用/禁用 VM 的网络接口(interface)

Java:JButton actionListener 外植

java - 如何用mockito拦截普通对象数组的参数?

c# - CaSTLe DynamicProxy - 'classToProxy' 必须是一个类

c# - 类(class)成员是否占用内存?

c# - 使用适配器模式包装系统对象(文件、服务 Controller 等)与绕行进行单元测试相比有什么优势?

http - Karma 测试中出现错误 : No provider for HttpService!