介绍

如果您曾经在IT项目中工作过,您可能会知道分解源代码的必要性,以避免熵随着项目变得越来越大而被您所拥有……如果您遇到过其中一种情况:

  1. 我从一个小项目开始,该项目一切都很好,但是随着它的发展如此之快,以至于很难在代码中正确地找到我的逻辑!
  2. 我有一个庞大的系统要设计,我需要考虑一个可扩展,灵活,可扩展和可扩展的体系结构!

好吧,可能您需要的是多层体系结构 (MLA)。 MLA是一种体系结构模型 ,建议将软件组件组织到不同的层中。 这些层中的每一层都实现为软件组件的物理隔离容器。

MLA背后的主要设计原理是关注点分离 (SoC)。 可以根据项目的类型来考虑问题,唯一的限制是必须清楚并明确定义不同问题之间的界限。

在本文中,我们将介绍可用于创建MLA的最常见SoC。 我个人在大型项目的重构过程中经历了这种模型,该项目从模块化架构开始,然后在必须将质量和安全规范应用于需要更高可测试性 (项目测试,集成测试)的项目开发过程中之后进行重构,非回归测试,功能测试), 可追溯性 (对源代码的要求和对软件设计组件的要求)和代码质量(我们在谈论SIL…)。

设计MLA需要什么

要构建MLA,您不需要特定的技术或供应商平台,但是最好使用允许实现松耦合组件的技术,例如:

  • 服务合同/实施物理隔离(如SOA,Web服务的WSDL和Rest服务的HTTP)
  • 依赖注入
  • 依赖查找

层由松散耦合的组件组成,但是每一层都可以看作是一个组件,因此可以将设计原理应用于该层。 例如,我们可以使用此原理实现体系结构可组合性。 这将在基础结构层部分中进行更好的描述。

在我的情况下,该应用程序是使用NetBeans胖客户端平台构建的 ,该平台支持通过Lookup API( Java 6 ServiceLoader的扩展)进行松散耦合。

4层

整个系统可分为4个主要层:

  • 应用
  • 基础设施
  • 介绍

看下面的依赖关系图,我们可以修复一些主要概念:

多层架构的部署优势 多层体系结构_java


  • 域层是体系结构的基础,它包含从项目范围派生的业务域构建的所有实体。
  • 应用程序层使用所有域实体和逻辑来构建基本的应用程序逻辑,可以对其进行组装和组合以创建更大的流程。
  • 基础结构层定义了与所用技术的链接,例如数据库持久性,文件系统,旧系统,XML持久性等。该层的主要重要性在于,它提供了域和应用程序层中定义的服务的实现。 正如您在依赖关系图中所看到的那样,由于它是服务提供者组件的简单组成,因此可以通过另一种实现轻松更改它。
  • 表示层包含所有用户界面和流程定义。 它可以是带有动作的Java Swing层,用作在单个事务中构成不同应用程序逻辑的流程入口点,也可以是集成到Web应用程序中的面向Web的用户界面层。 同样,可以更改此层,作为基础结构层。

企业注意事项

从企业的角度来看,拥有MLA可能会非常有趣,因为它自然会支持IT资源的可重用性 ,从而支持整个企业的敏捷性。 考虑到这种架构模型,我们可以想象域层可以创建联合的IT资源 ,该资源可以在企业的不同项目之间轻松共享。 这就是为什么在设计域层时自治是要考虑的重要设计原则。

应用程序层仍然有机会被重用,但是在大多数情况下,它与特定需求相关联,因此与本质上不是可重用的流程相关。

最后, 基础架构和表示层的存在只是为了支持一个项目,因此除了可重用性之外,其他原则也更重要,例如可伸缩性性能简单性

建立MLA

放置MLA后,构建策略可能会非常简单。 您必须考虑到每一层都是物理上分离的代码源,因此,它很容易允许创建仅占用必要层的应用程序构建,并且仅从每一层仅构建要构建的应用程序的必要模块。 如果使用的平台支持模块化体系结构模式 (例如NetBeans平台Eclipse平台) ,则任务将更加容易。 可以仅使用部分功能部件,也可以使用处于开发中的新层的实验模块 ,使用不同的基础结构提供程序来构建应用程序。

测试MLA

一旦将松散耦合完全应用到我们的MLA中, 可测试性就会获得动力。 您将看到在自动化测试环境中为每一层独立地创建测试作为JUnit是多么容易。 使用诸如Jenkins之类的持续集成工具和诸如Sonar之类的质量工具 ,我们可以轻松地在每一层的源代码上使用质量指标,从而有机会轻松区分潜在问题或代码中需要改进的地方。

最终,各层分离允许轻松地将功能需求与系统模块对应起来,从而有助于评估变更的影响,从而确定在发行之前需要再次通过哪些测试。

结论

自然,提出的模型不是唯一可能的模型,也不是最佳模型。 MLA的设计可能会有所不同,并且取决于项目的范围,需求,技术和应用领域。 到目前为止,我们刚刚讨论的是应用几种设计原则的真实案例,这些原则允许创建MLA来管理项目开发过程的 高质量和安全规范规范。

顺便说一句,这是最常见的模型,我相信它可以完美地适合独立或分布式应用程序,并且与SOA设计(考虑实体,实用程序,应用程序和流程服务类别)具有很大的并行性。