成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

The Clean Architecture

Galence / 3300人閱讀

摘要:依賴規(guī)則同心圓表示軟件的不同部分。但是,這個調(diào)用不能直接進行因為會違反依賴規(guī)則。我們使用動態(tài)多態(tài)來創(chuàng)建與控制流相反的源碼依賴,以便于無論在控制流的任何方向都不會違反依賴規(guī)則。這會導(dǎo)致內(nèi)部圈需要知道外部圈的內(nèi)容進而違反依賴規(guī)則。

Robert C. Martin (Uncle Bob)

原文:https://blog.cleancoder.com/u...
譯:祝坤榮

在過去幾年我們看到關(guān)于系統(tǒng)架構(gòu)的很多想法。這些包括:

Alistair Cockburn的六邊形架構(gòu)(也叫做端口與適配器),Steve Freeman, 和 Nat Pryce在他們精彩的著作Growing Object Oriented Software(http://www.amazon.com/Growing...。

Jeffrey Palermo的Onion Architecture (http://jeffreypalermo.com/blo...

去年一片博客里的 Screaming Architecture (http://blog.cleancoders.com/2...

James Coplien 與Trygve Reenskaug的DCI(http://www.amazon.com/Lean-Ar...。

Ivar Jacobson的書: Object Oriented Software Engineering: A Use-Case Driven Approach 的BCE(http://www.amazon.com/Object-...)

盡管這些架構(gòu)在一些細節(jié)上都有不同,它們?nèi)允窍嗨频?。他們都有同樣的目?biāo),隔離關(guān)注點。他們都通過將軟件分層來達到隔離。每個都至少有一層業(yè)務(wù)規(guī)則,另一層作為接口。

每個這些架構(gòu)產(chǎn)出的系統(tǒng)都是:

獨立的框架。架構(gòu)不依賴一些存在類庫的特性。這樣你可以像工具一樣使用這種框架,而不需要讓你的系統(tǒng)受到它的約束條件。

可測試。業(yè)務(wù)規(guī)則可以脫離UI,數(shù)據(jù)庫,web服務(wù)器或其他外部元素進行測試。

獨立的UI。UI可以很容易的更換,系統(tǒng)的其他部分不需要變更。例如,Web UI可以被換成控制臺UI,不需要變更業(yè)務(wù)規(guī)則。

獨立的數(shù)據(jù)庫。你可以交換Oracle或SQL Server,用于Mongo,BigTable,CouchDB或其他的東西。你的業(yè)務(wù)規(guī)則不與數(shù)據(jù)庫綁定。

獨立的外部代理。實際你的業(yè)務(wù)規(guī)則并不知道關(guān)于外部世界的任何事情。

這篇文章上面的圖試著將以上所有架構(gòu)整合成一個可執(zhí)行的想法。

依賴規(guī)則

同心圓表示軟件的不同部分。大體上,你走的越遠,軟件的級別更高。外部的圓是機制,內(nèi)部的圓是策略。

讓這個架構(gòu)工作的覆蓋規(guī)則是依賴規(guī)則。這個規(guī)則說明了源代碼依賴只能向內(nèi)。內(nèi)部圓不能知道任何外部圓的事。實踐中,外部圓里一些聲明的名字不能被內(nèi)部圓里的代碼提到。這包括,函數(shù),類,變量或其他任何軟件實體。

同樣的,外部圓使用的數(shù)據(jù)格式不應(yīng)該被內(nèi)部圓使用,尤其是當(dāng)這些格式是被外部圓使用的框架生成的時候。我們不想讓外部圓的東西影響到內(nèi)部圓。

實體

實體封裝企業(yè)域范圍的業(yè)務(wù)規(guī)則。實體可以是一個有方法的對象,也可以是一組數(shù)據(jù)結(jié)構(gòu)和函數(shù)。只要企業(yè)里不同的應(yīng)用可以使用這些實體就可以。

如果你不是企業(yè)級,而只是寫一個單體應(yīng)用,那么這些實體就是應(yīng)用的業(yè)務(wù)對象。它們封裝了最通用和高層的規(guī)則。當(dāng)外部變化時它們基本不太會變化。例如,你不會認為這些對象會因為頁面導(dǎo)航或安全方面的變化而改變。任何特定應(yīng)用的操作都不應(yīng)該影響實體層。

用例

這層的軟件包含特定應(yīng)用的業(yè)務(wù)規(guī)則。它封裝并實現(xiàn)了系統(tǒng)的所有用例。這些用例組織了實體中的數(shù)據(jù)流向,并指揮這些實體使用他們的企業(yè)域業(yè)務(wù)規(guī)則來完成用例的目標(biāo)。

我們不期望這層影響實體。我們也不希望這層會在如數(shù)據(jù)庫,UI,或其他常用框架這樣的外部變化時被影響。這層隔離了以上關(guān)注點。

當(dāng)然我們期望對于應(yīng)用操作的變化會影響用例而進一步影響到這層的軟件。 如果一個用例的細節(jié)變化了,那么這層的代碼肯定也會被影響。

接口適配器

這層的軟件是一組適配器,其將數(shù)據(jù)轉(zhuǎn)換成從用例和實體最合適的格式,到對于一些類似數(shù)據(jù)庫或網(wǎng)站這種外部設(shè)施最合適的格式。在這一層,舉個例子,會包含GUI的MVC架構(gòu)。Presenters, Views,與Controllers都屬于這里。模型基本就是從controllers傳遞到用例的數(shù)據(jù)結(jié)構(gòu),并從用例返回到presenters和views。

類似的,數(shù)據(jù)被轉(zhuǎn)換了,在這層,從對于實體和用例合適的結(jié)構(gòu),變成對于持久層框架使用的結(jié)構(gòu)。這圈內(nèi)的代碼不應(yīng)該知道數(shù)據(jù)庫。如果數(shù)據(jù)庫是一個SQL數(shù)據(jù)庫,那么所有SQL都應(yīng)該在這層內(nèi),特別是此層與數(shù)據(jù)庫有關(guān)的部分。

這層其他適配器也需要將數(shù)據(jù)從類似外部服務(wù)的外部的結(jié)構(gòu),轉(zhuǎn)換成用例和實體使用的內(nèi)部結(jié)構(gòu)。

框架與驅(qū)動

最外層主要組合了數(shù)據(jù)庫,網(wǎng)絡(luò)框架這樣的框架和工具。在這層你除了寫一些與內(nèi)層環(huán)通信的膠水代碼,基本不會有其他代碼。

這層是所有細節(jié)存在的地方。網(wǎng)絡(luò)是細節(jié)。數(shù)據(jù)庫是細節(jié)。 我們將這些東西放在外部保證它們不會影響其他部分。

只有四個圈?

不是的,圓圈是個示意。你可能發(fā)現(xiàn)你需要不止4個。沒有規(guī)則說你一定要有四個。 實際上,依賴規(guī)則一直存在。源代碼依賴一直指向內(nèi)部。當(dāng)你向內(nèi)部移動時抽象的層次在增加。最外部的圓是很低層的具體細節(jié)。當(dāng)你內(nèi)移時軟件變得更抽象,并封裝了高一級的策略規(guī)則。最內(nèi)部的圓是最普遍的抽象層級。

跨越邊界

在圖的右下方是我們穿越圓圈邊界的示例。它展示了Controller和Presenter與下一層的用例進行通信。注意控制流。它從controller出發(fā),穿過用例,然后在presenter里執(zhí)行。也注意下源碼依賴。它們每個都指向內(nèi)部的用例。

我們通常使用依賴反轉(zhuǎn)原則解決這個明顯的問題。在java這樣的語言中,我們會整理源碼依賴與控制流相反的接口和繼承關(guān)系,讓它們從邊界正確的穿過。

例如,用例需要調(diào)用presenter。但是,這個調(diào)用不能直接進行因為會違反依賴規(guī)則。外圈的名字不能被內(nèi)圈提到。所以我們的用例調(diào)用內(nèi)圈的一個接口(在這個例子里是Use Case Output Port),并讓外圈的presenter實現(xiàn)它。

架構(gòu)里所有的邊界穿越都用這個技巧。我們使用動態(tài)多態(tài)來創(chuàng)建與控制流相反的源碼依賴,以便于無論在控制流的任何方向都不會違反依賴規(guī)則。

什么樣的數(shù)據(jù)會穿越邊界

正常來說穿過邊界的數(shù)據(jù)是簡單數(shù)據(jù)結(jié)構(gòu)。你可以使用基本結(jié)構(gòu)或簡單的Data Transfer 對象。或者可以方便的進行函數(shù)賦值的數(shù)據(jù)?;蛘吣憧梢源虬M一個hashmap,或者將它組裝成一個對象。重要的是穿過邊界的是隔離,簡單的數(shù)據(jù)結(jié)構(gòu)。我們不想搞變通傳遞實體或數(shù)據(jù)庫行數(shù)據(jù)。我們不想數(shù)據(jù)結(jié)構(gòu)有任何違反依賴規(guī)則的依賴。

例如,很多數(shù)據(jù)庫框架在查詢后返回一個方便的數(shù)據(jù)格式。我們可以叫它RowStructure(行結(jié)構(gòu))。我們不想將這個行機構(gòu)通過邊界傳遞給內(nèi)部的圈。這會導(dǎo)致內(nèi)部圈需要知道外部圈的內(nèi)容進而違反依賴規(guī)則。

所以當(dāng)我們在邊界傳遞數(shù)據(jù)是,要注意其應(yīng)該是內(nèi)部圈的格式。

結(jié)論

遵從這些簡單規(guī)則并不難,并且能幫你減少以后的問題。通過將軟件隔離分層,并遵從依賴規(guī)則,你可以建立一個真正可測試的系統(tǒng),包含了以上所有好處。當(dāng)任何系統(tǒng)額外部部分過時了,比如數(shù)據(jù)庫或web框架,你可以容易的替換這些過時的元素。

本文來自微信公眾號「麥芽面包,id「darkjune_think」轉(zhuǎn)載請注明。
交流Email: [email protected]

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/74206.html

相關(guān)文章

  • the-clean-architecture

    過去幾年,我們已經(jīng)看到了一系列關(guān)于系統(tǒng)架構(gòu)的想法,包括:六邊形架構(gòu)(接口與適配器)洋蔥架構(gòu)(Onion Architecture)Screaming ArchitectureDCIBCE這些架構(gòu)有很多共同的點(思想),盡管它們細節(jié)上有所不區(qū)別,它們都有相同的目標(biāo),那就是關(guān)注點分離(the speration of concerns), 它們都是通過將軟件分層來實現(xiàn)這種分離,每個組件至少有一個用于業(yè)...

    社區(qū)管理員 評論0 收藏0
  • MVVM_Android-CleanArchitecture

    摘要:業(yè)務(wù)層,業(yè)務(wù)層,是最為核心的一層。對于和的狀態(tài)保存恢復(fù)也通過處理。對于的綁定操作和命令操作都是暴露的,也易于測試。需要注意的是標(biāo)簽的節(jié)點中要使用到根節(jié)點中標(biāo)簽里設(shè)置的的話需要這樣設(shè)置抽象類中設(shè)置了和注解,只起到清晰提醒作用。 原文發(fā)表于:Rockos blog(rocko.xyz)] - MVVM_Android-CleanArchitecture 前言 Architecture is...

    icattlecoder 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<