【发布时间】:2018-09-15 14:51:35
【问题描述】:
我已经阅读了依赖注入和接口,但我仍然对在我的情况下解耦包的最佳方法感到困惑。假设我在 UIPackage 中有一个 UIClass:
package UIPackage;
import NetworkPackage.NetworkClass
class UIClass() {
public static void displayMessage(String message) {
// show the message on screen
}
private static void messageEntered(String message) {
NetworkClass.sendMessage(message);
}
}
和 NetworkPackage 中的 NetworkClass:
package NetworkPackage;
import UIPackage.UIClass;
class NetworkClass() {
public static void sendMessage(String message) {
// send the message to the network
}
private static void messageReceived(String message) {
UIClass.displayMessage(message)
}
}
这些包相互依赖,但我想让网络包独立于 UI 包工作以消除依赖循环。到目前为止,我发现这样做的唯一方法是为 UIClass 创建一个接口来实现(UIInterface),然后将 UIInterface 的一个实例传递给构造函数中的 NetworkController 或其他东西。这似乎只是让事情变得更加复杂,因为该接口需要在它自己的包中,然后包含在两个原始包中。
我应该为这种类型的接口创建第三个包吗?我应该离开循环依赖而不担心它吗?
说明 1
这不是我实际使用的代码,我只是这样命名包,以便示例更清晰。该应用程序使用多个线程,这就是为什么NetworkClass 需要对UIClass 的引用,因为它一直在等待新消息,而 UI 可能在不同的线程上做其他事情。当收到消息时,它需要能够更新 UI 并显示消息。这些包有许多其他类做其他事情,但为了举例,这些类都是公开的。
【问题讨论】:
-
您不能离开循环依赖,因为您将无法构建您的代码。看起来你需要重新设计你的架构。如果A依赖B,B依赖A。应该有一个模块C,A和B都依赖。因此,从 A 中取出 B 所依赖的部分和 B 中 A 所依赖的部分,然后将它们放入 C 中。希望有所帮助
-
另外,包名应该小写:)
-
理想的答案是肯定的,你应该创建一个接口来消除循环依赖。您认为它很复杂,但实际上并不复杂,它为您提供了可扩展性。
标签: java dependencies package decoupling coupling