The Clean Architecture in PHP 讀書(shū)筆記(七)

Clean Architecture

MVC的關(guān)鍵是給我們提出了一個(gè)原則:怎么對(duì)項(xiàng)目進(jìn)行合理的關(guān)注點(diǎn)分離攻询。Model負(fù)責(zé)業(yè)務(wù)領(lǐng)域,controller負(fù)責(zé)對(duì)model進(jìn)行工作安排州弟,而view則負(fù)責(zé)門(mén)面钧栖,怎么讓外面的人看的滿(mǎn)意。

但是MVC只提供了3層呆馁,對(duì)于再?gòu)?fù)雜的應(yīng)用沒(méi)有提供足夠的組織和關(guān)注點(diǎn)分離的原則了桐经,這個(gè)時(shí)候我們來(lái)看下Clean Architecture。

本文為系列文章的第七篇浙滤,完成的目錄請(qǐng)查看Clean Architecture

The Clean Architecture

Clean Architecture是Uncle Bob Martin在2012年寫(xiě)的阴挣,文章中收集了一系列類(lèi)似的架構(gòu),它們的共同點(diǎn)如下:

  1. 框架無(wú)關(guān)(Independent of Frameworks)

    這些架構(gòu)沒(méi)有依賴(lài)于一些已經(jīng)存在的庫(kù)或軟件纺腊,帶來(lái)的好處是:你無(wú)需要去硬滿(mǎn)足框架給你制定的條條框框畔咧,框架本身只是你的一個(gè)工具。

  2. 可測(cè)性(Testable)

    業(yè)務(wù)邏輯可以在沒(méi)有UI揖膜,Database誓沸,Web Server 或任何外部元素的情況下測(cè)試

  3. UI無(wú)關(guān)(Independent of UI)

    UI可以在不改變業(yè)務(wù)邏輯的情況下快速改變,譬如可以將Web UI替換為Console UI

  4. 數(shù)據(jù)庫(kù)無(wú)關(guān)(Independent of Database)

    我們可以替換后端的存儲(chǔ)壹粟,從mysql到nosql拜隧,不影響我們的業(yè)務(wù)邏輯

  5. 無(wú)外部依賴(lài)(Independent of any external agency)

    我們核心的業(yè)務(wù)邏輯對(duì)任何的外部依賴(lài)都是無(wú)感的宿百,或者說(shuō)我們的業(yè)務(wù)邏輯只關(guān)心領(lǐng)域邏輯。

框架無(wú)關(guān)(Independent of Frameworks)

PHP社區(qū)現(xiàn)在異常的活躍洪添,各種框架層出不窮垦页,Laravel,Silex等干奢,沒(méi)準(zhǔn)昨天還流行的框架痊焊,今天就又出了一個(gè)更好的,因此如果你將自己的核心邏輯綁定到某個(gè)框架上忿峻,那么sorry薄啥,框架的升級(jí)或者替換摇零,你都需要重寫(xiě)你代碼了发乔。

可測(cè)性(Testable)

測(cè)試的編寫(xiě)跟項(xiàng)目大小無(wú)關(guān),不能因?yàn)轫?xiàng)目大而沒(méi)有時(shí)間去寫(xiě)測(cè)試用例炒辉,也不能因?yàn)轫?xiàng)目小太簡(jiǎn)單不去寫(xiě)測(cè)試绰寞。測(cè)試的編寫(xiě)隨著項(xiàng)目的不斷重構(gòu)赘艳,它的意義會(huì)越來(lái)越大,因?yàn)槲覀儫o(wú)法保證代碼的編寫(xiě)都是一個(gè)人克握,每次的修改都不會(huì)改變?cè)瓉?lái)的功能蕾管,這個(gè)時(shí)候測(cè)試用例的作用就凸顯出來(lái)了,每次修改后菩暗,都運(yùn)行case掰曾,保證功能的正確性。

