从编码风格的angular度来看,循环类的依赖性是不是很糟糕?

从编码风格的angular度来看,循环类的依赖性是不是很糟糕?

例:

在数据库应用程序中,我们有两个类,一个封装有关单个数据库( DBInfo )的信息和一个可以创build数据库连接的类。 ( ConnFactory

DBInfo有一个使用ConnFactory创build连接的getConnection方法。 但是ConnFactory本身需要一个DBInfo对象来这样做。

像这样:(为了可读性,任何编码风格都被忽视)

 class DBInfo { String name; String connectionUrl; Connection getConnection() { return ConnFactory.getConnection(this); } } class ConnFactory { Connection getConnection(DBInfo toWhat) { return new Connection(toWhat.connectionUrl); } } 

我的同事们认为这是不好的做法,如果只有一个方向的依赖关系,而不是像这里那样的循环方向,那会更好。

这是不好的做法,反模式还是代码味道? 有什么缺点吗?

一般来说,我会调用循环依赖Code Code Smell。 请注意,“Code Smell”这个术语主要表示“这里是一段需要特别关注的代码,很可能从重新devise中受益”。

在大多数情况下,我会强烈地考虑一个不需要循环依赖的devise,但是在极less数情况下,它可能没问题。

在你的例子中,ConnFactory似乎是多余的,但这可能是因为你的例子已经被裁减。 但是,在我看来,如果将连接创build逻辑移动到DBInfo类,则会更好。 当你已经拥有一个包含关于数据库的数据的类的时候,让它负责创build一个到该数据库的连接似乎是很自然的。

是的,一般来说循环依赖是不好的,但并不总是邪恶的。 循环依赖的问题包括紧耦合,相互依赖的模块和一般的多米诺效应,当一个模块的变化传播到其他模块时。

也就是说,你的代码违反了单一责任原则,因为DBInfo不仅存储关于数据库的信息,而且还负责获取Connection对象。 将这个特定的function移除到一个单独的类,一切都会很好。

不必要

我不认为循环依赖在粒度级是不好的。 如果两个,三个或者四个类别是相互依赖的,我不会看到问题。 (我不是说这是你想要的东西,但在某些情况下也可以)。

如果您在包或模块级别上存在相互依赖关系,则会出现上述和下面提到的所有原因。

这个代码只有在ConnFactory.getConnection()是静态的时才有效。 更好的解决方法是使getConnection()成为ConnFactory一个实例方法。 然后你的DBInfo可以把一个ConnFactory作为参数(如果你有一个重载的构造函数,可能在构造函数中)。 不过,我认为在这种情况下使用静态方法比循环引用更糟糕。

如果你要走这条路线,那么我也将创build一个接口IConnFactoryDBInfo将与之交互, ConnFactory将会实现这个ConnFactory 。 然后没有循环引用 – DBInfoConnFactory都将取决于IConnFactory ,这两者都不依赖。

我所知道的是,当你开始使用dependency injection框架(如结构图)时,循环依赖可能会成为一个问题。 大多数这些框架在处理循环依赖时遇到了问题,有时会导致堆栈溢出exception(赦免双关:-))因此,我倾向于试图摆脱它,除非绝对必要且无法避免。

在任何使用ORM层的应用程序中,这种常见的双向一对多关系怎么样? 这不是一个循环依赖的情况吗?

它不好/代码味道?

循环依赖是不好的,因为:

  • 两个依赖关系不止一个
  • 你不能渐进地testing(没有嘲笑其中的一个,这对于小的紧密耦合的东西来说是愚蠢的)。

如果需要的话,可以使用接口来完成所有的循环依赖,但是最简单的解决scheme是使DBInfo成为ConnFactory的嵌套类。 引用自身的单位不是循环的。