The Clean Architecture | 8th Light https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html
干凈的架構(gòu)The Clean Architecture
這是著名軟件大師Bob大叔提出的一種架構(gòu),也是當(dāng)前各種語(yǔ)言開(kāi)發(fā)架構(gòu)。干凈架構(gòu)提出了一種單向依賴(lài)關(guān)系,從而從邏輯上形成一種向上的抽象系統(tǒng)。
我們經(jīng)常聽(tīng)說(shuō)過(guò)如下各種架構(gòu):
六邊形架構(gòu)Hexagonal Architecture (也稱(chēng)為 端口和適配器) 這是由Alistair Cockburn 提出,被Steve Freeman和 Nat Pryce在他們的書(shū)籍Growing Object Oriented Software中采取的。
Onion Architecture 作者Jeffrey Palermo
Screaming Architecture Bob大叔
DCI 由James Coplien和Trygve Reenskaug推動(dòng)
BCE Ivar Jacobson在他的書(shū)籍Object Oriented Software Engineering: A Use-Case Driven Approach提出
雖然這些架構(gòu)在細(xì)節(jié)上都略有不同,但他們都非常相似。它們都具有相同的目標(biāo),那就是分離關(guān)注。他們都通過(guò)軟件分層來(lái)實(shí)現(xiàn)這種分離。至少有一個(gè)層代表業(yè)務(wù)規(guī)則,而另一個(gè)層用于接口。

