软件架构模式概述

概述

在软件工程领域,我们有多种方式来设计一个系统,每种设计都有其独特的优点和挑战。有时候,不同的设计方法会试图达到相似的目标。当我们在谈论软件架构设计,尤其是在面向对象的环境中,最常被提及的三种设计模式就是整洁架构、六边形架构和洋葱架构。

我们学习这些模式时,这三种模式都在尝试提倡类似的思想。他们都定义了一个松耦合的、可以进行测试的系统,避免了在具体实现上的任何直接依赖,但却都用自己的术语来描述,并且每种模式都有其特殊的微妙之处。他们都提出了让软件架构更易于管理和测试的方法,但各有各的不同。

如果我们把这些模式整体看一下,无论你选择哪种设计方法,他们都提供了一些有用的架构经验。在此之前,让我们先来看看每种模式各自的特点以及他们之间的比较。

六边形架构

在这里插入图片描述
六边形架构有时也被称为端口和适配器架构。这种架构是由阿利斯泰尔·科克伯恩在2005年提出的,其核心思想是让应用程序摆脱对用户界面和数据库的直接依赖。这种隔离是通过端口和适配器的概念来实现的。

我们来看一个例子。假设你是一个开发者,你需要设计一个与用户相关的业务逻辑,这个逻辑需要在数据库中持久化。你希望业务逻辑和数据持久化之间有所隔离,这样他们都能各自专注并发展自己的核心职责。

  • 特定于数据库的逻辑将被封装在一个适配器类中,例如,UserDataAdapter。
  • 用户特定的业务逻辑类,如“User”。
  • User 和 UserDataAdapter 之间的接口,使它们可以相互交互 - 例如:IUserDataPort。这个接口就是一个端口。

Cockburn解释说,之所以选择“六边形”这个词,并不是因为数字六有什么特别的重要性,而是为了让架构设计者有足够的空间根据需要插入端口和适配器,确保他们不会被一维的分层图所限制。

洋葱架构在这里插入图片描述

Jeffrey Palermo在2008年提出了洋葱架构的概念。他想通过在整个系统中强调关注点的分离,为复杂的业务应用开发出一种设计方法。这种模式比六边形架构更进一步,因为它在应用程序中定义了一个核心业务层和围绕它的各个层次,使得核心层独立于外层及依赖。

核心层——也就是领域模型——包含了所有的业务规则。在其之上的是领域服务。最外层则包含了用户接口、基础设施。

简单来说,洋葱架构和六边形架构的主要区别在于,洋葱架构在应用程序中引入了不同的层级,包括核心业务层,并将与数据库和用户接口等外部依赖移到了最外层,接触耦合。如果需要,它们可以更轻松地被替换。

整洁架构

在这里插入图片描述
Robert Martin在2012年提出了整洁架构。其核心概念与洋葱架构相似,但有些术语上的差异。在这里,领域型被称为“实体”。实体包含了特定于业务的规则和逻辑,

用例封装了特定的实体操作逻辑。这些用例在实体上进行操作协调,引导它们执行业务规则以实现用例的目标。

初看之下,清洁架构相比洋葱架构,对边界的理解更好,对关注点的分离也更明确。它们的理念非常相似,但分层有所不同。整洁架构清楚地阐明了每一层存在的原因以及各自的职责。这也是为什么它被称为「screaming架构」——它让所有事物都变得明了。

架构模式原则

正如我们所见,这三种架构风格都遵循松耦合的原则,并试图通过正确地分层来最小化修改。那么,这三种模式给我们介绍了下列应该记住的架构原则:

集中管理核心业务规则

无论是整洁架构还是洋葱架构,都建议将与业务相关的规则集中管理。

独立维护特定应用规则

基于核心业务规则构建的应用层逻辑应该独立维护且与核心领域逻辑保持相独立。

单向依赖原则

这三种模式都遵循这一原则;它强调源代码依赖关系只应外部依赖内部。外层只能引用内层,反之则不行。

分层之间保持隔离

这三种模式都强烈主张应用程序的不同部分应该能够彼此独立演进,并且应用程序的每一层之间应该有适当的抽象。

最重要的是,核心业务逻辑应该与下列部分保持独立:
与存储保持独立

  • 你选择的数据库不应影响核心业务领域。
  • 如果你更换数据库类型,如:从SQL切换到NoSQL,你的商业逻辑不应该发生任何改变。
  • 领域与数据持久化之间的交互将遵循一定的标准,并且不会受到数据持久化细节的影响。

与展示层保持独立

  • 用户界面逻辑和使用情况绝不应该促使你改变核心业务领域。
  • 无论你是通过JSON,XML,还是GraphQL来展示,核心业务领域都不应受到影响。

与所选择的应用框架保持独立

  • 理想的情况是,核心业务领域应该与所使用的框架无关。这需要通过精心的抽象来实现。比如,如果你在Java中从 Springboot 切换到 Micronaut, 在 Golang 中从 Zin 切换到 Martini,或在 .NETCore 中从 WebAPI 切换到 Nancy,你定义核心业务领域逻辑都不应该发生变化。

与外部依赖保持独立

  • 核心业务领域不应该受到基础设施和相关依赖的影响。比如,如果你正在使用AWS Kinesis,但需要将其替换为Kafka streams,核心业务领域应该完全不受影响。电子邮件、短信和事件处理都是这类依赖的例子。

总结

架构模式是我们设计应用程序的核心。虽然我们可能选择不同的模式,但通过识别和理解它们的共性,我们可以遵循一些基础原则,这些原则将为设计关键的业务应用程序提供坚实的基础。在我看来,理解这些规则帮助我创建出了可扩展、可测试的软件系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值