我已经阅读了依赖注入和接口,但我仍然对在我的情况下解耦包的最佳方法感到困惑。假设我在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并显示消息。这些包有许多其他类可以执行其他操作,但是为了示例,这些类都是暴露的。
答案 0 :(得分:1)
循环依赖性通常意味着两个组件/事物之间的强耦合 这是一个问题吗? 它经常但并非总是如此。
可能导致问题的3个示例:
1)如果依赖项试图通过将另一个作为参数传递来创建自己。这显然是不可能的。使用在实例构造之后设置其中一个依赖项或两者的方法是解决它的方法。
2)如果依赖项的代码经常变化,因为对一个类的更改可能会产生副作用或者破坏另一个类的代码。
就好像这些类是单个类,而事实并非如此。
3)如果你想在其他环境或应用程序中单独重用其中一个依赖项 如果没有另一个人,你们就无法生存 因此它可以减少或防止依赖性可重用性。
答案 1 :(得分:0)
当然你应该关心,就像你应该注意Java编码惯例一样。
我认为嵌入"包"在包名和" Class"在班级名称是脑死亡。几十年前,匈牙利的符号已经失宠了。拿出来。
这是一个糟糕的设计。
我不知道你的Network
课程的用途。我认为Network
没有理由知道或关心调用它的Client
。如果Client
引用了注入其构造函数的Network
,它应该能够使用它来发送调用,获取响应并显示它。没有充分理由对Client
提供Network
引用。
不再有循环依赖。
我希望更像四层架构:
客户 - >控制器 - >服务 - >持久性
这是Web应用程序的典型请求/响应安排。 UI向控制器/侦听器发送请求,该控制器/侦听器协调服务和持久性以完成用例并将响应发送回UI。
如果使用基于事件的异步架构,图片会发生变化。