【发布时间】:2012-08-27 17:03:31
【问题描述】:
我无意中听到以下内容,并被要求确认此声明:
“SOLID/TDD 鼓励一个接口一个实现,这不是现实世界,违背了接口的观点,不是吗?”
我最初同意 TDD 和 DI 的所有在线示例都遵循典型的 IRepository/MyRepository 示例,其中只有一个实现。再三考虑后我不同意。
我正在尝试做的是提供证明它不存在的证据,以及一个接口可以有多个实现的示例,并展示它在 DI 方面的工作原理。
我希望人们可以帮助我解决这个问题。
更新:虽然我了解 DI 和单元测试的概念,但我想展示的是我们如何在生产中让多个类实现一个接口。
UPDATE2: 想到了一个简单的例子,这里有多个实现的可能实现,但它仍然不能真正回答我想要的。如果您有一个对 ILogger 或 IDataProvider 或 ISomething 具有单一依赖关系的构造函数怎么办:
public interface ILogger
{
void Write(string data);
}
public class FileLogger : ILogger
{
void Write(string data)
{
//
}
}
public class DBLogger : ILogger
{
void Write(string data)
{
//
}
}
public class EventViewerLogger : ILogger
{
void Write(string data)
{
//
}
}
public class Calculator
{
private IEnumberable<ILogger> loggers;
public Calculator(IEnumberable<ILogger> loggers)
{
this.loggers = loggers;
}
public int Add(int a, int b)
{
var result = a + b;
foreach(var logger in loggers)
{
logger.Write("Result was " + logger);
}
}
}
【问题讨论】:
-
相关:stackoverflow.com/questions/5411648/… 。孤立地进行单元测试时,您通常会得到一个接口,该接口由测试替身和精确的 one 生产类实现。
-
对我来说这根本不是问题,我们创建的接口期望可能有多个实现...这就是让您的应用程序更灵活的原因...我真的不明白你为什么不想证明它...底线是即使您在 TDD/SOLID 中...使用接口的目的是指定一个合同并且可以由多个类实现...而不是试图证明这一点。 ..让要求您证明的人提高他/她的 OOP 技能...
标签: unit-testing design-patterns dependency-injection tdd solid-principles