Oop 一个类/包究竟什么时候依赖于另一个类/包?

Oop 一个类/包究竟什么时候依赖于另一个类/包?,oop,architecture,dependencies,Oop,Architecture,Dependencies,许多文章/书籍/。。。。谈到类或包依赖关系,很少有人解释它是什么。我确实找到了一些定义,但它们各不相同,可能并不涵盖所有情况。例如: (因此不存在对接口的依赖?) (继承权呢?) (所以依赖关系不仅在包上,而且在类级别上都是一种传递关系?) (但如何定义“依赖”?) 进一步考虑的是方法参数、依赖注入、面向方面编程、泛型。还有其他方面吗 那么,你能给类之间和包之间的依赖性给出一个(正式的)定义吗?这个定义很简单,涵盖了所有这些情况和方面吗?如果你在控制反转或依赖注入的上下文中要求依赖性,那么,

许多文章/书籍/。。。。谈到类或包依赖关系,很少有人解释它是什么。我确实找到了一些定义,但它们各不相同,可能并不涵盖所有情况。例如:

  • (因此不存在对接口的依赖?)
  • (继承权呢?)
  • (所以依赖关系不仅在包上,而且在类级别上都是一种传递关系?)
  • (但如何定义“依赖”?)

进一步考虑的是方法参数、依赖注入、面向方面编程、泛型。还有其他方面吗


那么,你能给类之间和包之间的依赖性给出一个(正式的)定义吗?这个定义很简单,涵盖了所有这些情况和方面吗?

如果你在控制反转或依赖注入的上下文中要求依赖性,那么,你可能对直接相互交互的类感兴趣。这主要意味着构造函数参数和属性

在UML领域图的上下文中,您可能对“真实世界”的依赖性感兴趣。狗需要食物。这是一种依赖。狗的
Bark()
方法返回一个
声音
对象:在UML域模型中,这不是你感兴趣的东西。狗不依靠声音生存

你也可以从哲学的角度来看待这个问题:所有的类都相互依赖以实现一个共同的目标;一个(希望是)很棒的软件


因此,总的来说,依赖或耦合不是一个是或否的问题。它实际上取决于上下文和耦合程度(弱、强)。我认为这就解释了为什么对依赖有很多不同的定义。

这篇文章是关于静态依赖的——关于动态依赖及其区别,请参见 帕特里克·斯马奇亚的回答

以一种易于理解的方式:当A不能独立使用而没有B时,实体(类或包)A依赖于实体B

继承、聚合、组合,所有这些都引入了相关实体之间的依赖关系

所以不存在对接口的依赖

有,但接口只是作为粘合剂

继承权呢

见上文

所以依赖关系不仅在包上,而且在类级别上都是一种可传递的关系

是的

但你如何定义“依赖”

见上文“易于理解”的定义。也与您发布的第三个定义相关


更新:

所以,如果在包P1中有接口A,而包P2中的类C使用A作为

  • 方法参数,或
  • 通过AOP编织到C中的局部变量,或
  • C类实现了
    ,或
  • C类
然后C依赖于A,P2依赖于P1


但是,如果接口A是由类B和类C程序针对接口A实现的,并且只通过依赖项注入使用B,那么C仍然(静态地!)只依赖于A,而不依赖于B,因为依赖项注入的要点是它不会使粘合组件依赖

不久前我就这个话题写了一篇博文:。基本上,您需要区分编译时由编译器解析的静态依赖项和运行时(JVM或CLR)解析的动态依赖项

静态依赖通常是由对静态/最终方法的调用、对字段的读/写、类C的定义、接口I的C。。。在字节码和源代码中可以明确找到的代码元素之间的所有这些关联

动态依赖通常是由在编译时抽象方法调用的所有内容引起的,比如对抽象/虚拟方法(多态性)的调用、使用接口键入的变量或参数(实现类在编译时抽象),以及对函数的委托(.NET)或指针(C++)

大多数时候,当您阅读文献中的依赖关系时,他们谈论的是静态依赖关系

静态依赖关系是直接的(表示不可传递)。我在博客文章中提到的一个工具,也可以从一组直接的静态依赖中推断间接的(或称之为传递的)静态依赖


我在博客文章中捍卫的观点是,在理解和维护一个程序时,需要主要关注源代码中的静态依赖项。。事实上,抽象设施是用来。。。摘要,调用方的实现。这使得源代码更易于开发和维护。然而,在某些情况下,通常是在调试时,人们需要知道运行时抽象背后的真正含义。

如果依赖关系是可传递的,则意味着大多数类彼此依赖。如果
A
依赖
B
B
依赖
C
A
也依赖
C
?在大多数情况下,我不这么认为。@布赖恩:我觉得类级的及物性也很奇怪。因此,也许Martin Fowler的定义应该是“类A依赖于类B,如果对B的定义的更改可能导致对A的直接更改,即不是通过连锁反应”。你认为依赖关系在包级别应该是可传递的吗?@Bryan IMO,是的。但在这种情况下,A通过B隐式地依赖于C。为了证明这一点,您不能只使用A或B或两者来构建应用程序。无论何时你需要A,你都需要B和C。@DaveBall第一个问题:是的。第二个问题:不,A不依赖于C也不依赖于B。依赖项注入不会使粘合组件依赖。但也许我没有正确理解你的观点,你能举一个具体的例子吗?好的观点,我还认为依赖性是一个程度,而不是一个是/否(又称二进制)的问题。但是在依赖性反转/静态分析/设计原则的背景下,每个人都在关注我们