给定一个构造函数,它永远不必使用初始化它的几个对象的任何不同实现,使用DI仍然可行吗?毕竟,我们可能仍要进行单元测试。
有问题的类在其构造函数中初始化了其他一些类,并且使用的类非常特定。它永远不会使用其他实现。我们有理由避免尝试对接口进行编程吗?
给定一个构造函数,它永远不必使用初始化它的几个对象的任何不同实现,使用DI仍然可行吗?毕竟,我们可能仍要进行单元测试。
有问题的类在其构造函数中初始化了其他一些类,并且使用的类非常特定。它永远不会使用其他实现。我们有理由避免尝试对接口进行编程吗?
Answers:
这取决于您对“从不,从不”正确性的肯定程度(在使用您的应用程序期间)。
一般来说:
我们有理由避免尝试对接口进行编程吗?
尽管针对接口进行编码的优势非常明显,但是您应该问自己,如果不这样做,将会得到什么。
下一个问题是:有关类选择实现的责任是其一部分吗?事实可能并非如此,您应该采取相应的行动。
最终,总会有一些愚蠢的约束突然出现。您可能希望同时运行同一段代码,并且注入实现的可能性可能有助于同步。或者,在对应用程序进行性能分析之后,您可能会发现您想要一种与普通实例化不同的分配策略。否则就会出现跨领域的担忧,而您手头就没有AOP支持。谁知道?
YAGNI建议在编写代码时,一定不要添加多余的东西。程序员倾向于在甚至不知道的情况下添加到其代码中的一件事就是多余的假设。就像“此方法可能派上用场”或“此方法永远不会改变”。两者都会使您的设计混乱。
> Dependency Injection worth it **outside** of UnitTesting?
> Are we justified in avoiding trying to program to an interface?
如果您不想进行单元测试,则可以将这个问题的许多答案辩论为“您可能需要,因为..”,例如YAGNI。
如果您要问除单元测试外还有什么原因需要对接口进行编程
是的,如果需要反转控制,则在 UnitTesting 之外值得进行依赖注入。例如,如果一个模块实现需要在其层中不可访问的另一模块。
示例:如果您有模块gui
=> businesslayer
=> driver
=> common
。
在这种情况下businesslayer
可以使用driver
但driver
不能使用businesslayer
。
如果driver
需要一些更高级别的功能,则可以实现此功能,businesslayer
其中可以在common
层中实现接口。
driver
只需要知道common
层中的接口。
是的,您是-首先,忘记单元测试是围绕单元测试工具设计代码的原因,弯曲代码设计以适应人为约束永远不是一个好主意。如果您的工具强迫您执行此操作,请使用更好的工具(例如,Microsoft Fakes / Moles,它为您提供了更多创建模拟对象的选项)。
例如,是否仅因为测试工具不能与私有方法一起使用而将您的类拆分为仅公共方法?(我知道流行的智慧是假装您不需要测试私有方法,但是我认为这是对使用当前工具进行测试的困难的一种反应,而不是对不需要测试私有方法的真正反应)。
总而言之,这取决于您是哪种TDDer- Fowler所描述的“模拟主义者” ,需要更改代码以适合他们使用的工具,而“经典”测试人员所创建的测试本质上是更集成的(例如,将类作为一个单元而不是每个方法进行测试),因此对接口的需求减少,尤其是在使用可以模拟具体类的工具的情况下。