是否有证据表明依赖注入的使用可以改善软件工程的结果?


18

尽管它很流行,但是是否有任何经验证据表明依赖注入(和/或使用DI容器)有助于例如减少错误计数,提高可维护性或提高现实软件项目的开发速度?


3
依赖注入的可能重复项:如何出售 在您只看标题并认为“嘿,这实际上不是骗子”之前,请阅读其他问题和答案,我认为它们非常适合此问题。
布朗

5
接受许多专业软件开发实践没有“科学证据”的事实,它们是基于实践经验的。因此,即使您现在只是为了使人为地使其比我链接的问题少“重复”而恶化了您的问题,您本应该获得真正想要知道的答案的真正问题是我链接的其他问题。顺便说一句,现在看来您正在请求第三方资源,该资源不在本网站上。
布朗

6
在软件开发中,很少有技术伴随着科学证明,在这种科学证明中,您可以指向研究论文并明确声明技术是有价值的。因此,我们大多数人都依赖经验和成本/收益分析来证明我们的决定合理。您选择诸如依赖注入之类的技术是因为您需要它提供的好处,并且这些好处超过了成本。不可否认,演算总是有些主观的。
罗伯特·哈维

1
@DocBrown老实说,我本人既不认为这是重复的,也不是离题的。开发实践的原理和功效似乎与SE.SE 非常相关。而且,我将提供答案。OP可能不会喜欢我的答案...但是,我认为有必要客观地回答(几乎是回答)TPO和PM是否可以期望看到他们的团队的生产力神奇地提高(或错误率下降),因为有人大喊“依赖注入”。
svidgen

3
@gnat可能值得针对“证据”问题开始一个独特的元问题,在我投票支持很久之后,这些问题就被添加到了“场外资源”元答案的范围内。当然,要求我们去查找统计信息可能没有帮助。但是,问题的实质是完全合理的。而且,对我来说,如此快地将其取消话题听起来有些懒惰。这里的评论特别给人一种印象,我们是一群DI教条主义者,根本无法捍卫我们的做法。好吧,我们可以。而且我们应该。
svidgen

Answers:


14

TLDR

经验数据无关紧要。工具和实践(例如DI)可以解决特定问题。了解您的问题,学习如何使用这些工具,当一个工具有价值时,它将变得很明显- 并且您将比任何广义的,汇总的,经验性的数据更能预言性地解释结果。


现在,有了更多的冗长...

有经验证据吗?

当然可以。或者至少是。但谁在乎?这无关紧要。

DI的统计成本效益分析在学术上可能很有趣,但不一定能预测个人成功。汇总结果隐藏了个人的成功和失败。而且,我可能会争辩说,有关“福音”实践的数据特别有毒。这些纪律往往会吸引狂热者和傻瓜,这两者都掩盖了“纯”实施的净影响,而您可能两者都是!

那么,我们怎么知道依赖注入绝对有价值呢?

好问题!实际上,很棒的问题。我支持您-我讨厌浪费时间和精力在教条主义的“最佳实践”上,没人能证明。所以,很高兴你问。

嗯 但是,这是一个令人尴尬的问题…… 总的来说知道。而且,更令人尴尬的是,通过引入DI,您的代码实际上可能不会以任何方式变得更好。


喘气!

    ⊙▃⊙     . . .      (╯°□°)╯︵ ┻━┻

...


所以,也许现在你在想...

我为什么要烦恼“没有被证明是疯子”!?

首先,在辩论的每个方面,让我们都安顿下来。我可以向您保证,在教条主义和怀疑论之间,存在着一个美丽的理性和头脑冷静的天堂。(还有偶尔出现的古怪的SE.SE帖子。)而且,POAP可以带您到达那里。

...我指的是适用原则

原则,模式和实践不是最终目的。因此,每种方法的良好和正确应用都会受到更高,更最终的目的的启发和约束

您需要了解为什么要做自己在做的事情!

(POAP不受POAP的限制。)

(我想说的是“强调我的”,但这还是来自我自己的“博客”。所以,这全都是我的!)

让我重申这里的要点:您需要了解为什么要执行自己的操作。

也许需要澄清的是,采取任何给定的“东西”(例如“依赖注入”)通常是没有意义的,而在没有了解要解决的问题的情况下使用它(特别是针对您)。如果您了解自己的问题以及“某物”(如DI)的工作原理,那么“某物”的帮助将在某种程度上“显而易见”,而无论广义,汇总,经验数据的含义如何。

如果DI 对您的帮助或帮助不是很明显-或至少超出了您的推理能力-您要么不了解DI,要么不了解自己的问题。


让我们考虑一个现实世界中的“寓言”。

我们需要构造一个盒子。我们有木头。我们有指甲。并且,我们有两种工具:标准的羊角锤螺丝刀

现在,我们可能有一些广泛的经验数据表明,与用锤子建造的那些盒子相比,用螺丝刀建造的盒子总体上更坚固。但是,如果您试图将那些钉子拧进去,那么最终将根本没有盒子。而且,如果尝试用螺丝刀敲击它们,则最终可能会将它们插入。但是,这将需要更多的时间和精力,并且最终结果将比仅使用锤子的精度(和鲁棒性)低。

而且,如果您曾经见过有人使用过任何一种工具,并且了解了盒子的外观,那么决定就显而易见了。

心灵感应!

嗯...嗯...


是的,因此依赖注入解决了什么问题?

它可以防止僵化的,不可配置的代码,而这些代码通常是无法测试的

