RobertMartin就是我们常说的UncleBob。他是编码界的铁杆人物。4年前他提出了所谓的简单架构。值得回顾和反思,看看是否可以借鉴。微服务呢?大叔在文章中介绍了几个著名的架构思想:AlistairCockburn的HexagonalArchitectureJeffreyPalermo的OnionArchitectureScreamingArchitectureBob大叔博客上的DCI是JamesCoplien,TrygveReenskaug提出的架构模型BCE是IvarJacobson在他的《ObjectOrientedSoftware》一书中提出的Engineering:AUse-CaseDrivenApproach虽然这些架构在细节上有各种不同,但是大叔认为它们是相似的,它们都有一个共同的目标——关注点分离,通过关注点分离把软件分成几个层次,并且系统是这样的:一个独立的框架。该体系结构不依赖功能丰富的软件库,将框架用作工具而不是对系统的约束。可测试性。无需依赖TUI、数据库、Web或其他外部元素即可测试业务逻辑。独立的用户界面。它可以在不改变系统其他部分的情况下轻松更改,例如,可以在不更改业务逻辑的情况下将WebUI替换为控制台UI。独立的数据库。业务逻辑不绑定数据库,可以在Oracle和SQL、Mongo和BigTable、CouchDB等各种数据库之间切换。独立于外部代理。事实上,业务逻辑需要简化,使其不需要知道外界。因此,大叔提出的简洁架构试图将这些架构整合成一种简单的表现形式。该架构工作的首要原则是依赖性原则。这个原则是说源代码依赖于内圈,内圈不知道外圈的一切。特别是外圈声明的东西,内圈的代码不需要去触及,包括函数、类、变量等软件实体。.同心圆代表软件的不同区域。一般来说,职责越深,软件层数越多。外圈代表机制,内圈代表策略。同样,外圈的数据格式也不应该被内圈使用,尤其是外圈的frame生成的格式,也不希望外圈影响到内圈。实体实体封装了企业级业务逻辑。实体可以是具有方法的对象,也可以是数据结构和函数的集合,实体可以被企业中的多个应用程序使用。如果没有企业只写一个单一的应用程序,那么这些实体就是应用程序的业务对象。它们受外部更改的影响很小,例如,您不希望页面导航更改影响实体对象更改或安全性。应用的操作更改不应影响物理层。用例(Usecases)这一层软件包含特定于应用程序的业务逻辑,封装了所有的系统用例。这些用例编排实体之间的数据流,目的是将实体指向企业级别的业务规则。您也不希望该层影响实体,也不希望该层受到外部元素(例如数据库、UI或其他通用框架)的影响。但是,预计应用程序操作的变化会影响这一层的用例。如果一个用例的实现细节发生变化,这一层的一些代码肯定会受到影响。接口适配器(InterfaceAdapters)该层软件是适配器的集合,它们将数据转换成便于用例和实体使用的格式,以及便于数据库或Web等外部代理使用的格式。例如,包含MVC架构的图形界面,其中Presenter、View和Controller都位于这一层。模型就像从控制器传递到用例,再从用例传递回呈现器和视图的数据结构。同样,来自实体和用例的数据被转换为常驻框架,例如数据库。该层没有感知外部数据库的内部代码。如果数据库是SQL数据库,那么所有的SQL都被限制在这一层,而这一层的特殊部分与数据库打交道。该层中还有其他适配器,可将数据从外部服务转换为用例和实体供内部使用。FrameworksandDrivers(框架和驱动程序)最外层的石油框架和工具,比如数据库,Web框架等,一般情况下不需要写很多代码就可以和内圈沟通。这一层细节密集,Web是实现细节,数据是另一个细节,将它们拒之门外可以减少损害。大叔的结构简单只有四层吗?绝对不是,这些圆圈只是为了说明,可以有远不止四层。但依赖原则始终适用,最外圈始终是底层的具体实现。右下角的框图展示了边界是如何被跨越的,描绘了Controllers和Presenters如何与下一层的用例进行通信。注意控制流,从控制器开始,然后在演示器中通过用例进行。这也是依赖于源代码的、内部执行的用例。这是常用的DIP。在Java中,跨界的控制流可以通过接口和继承关系来实现。动态多态性可以跨越该体系结构的所有边界。跨越边界的典型数据是简单的数据结构。可以使用基本结构或者简单的数据传输对象,或者函数调用参数,重要的是相互隔离。比如很多数据库框架在查询的时候返回一个数据集,***不要让它越界,就违反了依赖性原则,即内圈知道外圈。回想一下,通过对软件进行分层,遵守依赖性原则,形成内部可测试性,隔离外部元素并可替代,仅此而已。简洁的架构更像是一个指导原则。核心也是关注点分离和分层意识,并没有摆脱企业级应用架构的经典理念。如果再想想复变函数中的保角变换,这个CleanArchitecture就会变成我们熟悉的有趣模样……【本文来自专栏作家“老曹”,作者微信公众号♂:哦家ArchiSelf,id:wrieless-com]点此阅读作者更多好文
