Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 依赖注入是否违反了德米特定律_Oop - Fatal编程技术网

Oop 依赖注入是否违反了德米特定律

Oop 依赖注入是否违反了德米特定律,oop,Oop,我一直在向代码中添加依赖项注入,因为它使通过模拟进行单元测试变得更加容易 但是,我要求调用链上较高的对象了解调用链下较远的对象 这是否违反了德米特定律?如果是这样,那又有什么关系呢 例如:类a依赖于接口B,要使用的该接口的实现被注入到类a的构造函数中。任何想要使用类a的人现在都必须有对B的实现的引用,并且可以直接调用其方法,这意味着他们知道其子组件(接口B) 维基百科提到了德米特定律:“最基本的概念是,一个给定的对象应该尽可能少地假设其他任何东西(包括其子组件)的结构或属性。”它是否违法? 严格

我一直在向代码中添加依赖项注入,因为它使通过模拟进行单元测试变得更加容易

但是,我要求调用链上较高的对象了解调用链下较远的对象

这是否违反了德米特定律?如果是这样,那又有什么关系呢

例如:类a依赖于接口B,要使用的该接口的实现被注入到类a的构造函数中。任何想要使用类a的人现在都必须有对B的实现的引用,并且可以直接调用其方法,这意味着他们知道其子组件(接口B)


维基百科提到了德米特定律:“最基本的概念是,一个给定的对象应该尽可能少地假设其他任何东西(包括其子组件)的结构或属性。”

它是否违法?
严格地说,我认为是的。
这有关系吗?
违反法律的主要危险是使代码更脆弱。
如果你真的只进行测试,那么危险似乎还不算太严重。
缓解措施

我对的理解是,可以使用“包装方法”来防止直接调用对象。

它是如何破坏它的?DI完全符合最少知识的概念。DI为您提供了低耦合—对象之间的相互依赖性较小

引用维基百科:

…对象A可以请求服务(调用 对象实例B的方法),但 对象A无法“通过”对象 B访问另一个对象

通常DI的工作方式完全相同,即使用注入组件提供的服务。如果您的对象试图访问B的一些依赖项,即它对B了解很多,这将导致高度耦合并打破DI的概念

然而,我要求的对象更高 了解我的呼叫链 调用链下游的对象


一些示例?

如果我理解正确,这不是由于使用依赖项注入造成的,而是由于使用了模拟策略,您指定了希望方法进行的函数调用。这在很多情况下都是完全可以接受的,但很明显,这意味着您必须了解您正在调用的方法,如果您指定了您认为它应该做什么的话


编写好的软件需要权衡。随着实现变得更加完整,它变得更加不一致。你必须决定这些不一致性会带来什么样的风险,以及它们是否值得它们的存在所创造的价值。

依赖注入可能会违反德米特定律。如果您强制使用者进行依赖项的注入。这可以通过静态工厂方法和DI框架来避免


通过将对象设计为需要传入依赖项的方式,同时使用一种机制来使用它们,而无需显式执行注入(工厂函数和DI框架),可以实现这两种功能.

德米特定律规定,对象O的方法M可以调用在M内部创建/实例化的对象的方法。但是,没有规定这些对象是如何创建的。我认为使用中间对象来创建这些对象是完全正确的,只要该对象在生活中的目的只是为了——代表您创建其他对象。从这个意义上说,DI并没有违反德米特定律。

取决于:-)

我认为最重要的答案是不正确的,即使在框架中,很多代码都使用依赖注入和注入高级对象。然后,您将得到具有大量依赖项的意大利面代码


依赖注入最适合用于所有可能污染对象模型的东西,例如ILogger。如果确实注入了业务对象,请确保其处于尽可能低的级别,并尽可能尝试使用传统方法传递它。只有当依赖注入变得混乱时才使用它。

在我添加答案之前,我必须对其进行限定。面向服务的编程建立在OOP原则之上,并使用OO语言。此外,SOA对牙齿遵循控制反转和实体原则。因此,许多面向服务的程序员肯定会来到这里。所以,这个答案是面向服务的程序员得出的,因为SOA是建立在OOP之上的。这并没有直接回答OP的例子,而是从SOA的角度回答了这个问题

一般来说,德米特定律不适用于面向服务的体系结构。对于OO,德米特定律是指OOP中具有属性和方法的“丰富对象”,其属性也可能具有方法。使用OOP丰富的模型,可以通过一系列对象和访问方法、属性、属性的方法、属性的方法等进行访问。但在面向服务的编程中,数据(属性)与过程(方法)是分离的。您的模型(主要)只有属性(当然从来没有依赖关系),而您的服务只有方法和对其他服务的依赖关系

在SOP中,您可以随意查看模型的属性及其属性的属性。您将永远无法访问不应该访问的方法,只能访问数据树。但是服务呢?德米特法在那里适用吗

是的,德米特定律可适用于SOP服务。但同样,该法则最初是为OOP中的丰富模型设计的。尽管该法律可以应用于服务,但适当的依赖注入自动满足了德米特法则。从这个意义上说,迪不可能违法

在马克·罗迪有限的反对意见中,我找不到任何情况下,你可以合法地在同一句话中谈论依赖注入和“消费者”。如果是“c”