依賴(lài)規(guī)則Dependency Rule
上圖中同心圓代表各種不同領(lǐng)域的軟件。一般來(lái)說(shuō),越深入代表你的軟件層次越高。外圓是戰(zhàn)術(shù)實(shí)現(xiàn)機(jī)制,內(nèi)圓的是戰(zhàn)略核心策略。
使此體系架構(gòu)能夠工作的關(guān)鍵是依賴(lài)規(guī)則。這條規(guī)則規(guī)定源代碼只能向內(nèi)依賴(lài),在最里面的部分對(duì)外面一點(diǎn)都不知道,也就是內(nèi)部不依賴(lài)外部,而外部依賴(lài)內(nèi)部。這種依賴(lài)包含代碼名稱(chēng),或類(lèi)的函數(shù),變量或任何其他命名軟件實(shí)體。
同樣,在外面圈中使用的數(shù)據(jù)格式不應(yīng)被內(nèi)圈中使用,特別是如果這些數(shù)據(jù)格式是由外面一圈的框架生成的。我們不希望任何外圓的東西會(huì)影響內(nèi)圈層。
實(shí)體Entities
實(shí)體封裝的是企業(yè)業(yè)務(wù)規(guī)則,一個(gè)實(shí)體能是一個(gè)帶有方法的對(duì)象,或者是一系列數(shù)據(jù)結(jié)構(gòu)和函數(shù),只要這個(gè)實(shí)體能夠被不同的應(yīng)用程序使用即可。
如果你沒(méi)有編寫(xiě)企業(yè)軟件,只是編寫(xiě)簡(jiǎn)單的應(yīng)用程序,這些實(shí)體就是應(yīng)用的業(yè)務(wù)對(duì)象,它們封裝著最普通的高級(jí)別業(yè)務(wù)規(guī)則,你不能希望這些實(shí)體對(duì)象被一個(gè)頁(yè)面的分頁(yè)導(dǎo)航功能改變,也不能被安全機(jī)制改變,操作實(shí)現(xiàn)層面的任何改變不能影響實(shí)體層,只有業(yè)務(wù)需求改變了才可以改變實(shí)體。
用例Use Cases
在這個(gè)層的軟件包含應(yīng)用指定的業(yè)務(wù)規(guī)則,它封裝和實(shí)現(xiàn)系統(tǒng)的所有用例,這些用例會(huì)混合各種來(lái)自實(shí)體的各種數(shù)據(jù)流程,并且指導(dǎo)這些實(shí)體使用企業(yè)規(guī)則來(lái)完成用例的功能目標(biāo)。
我們并不期望改變這層會(huì)影響實(shí)體層. 我們也不期望這層被更外部如數(shù)據(jù)庫(kù) UI或普通框架影響,這層也是因?yàn)殛P(guān)注而外部分離的。
我們期望應(yīng)用層面的技術(shù)操作都不能影響用例層,如果需求中用例發(fā)生改變,這個(gè)層的代碼才會(huì)發(fā)生改變。
接口適配器Interface Adapters
這一層的軟件基本都是一些適配器,主要用于將用例和實(shí)體中的數(shù)據(jù)轉(zhuǎn)換為外部系統(tǒng)如數(shù)據(jù)庫(kù)或Web使用的數(shù)據(jù),在這個(gè)層次,可以包含一些GUI的MVC架構(gòu),表現(xiàn)視圖 控制器都屬于這個(gè)層,模型Model是從控制器傳遞到用例或從用例傳遞到視圖的數(shù)據(jù)結(jié)構(gòu)。
通常在這個(gè)層數(shù)據(jù)被轉(zhuǎn)換,從用例和實(shí)體使用的數(shù)據(jù)格式轉(zhuǎn)換到持久層框架使用的數(shù)據(jù),主要是為了存儲(chǔ)到數(shù)據(jù)庫(kù)中,這個(gè)圈層的代碼是一點(diǎn)和數(shù)據(jù)庫(kù)沒(méi)有任何關(guān)系,如果數(shù)據(jù)庫(kù)是一個(gè)SQL數(shù)據(jù)庫(kù), 這個(gè)層限制使用SQL語(yǔ)句以及任何和數(shù)據(jù)庫(kù)打交道的事情。.
框架和驅(qū)動(dòng)
最外面一圈通常是由一些框架和工具組成,如數(shù)據(jù)庫(kù)Database, Web框架等. 通常你不必在這個(gè)層不必寫(xiě)太多代碼,而是寫(xiě)些膠水性質(zhì)的代碼與內(nèi)層進(jìn)行粘結(jié)通訊。這個(gè)層是細(xì)節(jié)所在,Web技術(shù)是細(xì)節(jié),數(shù)據(jù)庫(kù)是細(xì)節(jié),我們將這些實(shí)現(xiàn)細(xì)節(jié)放在外面以免它們對(duì)我們的業(yè)務(wù)規(guī)則造成影響傷害。
只有四個(gè)圈層嗎?
這個(gè)圓圈圖是示意性的。您可能會(huì)發(fā)現(xiàn)您需要的不僅僅是這四個(gè)。也沒(méi)有規(guī)定說(shuō)你必須始終只有這四個(gè)。然而,依賴(lài)規(guī)則始終適用。源代碼的依賴(lài)關(guān)系總是由外向內(nèi)。當(dāng)你越向內(nèi)時(shí),抽象水平越高。而最外面的一圈是低層次的具體細(xì)節(jié)。當(dāng)你越向內(nèi)時(shí)軟件變得越為抽象,封裝了更高層次的策略。
跨邊界流程
在圖的右下方是我們?nèi)绾卧竭^(guò)圓邊界的例子。它顯示控制器和界面之間是如何和用例進(jìn)行通信的。注意控制流程。它開(kāi)始于控制器,通過(guò)用例,然后在界面處執(zhí)行。還要注意源代碼的依賴(lài)關(guān)系。他們中的每一個(gè)點(diǎn)都是指向內(nèi)部用例。我們通常使用依賴(lài)注入來(lái)實(shí)現(xiàn)這種依賴(lài)。
那么數(shù)據(jù)如何跨層流動(dòng)呢?
通??鐚拥臄?shù)據(jù)是簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)。如果你喜歡你可以使用基本結(jié)構(gòu)或簡(jiǎn)單的數(shù)據(jù)傳輸對(duì)象DTO。或可以函數(shù)可以調(diào)用數(shù)據(jù)參數(shù)。或者你可以打包到哈希表中,或?yàn)樗?gòu)一個(gè)對(duì)象。最重要是跨層傳遞是孤立的、 簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)。
我們不想讓這個(gè)數(shù)據(jù)結(jié)構(gòu)是一個(gè)實(shí)體或數(shù)據(jù)庫(kù)記錄,因?yàn)槲覀儾幌M鼈冇腥魏蔚囊蕾?lài)關(guān)系,這會(huì)違反了依賴(lài)規(guī)則。例如,許多數(shù)據(jù)庫(kù)框架在查詢(xún)響應(yīng)中返回一個(gè)方便的數(shù)據(jù)格式。我們可能會(huì)要求這對(duì)這個(gè)記錄重構(gòu),因?yàn)槲覀儾幌胍鐚酉騼?nèi)傳遞數(shù)據(jù)庫(kù)記錄。這就違反了依賴(lài)規(guī)則,它會(huì)迫使內(nèi)圈要知道關(guān)于外圈的東西。所以當(dāng)我們跨層傳遞數(shù)據(jù),它總是以對(duì)內(nèi)圈最方便的形式。
總結(jié)
符合這些簡(jiǎn)單的規(guī)則將會(huì)節(jié)省您大量的頭痛開(kāi)發(fā)。通過(guò)將軟件分離到各種層,并符合依賴(lài)規(guī)則,這樣您創(chuàng)建一個(gè)系統(tǒng)本質(zhì)上是可測(cè)試,這意味著很多好處。
Facebook移動(dòng)架構(gòu):Android Flux架構(gòu)詳解 - 51CTO.COM
http://developer.51cto.com/art/201508/489423.htm
今天: Clean Architecture
目前的趨勢(shì)是采用Uncle Bob在2012年對(duì)web應(yīng)用提出的建議: Clean Architecture。
但是我發(fā)現(xiàn)Clean Architecture對(duì)于絕大多數(shù)安卓應(yīng)用來(lái)說(shuō)都有點(diǎn)過(guò)度設(shè)計(jì)了。
--EOF--