1

我正在尝试在 Java 中实现某种 MVC。实际上,它更像是一个 MVP,但这对我的问题并不重要。

以下情况:我有一个使用 Netbeans 制作的 GUI(因为有更好的 GUIeditor),它经常更新和更改。

由于我的主项目在 Eclipse 中更易于维护,因此我选择将 Netbeans 项目作为单独的项目导入 Eclipse。所以这里我有一个App包含控制器和模型包的项目“ GUI”和一个包含视图包的项目“”。问题是我遵循的模式在视图和控制器之间具有循环依赖性。每当视图更改时,控制器都会收到通知,决定从模型中获取哪些数据,然后对视图进行更改。

当我添加App到构建路径时GUI,反之,我将收到此错误消息“在项目'GUI'的构建路径中检测到循环”。我的意思是这是真的,这个循环已经在我的设计中了。

目前在启动时,我通过以下方式向其控制器注册一个视图(这不是真正的代码,我正在尝试缩短它)

package view;
import controller.*;
class viewA{
   ...
   public viewA() {
       controllerA.register(this);
   }
   ...  
}

package controller;
import view.*;
class controllerA implements SomeListener{
   ...
   protected viewA[] registeredViews;
   public static register(viewA interestedView){
       arrayPush(registeredViews,interestedView);
       interestedView.addSomeListener(this)    
   }
   ...
}

因此,您会看到连接是通过将引用传递给控制器​​然后将侦听器注册到此视图来建立的。问题是:如果我GUI在 's buildpath 中没有项目,App则无法解决导入问题,在没有 in 's buildpath 时也会发生同样的App情况GUI

我想保留这个项目结构并坚持我的 MVC 架构。我该如何解决它?你有什么建议?

4

4 回答 4

7

你让你的听众从通常的方式倒退——通常,控制器有主动权。它创建视图对象并将自己注册为视图事件的侦听器。

此外,监听器类型应该是 View 项目中定义的接口。然后,Contoller 实现该接口,视图不必知道具体的控制器类。循环解决。当然,您也可以在“反向”设置中执行此操作。

于 2009-04-21T22:50:57.527 回答
4

类之间的循环依赖本身不是问题(它是一个特性)。但是,您应该检查您的设计并证明依赖关系的合理性。

Eclipse 项目可能有点过度使用。不幸的是,Eclipse 并不能真正处理很多(10+ 左右)项目,而且其他优秀的部分编译器变得更慢,并且编译过程似乎变得更加错误。

在我参与的几个开发项目中,合并和减少项目数量导致构建时间更短,构建问题更少。

在内部应用程序中,无论大小,如果每个编写代码的人都可以访问所有代码,那么在项目之间划分代码实际上没有什么意义。

如果您担心跟踪依赖关系,可以强制执行包之间的依赖关系规则。

大型应用程序中的每个“模块”都有一个“业务层”项目、一个“数据”层项目和一个 gui 项目是很常见的,如果你不创建,你最终会得到一些循环依赖人工“界面项目”等。

在您竭尽全力删除依赖项之前,请考虑依赖项实际上是否真实,并且可能应该合并项目。

请记住,诸如“模块”或“层”之类的抽象概念并不一定意味着您必须拥有匹配的项目或文件夹(或其他)。Eclipse 项目是您处理的一组文件,实际上或多或少。

您可能想阅读有关the-mythical-business-layer 的内容。

于 2009-04-22T06:17:16.173 回答
2

首先,您可能希望使用接口而不是实际的类来表示控制器和视图。

这类问题相当普遍,不幸的是,我认为没有真正好的解决方案,因为项目不应该在 Eclipse 中创建循环(它们是否允许在 Netbeans 中创建?我觉得这很令人惊讶)。

你能做的最多就是相互独立开发,并使用具有系统每个部分所依赖的共享接口的公共项目。这可以在某些设计中起作用。然后,您可以拥有另一个知道这两个部分并进行实际初始化的驱动程序项目。

如果你真的想避免这种情况,你可能需要使用像 Spring 这样的依赖注入。

于 2009-04-21T22:35:02.637 回答
1

您也可以只将两个项目之一的 .jar 文件添加到另一个项目,而不是使其依赖于项目本身。只要记住在必要时更新 jar。

于 2011-12-08T22:59:47.843 回答