【发布时间】:2010-10-24 03:17:02
【问题描述】:
如何使 Java 桌面应用程序模块化?模块应该如何分类?
【问题讨论】:
标签: java desktop desktop-application modularity
如何使 Java 桌面应用程序模块化?模块应该如何分类?
【问题讨论】:
标签: java desktop desktop-application modularity
作为一个设计目标,模块化意味着您希望拥有一个由单独的部分(模块)组成的应用程序,其中每个部分都有其职责范围并包含与该区域相关的所有类(高cohesion),并且之间的通信这些部分是通过狭窄的、定义明确的和记录在案的接口 (loose coupling) 发生的。
您可以通过提前规划设计并在实施过程中不断调整这些平面和重构代码来实现这一目标。
区分技术模块(如 GUI、网络通信或 DB 访问)(通常形成层,尽管这些可能被细分为多个模块)和包含特定于应用程序的逻辑和域模块是很有用的通常不形成层。
【讨论】:
了解 OSGi 技术。应用程序的每个模块(称为包)都是一个单独的 jar,OSGi 负责依赖解析和动态加载包类路径等。
对于桌面应用程序,我强烈建议您查看www.dynamicjava.org 的 DA-Launcher。它使部署您的应用程序变得非常容易。他们还有一些东西,比如对任何 OSGi 应用程序都很有用的动态 JPA。
【讨论】:
你的意思是像 Eclipse 这样的模块化?
如果您的 Java 桌面应用程序基于 Eclipse RCP 或 NetBeans RCP,您将“免费”获得模块化(几乎 ;-))
【讨论】:
您的问题的答案实际上取决于您所说的“模块化”是什么意思。
在使您的应用程序模块化时,您必须考虑几个级别的问题。
首先,您必须考虑您寻求的“模块化”是架构模块化、部署时间模块化还是运行时模块化。 p>
在任何情况下,每个连续级别都意味着之前的所有级别。
对于初学者 - 要使您的应用程序模块化,您必须从架构开始。将您的关注点分成明确定义的清晰部分,这些部分具有明确定义的“外部世界”接口。使用良好的 design patterns 和 dependency injection 以及为 unit testability 进行设计在实现良好的关注点分离方面大有帮助,这是模块化设计的基石。
从小处着手,但要牢记大局。在设计更大的系统块(或模块)时,请确保它们具有尽可能少的重叠区域。每个模块都应该对它们运行的环境几乎不做任何假设,并且只服务一个单一的关注点。它需要从它的对等点提供的任何服务都应该由外部初始化显式提供(最好使用依赖注入将模块粘合到一个工作应用程序中)。
如果您的架构是模块化的,那么将关注点分离到它们自己的部署单元(以 projects、jars、bundles 的形式)是一件容易的事/em>、plug-ins、extensions 或其他),您可以在部署期间轻松开始混合和匹配各种模块,以获得特定功能所需的确切功能集应用实例。这就是我所说的部署时间模块化。
在实现部署时间模块化方面还有很长的路要走是 依赖注入 框架,如 Guice、Spring framefork 等。
运行时模块化在我看来,这类似于 Eclipse 和 NetBeans 插件或 Mozilla 扩展提供的模块化,您可以在部署/安装后更改应用程序模块的配置和设置。
这意味着某种架构和基础架构可以在应用程序初始化时或在运行时动态识别新插件/扩展。
后者还意味着您的所有模块都必须在构建时隐含假设模块使用的任何服务都可以在任何时间点轻松消失,从而付出额外的努力来确保在这个多变的世界中运行的代码的稳健性。
【讨论】:
我还会推荐 Eclipse RCP 或看看 Netbeans RCP。两者非常相似。将它们分开的一件事是 Eclipse RCP 使用本机 GUI 库而不是 Netbeans 使用的 Swing。
优点和缺点是 Elcipse 可能会更快一些,尽管您更受限于操作系统提供的控制类型。 Netbeans 使用大多数 Java 开发人员可能更熟悉的 Swing,并且开发自定义控件的能力无穷无尽。
自从我使用 Eclipse RCP 以来已经有一段时间了,所以我在 Eclipse RCP 中开发自定义控件可能是错误的。
他们的共同点是开发智能和模块化桌面应用程序很有趣,而且您可以在更短的时间内获得具有专业外观的应用程序!
祝你好运!
【讨论】:
您还可以查看 Java Plug-in Framework,
JPF 可以大大提高模块化 Java 系统的可扩展性和可扩展性 并尽量减少支持和维护 费用。
【讨论】:
【讨论】: