7

如何使 Java 桌面应用程序模块化?模块应该如何分类?

4

7 回答 7

6

作为设计目标,模块化意味着您希望拥有一个由单独的部分(模块)组成的应用程序,其中每个部分都有其职责范围并包含与该区域相关的所有类(高内聚),并且这些部分之间的通信通过窄,定义良好且文档化的接口(松散耦合)。

您可以通过事先规划设计并在实施过程中不断调整这些平面和重构代码来实现这一点。

区分技术模块(如 GUI、网络通信或 DB 访问)(通常形成层,尽管这些可能被细分为多个模块)和包含特定于应用程序逻辑但通常不包含的域模块是有用的t 形成层。

于 2009-05-06T08:39:03.223 回答
5

看看 OSGi 技术。应用程序的每个模块(称为包)都是一个单独的 jar,OSGi 负责依赖解析和动态加载包类路径等。

对于桌面应用程序,我强烈建议您查看www.dynamicjava.org的 DA-Launcher 。它使部署您的应用程序变得非常容易。他们还有一些东西,比如对任何 OSGi 应用程序都很有用的动态 JPA。

于 2009-05-06T08:37:15.630 回答
4

你的意思是像Eclipse这样的模块化?

如果您的 Java 桌面应用程序基于 Eclipse RCP 或 NetBeans RCP,您将“免费”获得模块化(几乎 ;-))

于 2009-05-06T08:36:08.690 回答
3

您的问题的答案实际上取决于您所说的“模块化”是什么意思。

在使您的应用程序模块化时,您必须考虑几个级别的问题。

首先,您必须考虑您寻求的“模块化”是架构模块化部署时间模块化还是运行时模块化

在任何情况下,每个连续级别都意味着所有之前的级别。

对于初学者 - 要使您的应用程序模块化,您必须从架构开始。将您的关注点分成明确定义的清晰部分,这些部分具有明确定义的“外部世界”接口。使用良好的设计模式依赖注入以及针对单元可测试性进行设计在实现良好的关注点分离方面大有帮助,这是模块化设计的基石。

从小处着手,但要牢记大局。在设计更大的系统块(或模块)时,请确保它们具有尽可能少的重叠区域。每个模块都应该对它们运行的​​环境几乎不做任何假设,并且只服务一个单一的关注点。它需要从它的对等点提供的任何服务都应该由外部初始化显式提供(最好使用依赖注入将模块粘合到一个工作应用程序中)。

如果您的架构是模块化的,那么将关注点分离到它们自己的部署单元(以项目jar捆绑包插件扩展或其他形式)是一项简单的任务,并且您可以在部署过程中轻松开始混合和匹配各种模块部署以获得特定应用程序实例所需的确切功能集。这就是我所说的部署时间模块化

在实现部署时间模块化方面还有很长的路要走,依赖注入框架,如GuiceSpring framefork等。

运行时模块化我认为这类似于 Eclipse 和 NetBeans 插件或 Mozilla 扩展提供的模块化,您可以在部署/安装后更改应用程序模块的配置和设置。

这意味着某种架构和基础设施可以在应用程序初始化时或在运行时动态识别新插件/扩展。

后者还意味着您的所有模块都必须在隐含假设的情况下构建,即模块使用的任何服务都可以在任何时间点轻松消失,从而付出额外的努力来确保在这个不稳定的世界中运行的代码的健壮性。

于 2009-05-08T13:29:19.927 回答
1

我也会推荐 Eclipse RCP 或者看看 Netbeans RCP。两者非常相似。将它们分开的一件事是 Eclipse RCP 使用本机 GUI 库而不是 Netbeans 使用的 Swing。

优点和缺点是 Elcipse 可能会更快一些,尽管您更受限于操作系统提供的控制类型。Netbeans 使用大多数 Java 开发人员可能更熟悉的 Swing,并且开发自定义控件的能力是无穷无尽的。

自从我使用 Eclipse RCP 以来已经有一段时间了,所以我在 Eclipse RCP 中开发自定义控件可能是错误的。

他们的共同点是开发智能和模块化桌面应用程序很有趣,而且您可以在更短的时间内获得具有专业外观的应用程序!

祝你好运!

于 2009-05-06T09:39:26.963 回答
1

您还可以查看 Java Plug-in Framework,

http://jpf.sourceforge.net/

JPF 可以极大地提高 Java 系统的模块化和可扩展性,并将支持和维护成本降至最低。

于 2009-05-06T12:07:16.313 回答
0

试试 Spring RCP

http://www.springsource.org/spring-rcp

在组织应用程序的 GUI 部分时...

于 2009-05-06T12:54:04.907 回答