它通过允许调用代码来确定模块使用哪些对象来实现此目的。我知道您在想,您是对的:这甚至不是一个遥不可及的新概念。自代数发生以来,方法/功能参数一直存在。

一旦我们积累并继承了足够多的代码以查看我们的不平衡状态,我们便开始传播基本参数传递,称为“依赖注入”。仅仅因为依赖关系被隐藏起来,我们就无法轻易地更改,测试甚至重用我们坐在上面的大量代码。

因此,对依赖注入的热心十字军...

K.但是,我可以通过论点。为什么使用框架

据我了解,DI 框架主要解决了样板增加的问题(由于过分的DI和IMO)-尤其是当所有需要它们的模块都有标准的“默认”依赖项时。当在调用点未显式传递默认依赖项时,DI框架会做一些神奇的事情(甚至可能很顽皮!)。(以这种方式使用时,与服务定位器的效果相同,请注意!)

依赖注入作为“学科”,实际上真的很难解决。是否使用DI都不是问题。要知道哪些依赖项可能会更改或需要模拟并注入这些依赖关系。然后,要确定DI是否比某些替代方法(例如服务位置)更适合自己。

但是,我鼓励您使用Google,可能会看到这样的答案,可能会与您行业中经验丰富且成功的开发人员交谈,并将特定示例发布到CR.SE上


4
您是否一直在嗅@CandiedOrange的胶水?+1适用于应用目的原则。
罗伯特·哈维

1
@RobertHarvey希望我能说我新谈论的是哪种胶水!我长期以来反对基于信仰的工程技术的仇杀……除非您指的是该职位的叙述性(甚至可能是滑稽的)性质?
svidgen

2
给下注者的附带说明,除了平衡良好的上下投票之外,没有什么比让我更加自信地回答问题的决定了!...这是很高兴看到你的批评中,虽然评论...
svidgen

3
@RobertHarvey不确定您指的是我的胶水中的哪一种,但我发现自己同意这句话。当锤子用在螺丝上时,很容易想到锤子会吸。
candied_orange

开始编辑以包括有关DI的更多详细信息,并将TLDR冒泡到顶部。然后孩子们开始大惊小怪,所以我点击了保存。...如果我无意间失去了您所批评的内容(对于所做的那些人),请告诉我!
svidgen

12

我搜索了Google,Google Scholar,ACM和IEEE,以下是我能够找到的论文:

  • 依赖注入框架:可测试性的改进?。它认为“可测试性”可以定义为“低内聚性”。它指出,DI导致较低的内聚力,较低的内聚力与较高的测试覆盖率相关,而较高的测试覆盖率与发现的更多故障相关。它说,基于此,DI提高了可测试性。

    我不喜欢这样做有几个原因。首先,这是说“ A与B相关联,B与C相关联,因此A导致C”,这是我认为在逻辑上没有得到很好支持的几个步骤。其次,它承认它只是在测量“可测试性的各个部分”,而“可测试性”通常很难定义。最后,它们的可测试性度量是根据注入的依赖项的数量定义的!

  • 依赖注入对可维护性的影响。他们将使用DI的项目与在SourceForge上发现的不使用DI的项目进行比较,并查看内聚度指标是否存在差异。为了减少偏差,他们将项目配对为尽可能相似的项目。最终,他们看到了信号,即具有大量DI的项目与具有少量DI的项目相比耦合程度较小。但是,DI项目与其非DI对之间的内聚性似乎没有显着差异,因此这可能是特定领域的结果。他们将“没有相关性”列为主要结果,而“也许有一点帮助?” 作为进一步研究的主题。

  • 根据经验评估依赖注入对Web服务应用程序开发的影响。摘要并没有真正解释他们在寻找什么。我挖了一个预印本,据我所知,这实际上是关于自动化工具如何很好地发现服务。以DI风格编写的服务更容易发现。而且,它引用了我列出的先前的研究,作为经验证据表明DI减少了耦合,这与该论文所声称的相反。

对于这三篇论文(以及关于Java中依赖注入的使用的实证研究(仅与检测有关)),我都引用了所有引用它们的论文,但这些论文都与确定DI的有效性无关。鉴于这一切,我有信心说,,我们还没有对DI是否提高软件质量的经验证据。


2
这直接回答了问题。+1
马修·詹姆斯·布里格斯

3
@MatthewJamesBriggs我不是拒绝投票的人,但是,如果答案有误导性或不完整,回答问题是否直接相关?
svidgen

@svidgen我看不出答案是否完整。问题是“我们是否有经验证据证明DI起作用?” 答案是“否”。那没说关于它是否有效,只是没有任何研究。
Hovercouch

1
不完整且具有误导性,因为您可以回答,因此将“证据”的范围限制为“您已经(能够)找到的论文”,并掩盖了“有效性”,而没有尊重DI的实际目的,并且您拥有因此得出的结论是,没有资格的回答是“否” ...我会争辩说,如果您要“直接”回答问题,正如@MatthewJamesBriggs建议您那样做,那么深入挖掘自己并承担很大的责任。能够高度肯定地证明您已经探索了所有途径……
svidgen

1
我猜,当结合起来,与您的一个资源的草率评估没有举,我甚至把这个答案非常误导。因为,除了您忽略的所有潜在证据之外,您还需要获取记录在案的证据,并出于未完全解释的原因立即将其剔除。...例如,如果我要宣称“没有证据证明我们降落在月球上”,因为我在此问题上读过的“唯一”论文来自“我不赞成”的“过时”教科书修订版信任,我希望您会对我的方法表示怀疑...
svidgen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.