Clean架构思想

Clean架构(Clean Architecture)是由著名软件工程师Robert C. Martin(也被称为“Uncle Bob”)提出的一种架构模式。Clean架构的核心思想是分离关注点(Separation of Concerns),旨在通过创建高内聚、低耦合的代码结构,提升软件系统的可维护性、可扩展性和可测试性。Clean架构可以应用于各类软件开发,包括Web应用、移动应用、桌面应用等。

Clean架构的核心原则
Clean架构的设计原则包括:

依赖倒置原则(Dependency Inversion Principle, DIP)
高层模块不应该依赖低层模块。两者应该通过抽象来依赖,即依赖于接口而不是具体实现。也就是说,依赖应该从低层流向高层,而不是反过来。

单一职责原则(Single Responsibility Principle, SRP)
每个类应该有且仅有一个原因去改变。一个类的责任应该明确,避免多重职责导致的复杂性。

接口隔离原则(Interface Segregation Principle, ISP)
应该为每个客户提供独立的接口,而不是将所有功能都放在一个庞大的接口中。

开闭原则(Open/Closed Principle, OCP)
软件应该对扩展开放,对修改封闭。这意味着在不修改现有代码的情况下,能够添加新功能。

Clean架构的结构
Clean架构的核心是通过分层结构来实现职责分离和解耦。它的结构通常包括以下几层,层与层之间的关系通常是通过接口和抽象来连接的。

  1. 最内层:实体(Entities)
    职责:包含应用程序核心的业务规则和数据结构。这些实体通常是系统中最基础的对象,如User、Order等,它们代表着业务领域的核心概念。
    特点:实体层是最稳定的,不应该依赖其他层的实现。它们通常是跨不同应用场景和平台的通用业务模型。
  2. 第二层:用例(Use Cases)
    职责:处理具体的应用逻辑,它定义了系统的应用功能。这一层包括与用户交互的具体操作,如“下订单”或“获取用户信息”。
    特点:用例层通过调用实体层的业务逻辑来执行操作,并且可以依赖接口来与外部环境(如数据库、UI层)交互。
  3. 第三层:接口适配器(Interface Adapters)
    职责:该层的作用是将数据从内层(实体和用例)转换为外部界面所需要的格式。这通常涉及到从数据库、UI或外部服务中获取数据并进行适配。
    特点:这层的实现依赖于具体的框架和库(例如数据库 ORM、Web框架等),但是它不应影响核心业务逻辑。它通过转换器(Adapter)和桥接(Bridge)来适配不同层之间的交互。
  4. 最外层:框架和驱动(Frameworks & Drivers)
    职责:最外层通常包含实现具体技术细节的代码,如数据库、Web框架、UI框架等。这些是与系统外部的交互接口。
    特点:这一层依赖于内层的业务逻辑层,通过接口适配器与其交互。它应该被视为一个实现细节,系统的核心业务逻辑不应依赖于它。
    Clean架构的分层图示
    diff
    复制代码
    +----------------------------+
    | 外部框架和驱动 (Frameworks & Drivers) |
    | (UI, Web, Database, etc.) |
    +----------------------------+
    |
    v
    +----------------------------+
    | 接口适配器 (Interface Adapters) |
    | (Controllers, Gateways, Presenters) |
    +----------------------------+
    |
    v
    +----------------------------+
    | 用例 (Use Cases) |
    | (Application Business Rules) |
    +----------------------------+
    |
    v
    +----------------------------+
    | 实体 (Entities) |
    | (Enterprise Business Rules) |
    +----------------------------+
    Clean架构的关键概念
    依赖规则
    Clean架构中的依赖应该始终从外层指向内层,而不是反向。具体来说:

外层模块(如UI层、数据库层、Web层等)依赖于内层模块(如用例层、实体层)。
内层模块不应该知道外层模块的存在。
数据在各层之间流动时,外层模块将数据转化为内层模块所需要的格式。
解耦
Clean架构提倡通过接口和抽象来实现解耦,使得每一层都能独立变化。例如,你可以更改数据存储方式(如从SQL数据库切换为NoSQL数据库),而无需修改核心业务逻辑。

高内聚低耦合
每个层次都应该高内聚,即它们的功能和责任应该非常明确。同时,层与层之间的耦合应该尽可能低,以减少变动的影响范围。

可测试性
Clean架构使得每一层都能够独立进行单元测试。因为内层不依赖于外层,核心业务逻辑的单元测试可以不依赖具体的数据库、UI或框架。

Clean架构的优势
高可维护性:由于各层之间的高内聚性和低耦合性,代码变更时只会影响到相关层,减少了修改时的风险。
可扩展性:新的功能和需求可以通过扩展现有的用例和实体来实现,而无需大幅度改动现有的代码结构。
技术无关性:核心业务逻辑不依赖于特定的框架或技术,使得系统更容易迁移和升级。
可测试性:各层通过接口进行解耦,使得单元测试变得更加容易,尤其是对核心业务逻辑的测试。
Clean架构的挑战
复杂度较高:由于Clean架构的分层设计和依赖倒置的原则,可能会导致初期设计和实现的复杂度增加,尤其是在小型项目中。
过度设计:在某些小型应用或快速开发的场景中,Clean架构可能会显得有些“过度设计”,开发团队需要根据实际需求权衡设计的复杂度。
总结
Clean架构是一种强调整洁代码和高内聚、低耦合设计的架构模式。通过严格的分层和依赖倒置,它提供了一种使得业务逻辑独立于技术实现的方式,从而提高了代码的可维护性、可扩展性和可测试性。虽然Clean架构在小型项目中可能显得过于复杂,但对于大规模的、长生命周期的软件系统,它提供了一种良好的设计方法,帮助开发者应对复杂的业务需求和技术变革。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,313评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,369评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,916评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,333评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,425评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,481评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,491评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,268评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,719评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,004评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,179评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,832评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,510评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,153评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,402评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,045评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,071评论 2 352

推荐阅读更多精彩内容