數(shù)據(jù)庫(kù)無(wú)關(guān)(Independent of Database)

數(shù)據(jù)庫(kù)無(wú)關(guān)這點(diǎn)在實(shí)際工作中可能不是那么重要停团,因?yàn)槊總€(gè)公司都有自己的存儲(chǔ)服務(wù)旷坦,像我們公司后端持久化存儲(chǔ)一直是mysql,或者說(shuō)存儲(chǔ)一直是兼容mysql的sql的佑稠,關(guān)注存儲(chǔ)的適配有專(zhuān)門(mén)的團(tuán)隊(duì)來(lái)做秒梅,應(yīng)用這邊看到的一直就是mysql。

但是對(duì)于開(kāi)源軟件就不是了舌胶,我們需要考慮后端存儲(chǔ)的變化捆蜀,需要能滿(mǎn)足各個(gè)存儲(chǔ)。

無(wú)外部依賴(lài)(Independent of any external agency)

通過(guò)composer我們能很快利用社區(qū)的開(kāi)源庫(kù)幔嫂,加速我們應(yīng)用的開(kāi)發(fā)辆它。但是社區(qū)活躍帶來(lái)的問(wèn)題是,庫(kù)的出現(xiàn)快履恩,消失的也快锰茉。因此我們?cè)陂_(kāi)發(fā)中,必須要考慮盡量減少對(duì)外部庫(kù)的依賴(lài)切心,一個(gè)方法就是之前介紹的適配器模式飒筑。

The Onion Architecture

The Onion Architecture最初是由Jeffrey Palermo提出的片吊,是clean architecture的一個(gè)變種。

Palermo將軟件的分層比喻成洋蔥一樣的一層一層:從里面往外一層一層的看协屡,每一層都依賴(lài)著內(nèi)層定鸟,但是內(nèi)層卻不依賴(lài)于外層,通過(guò)一個(gè)圖來(lái)認(rèn)識(shí)下:

Onion Architecture

傳統(tǒng)的應(yīng)用開(kāi)發(fā)中著瓶,應(yīng)用是以數(shù)據(jù)庫(kù)為中心設(shè)計(jì)的,先確定數(shù)據(jù)庫(kù)中每個(gè)表的結(jié)構(gòu)啼县,然后應(yīng)用在基于數(shù)據(jù)進(jìn)行設(shè)計(jì)材原,如果將其剝離出來(lái),整個(gè)系統(tǒng)變的支零破碎季眷。

在Onion Architecture中余蟹,應(yīng)用核心是領(lǐng)域模型,完全和數(shù)據(jù)庫(kù)解耦子刮,在整個(gè)應(yīng)用中威酒,數(shù)據(jù)庫(kù)只是應(yīng)用需要的一個(gè)組件,我們可以完全替換存儲(chǔ)挺峡,而不影響整個(gè)應(yīng)用邏輯葵孤。

領(lǐng)域模型和領(lǐng)域服務(wù)

在Onion Architecture中最核心是領(lǐng)域模型層,該層只包含了領(lǐng)域模型橱赠,彼此之間進(jìn)行交互尤仍,不涉及領(lǐng)域之外的邏輯,在領(lǐng)域模型之外是領(lǐng)域服務(wù)層狭姨,包括了工廠(factories)宰啦、倉(cāng)庫(kù)(repositories)和其他的一些使用領(lǐng)域模型的服務(wù)。

領(lǐng)域模型和領(lǐng)域服務(wù)合起來(lái)構(gòu)成了整個(gè)應(yīng)用的核心饼拍。應(yīng)用其他所有層都依賴(lài)于核心的領(lǐng)域模型和領(lǐng)域服務(wù)赡模。

應(yīng)用服務(wù)層

