本文来自 Firat Atagun 的《架构演化中的软件设计原则》,文中给出了软件架构演化过程中出现的 4 种经典架构,就每种架构,分析了其主要特点并在几个度量维度给出结论。在文章的最后,Firat Atagun 给出了 4 种架构的多维对比。本文的完整演讲稿是架构演化中的软件设计原则。
1.分层架构
分层架构是最常见的架构,也被称为 n 层架构。多年以来,许多企业和公司都在他们的项目中使用这种架构,它已经几乎成为事实标准,因此被大多数架构师、开发者和软件设计者所熟知。
分层架构中的层次和组件是水平方向的分层,每层扮演应用程序中特定的角色。根据需求和软件复杂度,我们可以设计 N 层,但大多数应用程序使用 3-4 层。有太多层的设计会很糟糕,将导致复杂度的上升,因为我们必须维护每一层。
在传统的分层架构中,分层包括表现层、业务或者服务层,以及数据访问层。 表现层负责应用程序的用户交互和用户体验(外观和视觉)。通常我们会使用数据传输对象(Data Transfer Object)将数据带到这一层,然后使用视图模型(View Model)渲染到客户端。业务层接收请求并执行业务规则。数据访问层负责操作各种类型的数据库,每个访问数据库的请求都要经过这一层。
分层无需知道其他层如何去做,比如业务层无需知道数据访问层是如何查询数据库的,相反,业务层在调用数据层的特定方法时,只需关注需要部分数据还是全部数据。这就是我们所说的关注点分离。这是非常强大的功能,每层负责其所负的责任。
分层架构中的核心概念是管理依赖。如果我们使用依赖倒置原则和测试驱动开发 (Test Driven Development),我们的架构会有更好的健壮性。因为,我们要保证所有可能的用例都有测试用例。
我们需要这样的冗余,即使业务层没有处理业务规则,也要通过业务层来调用数据层,这叫分层隔离。对于某些功能,如果我们从表现层直接访问数据层,那么数据层后续的任何变动都将影响到业务层和表现层。
分层架构中的一个重要的概念就是分层的开闭原则。如果某层是关闭的,那么每个请求都要经过着一层。相反,如果该层是开放的,那么请求可以绕过这一层,直接到下一层。
分层隔离有利于降低整个应用程序的复杂度。某些功能并不需要经过每一层,这时我们需要根据开闭原则来简化实现。
分层架构是 SOLID 原则的通用架构,当我们不确定哪种架构更合适的时候,分层架