【问题标题】:How do I go about plug-able features and modules in Java software architecture? [closed]如何在 Java 软件架构中使用可插入的特性和模块? [关闭]
【发布时间】:2014-09-25 06:25:45
【问题描述】:
我即将开始一个新的软件项目。我知道一个好的规划和软件设计最终会导致一个成功的软件项目。
我想知道,我该如何构建一个拥有核心模块和其他可插入或附加模块的软件架构。这些模块可以根据客户的需求和定价来排除和包含,并且可以根据客户自己的配置关闭和打开。
例如,让我们以一些财务软件为例,其中有一个模块可以对市场客户进行统计。然后我的产品的一些客户不想购买这个模块,因为他们不需要它。设计我的架构的最佳方法是什么,以便我可以用最少的努力和最少的代码接触来排除 - 如果可能的话根本不接触它 - ?
我们可以讨论几个主题,比如包组织,使用一些框架,比如 JPF、接口和继承等等......
提前致谢。
【问题讨论】:
标签:
java
architecture
software-design
【解决方案1】:
这是一个非常广泛的主题,用于在 stackoverflow 讨论中对其进行总结,但让我们尝试一下。在我看来,第一个真正的基本需求是对软件将要服务的领域有非常详细的了解。在开始任何不涉及编码的设计之前,第一件事是拥有该领域的必要知识。
一旦你有了这些,你就开始定义一些核心模块,这些模块将成为你的软件的基础。例如,您通常需要 network、configuration、io、core、persistence、tools 等。我个人用一个包定义一个模块,例如,如果我说 core module i将引用包,例如:com.example.core com.example.core.utils。核心包是更多的基础设施工作。就像在开始构建真正的软件之前做好准备一样。
在黑板上设计单独的模块及其依赖项,一个好的做法是使用 maven 作为构建工具。将每个模块设计为一个单独的项目,并通过 maven 将其作为其他模块/项目的依赖项。这将形成可插拔模块。在每个模块中提供配置支持(基于 xml、json 甚至纯 txt 文件),因此可以打开/关闭或修改某些功能。因此,根据许可协议,您可以轻松地提供包含所需模块的构建,并在每个模块内部修改功能配置。
【解决方案2】:
这是一个非常有趣的问题,开发人员通常认为这是理所当然的。
一些开发人员认为仅仅跳入代码就会产生想法、需求和功能超时 - 然而这可能是正确的,但通常会危及良好的架构、灵活性和鲁棒性。
对于一个新软件,应该花时间收集需求(即使可能,阅读并获得关于领域及其当前流程、规则和其他约束的广泛和具体的理解。
- 加深对领域的理解
- 提出需求文档
- 识别域中的关键对象
- 创建一个简单的模型图并确定广泛上下文中的关系
- 确定主要用例
虽然这段时间似乎被浪费了,而且在产生想法和需求方面也陷入了死胡同,但回顾过去,人们总是会感激为实现这一目标而牺牲的时间
我最近还开始了一个新的软件项目,并且在规划方面非常艰难,但从长远来看。我和其他看过需求文档和图表的人都很欣赏它。
针对您的问题,元编程是对可扩展的核心模块进行建模的一种非常好的方法......请查看此openMRS 开源软件以了解非常好的核心架构