應(yīng)用層包含了具體的應(yīng)用的實(shí)現(xiàn),以MVC為例子:應(yīng)用層就是controller师抄。應(yīng)用層應(yīng)該只負(fù)責(zé)啟動(dòng)我們的應(yīng)用漓柑,不會(huì)再被其他層依賴(lài)了。應(yīng)用層只是用來(lái)調(diào)用我們內(nèi)存的個(gè)領(lǐng)域服務(wù)和領(lǐng)域模型叨吮,我們能很方便的替換應(yīng)用層欺缘。

我們可能感慨是使用的Symfony,但是后來(lái)要轉(zhuǎn)換為L(zhǎng)aravel挤安,如果我們核心設(shè)計(jì)的好谚殊,應(yīng)該是很方便就能切換過(guò)去的。

用戶(hù)接口

通過(guò)用戶(hù)接口UI蛤铜,我們將我們應(yīng)用的核心領(lǐng)域?qū)ο笳宫F(xiàn)給用戶(hù)嫩絮,由于沒(méi)有其他層依賴(lài)于UI了丛肢,因此我們無(wú)壓力的替換模型語(yǔ)言,使用新的js框架什么的剿干,so _

基礎(chǔ)設(shè)施

該層也是在最外層蜂怎,主要是給領(lǐng)域?qū)犹峁?shù)據(jù)的存取,通過(guò)他來(lái)獲取數(shù)據(jù)置尔,數(shù)據(jù)可能是數(shù)據(jù)庫(kù)里杠步,也可能是網(wǎng)絡(luò),或者其他地方榜轿,該層使我們整個(gè)應(yīng)用的數(shù)據(jù)提供方幽歼。

基礎(chǔ)層依賴(lài)于領(lǐng)域服務(wù)和領(lǐng)域?qū)樱驗(yàn)轭I(lǐng)域?qū)雍皖I(lǐng)域模型給出了基礎(chǔ)層必須實(shí)現(xiàn)的契約(contract)谬盐,基礎(chǔ)層來(lái)實(shí)現(xiàn)這些接口給領(lǐng)域?qū)犹峁?shù)據(jù)甸私。

本節(jié)只是對(duì)clean architecture做了一個(gè)概述,下面會(huì)對(duì)clean architecture的5個(gè)特點(diǎn)展開(kāi)具體的討論飞傀。

這是The Clean Architecture in PHP的第七篇皇型,你的鼓勵(lì)是我繼續(xù)寫(xiě)下去的動(dòng)力,期待我們共同進(jìn)步砸烦。

參考文獻(xiàn)

Clean Architecture(英)

Clean Architecture(譯)

Onion Architecture

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末弃鸦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子幢痘,更是在濱河造成了極大的恐慌寡键,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雪隧,死亡現(xiàn)場(chǎng)離奇詭異西轩,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)脑沿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)藕畔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人庄拇,你說(shuō)我怎么就攤上這事注服。” “怎么了措近?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵溶弟,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我瞭郑,道長(zhǎng)辜御,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任屈张,我火速辦了婚禮擒权,結(jié)果婚禮上袱巨,老公的妹妹穿的比我還像新娘。我一直安慰自己碳抄,他們只是感情好愉老,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著剖效,像睡著了一般嫉入。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上璧尸,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天咒林,我揣著相機(jī)與錄音,去河邊找鬼逗宁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛梦湘,可吹牛的內(nèi)容都是我干的瞎颗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼捌议,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼哼拔!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起瓣颅,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤倦逐,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后宫补,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體檬姥,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年粉怕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了健民。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贫贝,死狀恐怖秉犹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情稚晚,我是刑警寧澤崇堵,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站客燕,受9級(jí)特大地震影響鸳劳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜也搓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一棍辕、第九天 我趴在偏房一處隱蔽的房頂上張望暮现。 院中可真熱鬧,春花似錦楚昭、人聲如沸栖袋。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)塘幅。三九已至,卻和暖如春尿贫,著一層夾襖步出監(jiān)牢的瞬間电媳,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工庆亡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留匾乓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓又谋,卻偏偏與公主長(zhǎng)得像拼缝,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子彰亥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容