目录
这次我们将讨论"干净架构",它是什么,什么时候应该使用,什么时候不应该使用?我们将深入了解为什么需要垂直切片架构,并分享一些关于干净架构和领域驱动设计的学习资源。
什么是干净架构?
"干净架构"哲学强调软件设计中关注点的分离,创建模块化、可测试、可维护的代码的重要性。由软件工程师和顾问 Robert C. Martin 发展并于2012年在这篇blog上介绍的。
干净架构提倡的是,软件系统应该被设计成能够被长期理解和维护的。为了实现这个目标,干净架构提出了一种分层架构,明确不同系统组件之间的边界,实现对框架、UI、数据库和交付机制的独立性,并可以单独进行测试。干净架构从六角架构(又称为端口和适配器)借鉴了一些想法,该架构强调将业务逻辑与外部依赖分离。这种架构模式通过将核心应用程序与外部框架和库解耦来促进更易于测试和提高灵活性。
干净架构哲学定义了一系列层次结构,从最一般、最抽象的层次开始,逐渐向更具体、更具体的层次移动。这些层包括:
-
实体:系统的基本对象,代表核心业务逻辑和数据。他们封装了最一般和高级的规则。
-
用例:高级系统与其用户或其他外部系统之间的交互,包含应用程序特定的业务规则。这一层不应对实体或外部系统产生影响。
-
接口:系统与外部系统或用户进行通信的机制。这里,我们可以有一个 GUI 的 MVC 架构。
-
控制器:负责管理数据在其他系统层次之间的流动的组件。
-
展示器:负责将数据呈现给用户或其他系统的组件。
-
基础设施:负责与诸如数据库或 API 等外部系统或服务进行交互的组件。
干净架构中的一个应用程序结构如下:
相比于洋葱架构,干净架构提供了更精确的关注点分离和更好的边界理解。他们支持类似的理想,但层次各异,且关系密切。
何时应使用干净架构?
我们应在以下场景使用干净架构:
-
构建复杂或长久的应用程序,其中可维护性、可测试性和可扩展性至关重要。
-
适合于领域模型在应用程序的功能中起主导作用,并需要明确定义和封装的项目。
-
干净架构利于那些优先考虑清晰的代码实践、关注点的分离和领域驱动设计方法的团队。
何时不应使用干净架构?
在以下场景中,干净架构可能引入不必要的复杂性和开销::
-
对于小型或简单的项目,需求直截了当,它会引入更多的复杂性,有更多的层和抽象,从而使代码库变得更复杂。
-
对于期限紧迫或资源有限的项目,可能不会从实施干净架构所需的前期投入中受益。
-
如果项目的需求可能频繁改变或者领域模型理解不够充分,那么可能更灵活、更敏捷的方法可能更适合。
-
开发团队不熟悉该架构的团队:如果开发团队不熟悉干净架构的原理,学习曲线可能会导致实施错误并放慢开发速度。
"干净架构"很清楚的解释了每一层为何必要,各自的角色是什么,这也是它常常被称为"尖叫架构"(与洋葱和六角架构一起)的原因。"尖叫架构"这个术语意味着架构应该"大声宣告"其意图和目的,让开发者、利益相关者和任何参与项目的人都清楚。这里我们想要将与领域相关的代码与技术细节分离。
例如,如果你正在构建一个电子商务平台,任何查看你的代码库的人应该立即看到像"ShoppingCart"(购物车)"ProductCatalog"(产品目录)和"CustomerProfile"(客户档案),而不仅仅只有"Controllers"(控制器)"Services"(服务)和"DTOs"(数据传输对象)。这可以通过遵循如下原则来实现:
-
领域中心设计:架构应该反映系统的领域和业务逻辑,使得易于理解软件是如何解决现实世界问题的。
-
明确的关注点分离:系统的不同部分应具有明确而独特的职责和明确定义的边界,这种分离使得更容易理解和维护代码库。
-
依赖反转:应该从核心业务逻辑中抽象出依赖,允许更多的灵活性和更简单的测试。这一原则鼓励系统内的松耦合和高内聚。
-
使用模式和实践:应用设计模式和最佳实践有助于标准化架构,使其更可预测和更容易理解。
如何通过垂直切片架构扩展你的系统?
当使用标准的架构模式,如分层或干净架构方法,这样的架构随着应用程序的增长并没有很好的扩展性。我们通常会违反单一责任原则(SRP),因为一个功能被切分到许多层。我们需要了解所有层次之间的依赖关系,以实现特性或修复错误。
而在垂直切片架构中,我们沿不同的请求构建我们的架构,从前端到后端聚焦所有的关注点。在这种方案中,我们在切片上垂直结合,最小化切片之间的耦合性,最大化切片内的耦合性(常改动的事物应和在一起)。
这意味我们不需要很多抽象,例如仓库、服务等。在这种方法下,每个切片决定如何处理请求。此外,这种方法使我们能更好地测试我们的应用程序,因为测试的边界变得更加清晰。这使我们能够用很少的模拟来编写一些与我们正在测试的特性无关的集成测试。
这种架构的代码结构可能看起来像这样:
如何学习干净架构和领域驱动设计?
虽然在概念上很直接,但有效地应用干净架构可能有一些学习曲线。它需要理解依赖注入和良好的软件设计实践。如果你想了解更多与现实生活中的例子相关的内容,以下是一些学习资源:
1. 架构整洁之道
2. 架构师修炼之道