自从我开始以测试/行为驱动的风格进行开发以来,我很欣赏模拟每个依赖项的能力。
由于像 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/