原文地址:
http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html
这篇文章是Bob大叔在2012年8月分写的,现在读来依然带感。首先,大叔说自己这几年来看过各种各样的系统架构的想法,从中学到了很多东西,这就是他写这篇文章的原始素材。这些架构思想包括,但不限于:
- Alistair Cockburn提出的六角架构,Steve Freeman和Nat Pryce的《Growing Object Oriented Software》一书中就使用了这种架构。
- Jefferey Palermo的洋葱环形架构
- Bob大叔自己2011年提出的"Screaming Architecture"
- James Coplien和Trygve Reenskaug提出的DCI(Data, Context and Interaction)架构
- Ivar Jacobson在《面向对象工程》一书提出的BCE(Boundary Control Entity)架构
所有的这些架构在细节上虽然各有不同,但是它们在大方向上却有很多相似性。它们诞生的目的都是一样的,就是隔离出不同的关注点;它们的解决方法也一致,就是通过分层架构;它们都至少有一层表示业务逻辑,一层表示接口。基于这些架构的系统有如下的特点:
- 独立于技术框架之外,技术框架只是支撑架构的工具,而不是让架构去适应技术框架的各种限制。
- 可测试性高,业务逻辑可以在没有UI,DB,服务器等任何外部元素下进行测试。
- UI隔离性高,UI的变化不会影响到系统的其他部分。
- DB隔离,可以很容易的在各种DB之间切换。
- 业务逻辑独立,不受任何外在世界变化的影响。
把所有这些观点都揉进一张图里的话,大概就是下面这个样子:
依赖规则
上图中,每一个圆环代表软件系统的一个方面,总的来说,外环越多,软件越复杂。外环是软件的实现方式和展现形式。内环则是基础的业务逻辑策略。
维持整个圆环的最重要的规则就是依赖原则;这个原则的要求是所有的源代码依赖只能从外向内,内环的代码不能依赖任何的外环的代码。这其中包括外环的类,方法,参数,甚至是数据格式。总之,任何外环的代码改变都不太应该影响到内环的代码。
实体层
实体层封装了基础的业务逻辑,基本上就是定义实体,实现实体定义上应该提供的方法。实体层可以是一堆对象,甚至就一个对象,也可以是一堆数据和方法。这一层是最少受外在改变影响的。比方说,在页面导航方式或者说安全验证方式上的改动,就不应该影响到实体层。事实上,任何操作方式的变化都不应该影响到实体层的代码。
用例层
这一层主要封装的针对应用的业务逻辑,它覆盖实现了当前软件系统的所有用例。这一层主要做的事情就是组织整个系统的业务流,通过调用实体层中各个实体的方法来实现用例需求。对于用例层来说,其依赖于实体层提供的方法,但是不希望用例层的改动不应该影响到实体层,应该只是调用不同的实体层方法,或者按不同的顺序调用。 同样的,用例层应该也不应受外在UI,框架的变化影响。只有当用例或者实体层发生变化时,才需要改动用例层。
适口适配层
这一层的主要作用就是提供一系列的接口适配器,把数据从用例层和实体层最习惯的格式转换为外部用户(DB,Web页面)最方便使用的格式。大叔甚至说,整个MVC架构都可以放到这一层里面,View和Controller本来就属于这一层,而Model层则只是用于和用例层传递数据。因为这一层的作用是数据结构的转换,但是需要注意是的这一层是不对外环的对象做任何依赖的,比方说,适配层需要把用例的数据持久化到数据库,那么该层就会承担起把用例的数据转化为最方便持久化的格式,比方说SQL,但是本层不会去关心具体存储到那个数据库中,本层的任何代码都不应该对某个特定的数据库产生依赖。当然,除了内环转外环,还可能有外环转内环的接口适配。
框架和驱动层
这一层主要就是包括所有支撑系统的框架和工具了。比方说,DB,Web框架等等。这一层除了把框架装配到接口上,基本上只需要写很少的代码,但是这一层会涉及到很多的细节,Web是细节,具体使用哪个数据是细节 ,当然也是改动最为频繁的一层。
只能有四层?
当然不是,上面的洋葱图只是一个简图。没有规定只能有四层,或者只能用这四层。但是,我们必须遵守依赖原则。系统越往内走,抽象层次越高,越往外抽象层次越低,会涉及更多的细节的东西。
跨越圆环边界
在洋葱图的右下角,大叔画了一幅跨越圆环边界的示例图,图中的控制流程,发起于Controller,然后在用例层转了一圈,最后在Presenter中结束。在这个示例中,用例层需要调用Presenter以完成这个流程,但是用例层不能直接调用Presenter的方法,因为这样会破坏依赖原则。对于这样的矛盾,常用的解决方案是依赖倒转,像在Java世界,就可以通过在用例层定义接口,Controller,Presenter去具体实现这些接口,这样用例层就不用知道外环的状况,而外环则根据自己的需要去实现响应的接口就行了。如例图中的Use Case Output Port.
数据跨越边界
通常情况下,跨越边界的数据就是一些简单的数据结构,你可以视情况使用最简单的数据结构或者简单的DTO。不管怎样都好,但是当数据需要跨越边界时,必须注意不要破坏依赖原则,不要直接传递外层实体,不要传递数据库表记录,不要传递任何和外环有关联的数据结构。因此,数据跨越边界传输时,需要有2个原则,一是以最方便内层使用的方式,第二就是不要使用对外环有任何依赖的格式。
结论
遵从上面提到的原则并不困难,但是却会为你避免很多头疼的问题。通过把软件架构分层,并遵从依赖原则,那么你构建的系统将会非常容易测试。同时,当系统的外环构件已经过时时,系统可以以最小的成本对其进行技术栈升级,这样可以避免很多遗留系统技术栈无法升级的弊病。
分享到:
相关推荐
在当今的软件开发领域中,"整洁的架构"是一个频繁提及的术语,其核心思想是强调系统架构的清晰性、模块化和可维护性。在文档中提到的“blob大叔”可能是一位在架构设计领域具有丰富经验的专家,他认为在学习领域驱动...
这本书旨在探讨如何构建高质量的软件架构,以确保代码的可读性、可维护性和可扩展性。 全书分为六大部分,共33章,浓缩成13页的精华笔记。内容涵盖了设计与架构的基础概念,编程范式的概述,设计原则,组件构建原则...
4. 领导力培养:对于有志于成为架构师的人来说,《架构整洁之道》和《软件架构设计:从技术走向管理》将帮助提升领导力和团队管理能力。 通过系统阅读这些书籍,IT专业人士可以逐步提升自己的软件架构设计能力,更...
《软件架构设计-基于重构》是一本专注于软件开发中架构改进和优化的著作。它主要探讨如何通过重构技术来提升现有系统的架构质量,确保软件的可维护性、扩展性和性能。重构是软件开发过程中的一个重要环节,它并不...
在当今信息化时代,软件系统日益复杂,对于软件架构的理解和实践变得愈发重要。软件架构不仅关乎技术实施,更关乎项目的长远发展和企业的核心竞争力。本文将深入探讨软件架构的相关概念和实践,为读者提供一个全面的...
在IT行业中,软件架构设计是开发高质量应用的关键步骤。它涉及到如何组织和构建软件系统,以便于实现功能、满足性能需求、确保可扩展性、可维护性和可测试性。在这个名为“我读软件架构设计”的压缩包文件中,我们...
根据提供的信息,我们可以深入探讨“软件架构设计思想”的相关内容。虽然原始材料并未给出具体的知识点,但基于标题、描述及标签中的关键词“软件”、“架构”、“设计”和“思想”,我们可以围绕这些方面构建一系列...
在IT行业中,软件架构师扮演着至关重要的角色,他们负责设计和规划软件系统的整体结构,确保系统的可扩展性、可维护性和性能。本资源包"软件架构师精品课程学习资料包免费领.rar"是一个难得的机会,为有志于成为软件...
### 软件开发+架构基础+代码整洁之道 #### 一、引言 随着软件项目的日益复杂化,保持代码的整洁与可维护性成为软件工程师必须面对的重要问题。本书《软件开发+架构基础+代码整洁之道》旨在帮助开发者理解和实践高...
代码整洁之道.pdf
《对基于IR46理念的智能电能表管理芯软件架构设计分析》 智能电能表作为现代电力系统的重要组成部分,其管理芯的软件架构设计直接影响着电能表的稳定性和效率。本文主要探讨了基于IR46理念的智能电能表管理芯的软件...
基于整洁架构搭建的个人IM开源项目,通过Netty实现和前端websocket连接。内含有登录,成员列表,联系人, 群组,群组成员,好友,好友分组,黑名单,消息记录,消息撤回,消息已读,消息点赞,还有很多小轮子项目 ...
《高内聚低耦合软件架构的构建》这篇论文深入探讨了软件工程中的核心设计理念——高内聚与低耦合,这是构建高质量、可维护、易于扩展的软件系统的重要原则。高内聚指的是模块内部元素之间的紧密关联,而低耦合则意味...
DDD 分层架构的三种模式 在软件开发中,领域驱动设计(Domain Driven Design,简称 DDD)是一种重要的设计方法,它...在实践中,我们可以根据实际情况选择合适的模式,并且结合业务需求和技术 stack 来设计软件架构。
《软件体系架构:Spring、SpringMVC与Mybatis框架基础》 在当今的软件开发领域,框架的应用已经变得至关重要,它们极大地提高了开发效率,降低了出错的可能性。本资源主要聚焦于三大主流Java企业级框架——Spring、...
首先,书中所强调的“整洁架构”(Clean Architecture)是一种软件架构设计的原则和方法,旨在指导开发者创建独立于框架、易于测试并且能够随着时间推移而演进的软件系统。整洁架构的概念早在2000年代初就已经开始...
《中南大学软件学院架构:JPetStore的Struts2重构探索》 在现代软件工程领域,架构设计是至关重要的一步,它决定了系统的可扩展性、可维护性和性能。中南大学软件学院的一个实践项目,就是对经典的JPetStore应用...
云架构是现代软件架构中的一个重要元素,它利用虚拟化技术提供高扩展性和负载处理能力,但其复杂性也带来了测试和管理的挑战。 总之,敏捷架构设计要求我们在开发过程中保持灵活,不断调整和优化架构,以应对不确定...
这本书主要针对的是如何通过整洁的代码来提高软件的质量、可读性和可维护性,这对于软件架构师来说是至关重要的知识。在软件开发过程中,代码的整洁性不仅关乎个人编程习惯,更是团队协作、项目长期稳定性和持续发展...