The Clean Architecture in PHP 读书笔记(七)

Clean Architecture

MVC的关键是给我们提出了一个原则:怎么对项目进行合理的关注点分离。Model负责业务领域,controller负责对model进行工作安排,而view则负责门面,怎么让外面的人看的满意。

但是MVC只提供了3层,对于再复杂的应用没有提供足够的组织和关注点分离的原则了,这个时候我们来看下Clean Architecture。

本文为系列文章的第七篇,完成的目录请查看Clean Architecture

The Clean Architecture

Clean Architecture是Uncle Bob Martin在2012年写的,文章中收集了一系列类似的架构,它们的共同点如下:

  1. 框架无关(Independent of Frameworks)

    这些架构没有依赖于一些已经存在的库或软件,带来的好处是:你无需要去硬满足框架给你制定的条条框框,框架本身只是你的一个工具。

  2. 可测性(Testable)

    业务逻辑可以在没有UI,Database,Web Server 或任何外部元素的情况下测试

  3. UI无关(Independent of UI)

    UI可以在不改变业务逻辑的情况下快速改变,譬如可以将Web UI替换为Console UI

  4. 数据库无关(Independent of Database)

    我们可以替换后端的存储,从mysql到nosql,不影响我们的业务逻辑

  5. 无外部依赖(Independent of any external agency)

    我们核心的业务逻辑对任何的外部依赖都是无感的,或者说我们的业务逻辑只关心领域逻辑。

框架无关(Independent of Frameworks)

PHP社区现在异常的活跃,各种框架层出不穷,Laravel,Silex等,没准昨天还流行的框架,今天就又出了一个更好的,因此如果你将自己的核心逻辑绑定到某个框架上,那么sorry,框架的升级或者替换,你都需要重写你代码了。

可测性(Testable)

测试的编写跟项目大小无关,不能因为项目大而没有时间去写测试用例,也不能因为项目小太简单不去写测试。测试的编写随着项目的不断重构,它的意义会越来越大,因为我们无法保证代码的编写都是一个人,每次的修改都不会改变原来的功能,这个时候测试用例的作用就凸显出来了,每次修改后,都运行case,保证功能的正确性。

数据库无关(Independent of Database)

数据库无关这点在实际工作中可能不是那么重要,因为每个公司都有自己的存储服务,像我们公司后端持久化存储一直是mysql,或者说存储一直是兼容mysql的sql的,关注存储的适配有专门的团队来做,应用这边看到的一直就是mysql。

但是对于开源软件就不是了,我们需要考虑后端存储的变化,需要能满足各个存储。

无外部依赖(Independent of any external agency)

通过composer我们能很快利用社区的开源库,加速我们应用的开发。但是社区活跃带来的问题是,库的出现快,消失的也快。因此我们在开发中,必须要考虑尽量减少对外部库的依赖,一个方法就是之前介绍的适配器模式。

The Onion Architecture

The Onion Architecture最初是由Jeffrey Palermo提出的,是clean architecture的一个变种。

Palermo将软件的分层比喻成洋葱一样的一层一层:从里面往外一层一层的看,每一层都依赖着内层,但是内层却不依赖于外层,通过一个图来认识下:

Onion Architecture

传统的应用开发中,应用是以数据库为中心设计的,先确定数据库中每个表的结构,然后应用在基于数据进行设计,如果将其剥离出来,整个系统变的支零破碎。

在Onion Architecture中,应用核心是领域模型,完全和数据库解耦,在整个应用中,数据库只是应用需要的一个组件,我们可以完全替换存储,而不影响整个应用逻辑。

领域模型和领域服务

在Onion Architecture中最核心是领域模型层,该层只包含了领域模型,彼此之间进行交互,不涉及领域之外的逻辑,在领域模型之外是领域服务层,包括了工厂(factories)、仓库(repositories)和其他的一些使用领域模型的服务。

领域模型和领域服务合起来构成了整个应用的核心。应用其他所有层都依赖于核心的领域模型和领域服务。

应用服务层

应用层包含了具体的应用的实现,以MVC为例子:应用层就是controller。应用层应该只负责启动我们的应用,不会再被其他层依赖了。应用层只是用来调用我们内存的个领域服务和领域模型,我们能很方便的替换应用层。

我们可能感慨是使用的Symfony,但是后来要转换为Laravel,如果我们核心设计的好,应该是很方便就能切换过去的。

用户接口

通过用户接口UI,我们将我们应用的核心领域对象展现给用户,由于没有其他层依赖于UI了,因此我们无压力的替换模型语言,使用新的js框架什么的,so _

基础设施

该层也是在最外层,主要是给领域层提供数据的存取,通过他来获取数据,数据可能是数据库里,也可能是网络,或者其他地方,该层使我们整个应用的数据提供方。

基础层依赖于领域服务和领域层,因为领域层和领域模型给出了基础层必须实现的契约(contract),基础层来实现这些接口给领域层提供数据。

本节只是对clean architecture做了一个概述,下面会对clean architecture的5个特点展开具体的讨论。

这是The Clean Architecture in PHP的第七篇,你的鼓励是我继续写下去的动力,期待我们共同进步。

参考文献

Clean Architecture(英)

Clean Architecture(译)

Onion Architecture

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

推荐阅读更多精彩内容