成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

回顧Bob大叔的簡(jiǎn)潔架構(gòu)

開(kāi)發(fā) 開(kāi)發(fā)工具
Robert Martin 就是我們常說(shuō)的Bob大叔,是碼界的骨灰級(jí)人物了,在4年前提出了所謂的簡(jiǎn)潔架構(gòu),值得回顧反思一下,看看是否可以借鑒到微服務(wù)中呢?

Robert Martin 就是我們常說(shuō)的Bob大叔,是碼界的骨灰級(jí)人物了,在4年前提出了所謂的簡(jiǎn)潔架構(gòu),值得回顧反思一下,看看是否可以借鑒到微服務(wù)中呢?

大叔在文中介紹了一下幾種知名的架構(gòu)思想:

  • Alistair Cockburn 的Hexagonal Architecture
  • Jeffrey Palermo 的 Onion Architecture
  • Screaming Architecture 在Bob 大叔的博客上
  • DCI 是 James Coplien, 和 Trygve Reenskaug提出的架構(gòu)模型
  • BCE 是 Ivar Jacobson 在其著作 Object Oriented Software Engineering: A Use-Case Driven Approach 提出的

盡管這些架構(gòu)在細(xì)節(jié)上有各種各樣的不同,大叔認(rèn)為是相似的,都有著相同的目標(biāo)就是——關(guān)注點(diǎn)分離,通過(guò)關(guān)注點(diǎn)分離把軟件分成若干層,系統(tǒng)都是這樣的:

  • 獨(dú)立的框架。架構(gòu)不依賴于功能豐富的軟件庫(kù),把框架作為工具而不是系統(tǒng)的約束。
  • 可測(cè)性. 商務(wù)邏輯可以不依賴TUI, 數(shù)據(jù)庫(kù), Web , 或其他外部元素就可以測(cè)試。
  • 獨(dú)立的UI. 無(wú)需改變系統(tǒng)的其他部分就可以輕松地改變,例如 一個(gè) A Web UI 換成控制臺(tái)UI,而無(wú)需改變業(yè)務(wù)邏輯。
  • 獨(dú)立的數(shù)據(jù)庫(kù).業(yè)務(wù)邏輯不與數(shù)據(jù)庫(kù)綁定,可以在各種數(shù)據(jù)庫(kù)間切換例如 Oracle 和SQL ,Mongo與 BigTable、 CouchDB等。
  • 外部代理的獨(dú)立性. 事實(shí)上,業(yè)務(wù)邏輯需要簡(jiǎn)化到無(wú)需知道外面的世界。

因此,大叔提出的簡(jiǎn)潔架構(gòu)試圖將這些架構(gòu)集成為一種簡(jiǎn)單的表達(dá)形式。

簡(jiǎn)潔架構(gòu)試圖

這一架構(gòu)工作的***原則就是依賴原則。這一原則說(shuō)明源代碼依賴指向內(nèi)部的,內(nèi)圓不知道外圓的一切, 特別地,外圓中聲明的東西不需要被內(nèi)圓中的代碼涉及,包括函數(shù),類,變量以及其他的軟件實(shí)體。同心圓代表了軟件的不同領(lǐng)域。一般地,越深入負(fù)責(zé),軟件的層次越多。外圓代表機(jī)制,內(nèi)圓代表策略。同樣的,外圓中的數(shù)據(jù)格式也不應(yīng)被內(nèi)圓使用,尤其是那些被外圓中的框架所生成的數(shù)據(jù)格式,并不希望外圓影響到內(nèi)圓。

實(shí)體 (Entities)

實(shí)體封裝了企業(yè)級(jí)的業(yè)務(wù)邏輯。一個(gè)實(shí)體可以是一個(gè)帶有方法的對(duì)象,或者一個(gè)數(shù)據(jù)結(jié)構(gòu)和函數(shù)的集合,實(shí)體可以被企業(yè)內(nèi)的多個(gè)應(yīng)用使用的。如果沒(méi)有企業(yè)只是寫單個(gè)應(yīng)用的話,這些實(shí)體就是應(yīng)用的業(yè)務(wù)對(duì)象。他們?cè)谕獠孔兓瘯r(shí)改動(dòng)最少,例如,不希望頁(yè)面導(dǎo)航的改變影響到實(shí)體對(duì)象的改變或者安全性。應(yīng)用的操作性改變不應(yīng)該影響實(shí)體層。

用例 (Use cases)

這一層的軟件包含了應(yīng)用相關(guān)的特定業(yè)務(wù)邏輯,封裝了所以的系統(tǒng)用例。這些用例編排了實(shí)體之間的數(shù)據(jù)流,目標(biāo)是將實(shí)體指向企業(yè)層面的業(yè)務(wù)規(guī)則。同樣不希望這一層影響到實(shí)體,也不希望這一層被外部元素所影響例如 數(shù)據(jù)庫(kù), UI, 或其他通用框架。然而,希望應(yīng)用操作的改變影響這一層的用例,如果一個(gè)用例的實(shí)現(xiàn)細(xì)節(jié)改變了,這一層的一些代碼一定受到影響。

接口適配器 (Interface Adapters)

該層的軟件是一組適配器的集合,這些適配器將數(shù)據(jù)轉(zhuǎn)換成用例和實(shí)體方便使用的格式,以及一些外部代理方便使用的格式例如數(shù)據(jù)庫(kù)或者Web。例如,一個(gè)包含MVC架構(gòu)的圖形界面,Presenters, Views, 和 Controllers 都位于該層。models就像數(shù)據(jù)結(jié)構(gòu)一些從controllers傳遞到use cases,然后從用例返回到presenters 和 views。

類似的,來(lái)自實(shí)體和用例的數(shù)據(jù)會(huì)被轉(zhuǎn)換到駐留框架,例如數(shù)據(jù)庫(kù)。這一層沒(méi)有向內(nèi)的代碼來(lái)感知外部的數(shù)據(jù)庫(kù)。如果數(shù)據(jù)庫(kù)是一個(gè)SQL 數(shù)據(jù)庫(kù)的話, 那么所有SQL被限制在該層,這一層中特殊的部分處理數(shù)據(jù)庫(kù)。這一層中還有其他一些適配器轉(zhuǎn)換外部服務(wù)的數(shù)據(jù)到內(nèi)部使用的用例和實(shí)體。

框架與驅(qū)動(dòng)(Frameworks and Drivers)

最外層油框架和工具組成,如數(shù)據(jù)庫(kù),Web框架等。 一般地,不需要寫大量的代碼就可以和內(nèi)部的圓進(jìn)行通信了。這一層細(xì)節(jié)密布,Web 是細(xì)節(jié)實(shí)現(xiàn),數(shù)據(jù)是另一種細(xì)節(jié),把他們保持在外可以減少傷害。

大叔的簡(jiǎn)潔架構(gòu)只有四層么?絕對(duì)不是的,這些圓不過(guò)是示意而言,可以遠(yuǎn)多于4層的。但依賴原則總是適用的,最外圈總是底層的具體實(shí)現(xiàn)。

右下角的框圖展示了是如何跨越邊界的,描繪了Controllers 和Presenters 如何與下一層的用例通信。注意一下控制流,開(kāi)始于controller, 穿過(guò)用例在presenter中執(zhí)行。這也是源代碼依賴,向內(nèi)執(zhí)行用例。這就是通常使用的DIP,在Java中,可以通過(guò)接口和繼承關(guān)系來(lái)實(shí)現(xiàn)跨邊界的控制流,動(dòng)態(tài)的多態(tài)性可以跨越這一架構(gòu)的所有邊界。跨越邊界的典型數(shù)據(jù)是簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)。可以使用基本結(jié)構(gòu)或者簡(jiǎn)單的數(shù)據(jù)傳輸對(duì)象,或者函數(shù)的調(diào)用參數(shù),重要的是相互隔離。例如,很多數(shù)據(jù)庫(kù)框架都在查詢時(shí)返回一個(gè)數(shù)據(jù)集, ***不要讓它跨邊界傳遞,它違反了依賴原則即內(nèi)圓知道了外圓的事情。

回顧

通過(guò)將軟件分層,遵守依賴原則,形成內(nèi)在的可測(cè)性,隔離外部的元素并具備可替代性,如此而已。

簡(jiǎn)潔架構(gòu)更像是一種指導(dǎo)性的原則,核心同樣是關(guān)注點(diǎn)分離和分層感知,沒(méi)有擺脫企業(yè)級(jí)應(yīng)用架構(gòu)的經(jīng)典觀念。

如果聯(lián)想一下復(fù)變函數(shù)中的保角變換,這 Clean Architecture 就會(huì)變成我們熟知的有趣模樣了.......

【本文來(lái)自51CTO專欄作者“老曹”的原創(chuàng)文章,作者微信公眾號(hào):喔家ArchiSelf,id:wrieless-com】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專欄
相關(guān)推薦

2013-07-05 10:07:53

軟件開(kāi)發(fā)者

2023-12-11 21:52:52

數(shù)據(jù)中心架構(gòu)數(shù)字時(shí)代

2020-05-19 20:45:27

MySQLref優(yōu)化器

2015-11-02 20:57:00

劉積仁

2012-11-09 09:27:29

GPU架構(gòu)AMDNVIDIA

2023-11-20 11:56:00

前端架構(gòu)域驅(qū)動(dòng)設(shè)計(jì)

2025-05-27 10:15:00

Go開(kāi)發(fā)軟件架構(gòu)

2015-03-25 10:59:55

javascriptjavascript編編程題題解

2017-12-12 08:32:14

代碼蝴蝶效應(yīng)系統(tǒng)

2015-07-30 14:45:19

java簡(jiǎn)潔

2018-09-18 16:20:08

Asyncjavascript前端

2021-04-25 11:31:45

React代碼整潔代碼的實(shí)踐

2014-12-11 09:43:34

2015-10-20 11:20:18

云計(jì)算OpenStack云遷移

2020-10-31 17:33:18

Scala語(yǔ)言函數(shù)

2011-05-12 10:48:49

CSS清理浮動(dòng)

2010-07-01 13:51:55

升級(jí)SQL Serve

2020-05-11 15:23:58

CQRS代碼命令

2022-07-21 07:09:21

React前端項(xiàng)目

2009-12-21 16:01:07

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 精品国产一区二区三区成人影院 | 亚洲欧洲精品成人久久奇米网 | 日韩精品免费 | 一级二级三级在线观看 | 99精品视频免费观看 | 国产乡下妇女做爰 | www312aⅴ欧美在线看 | 婷婷免费在线 | 蜜桃av人人夜夜澡人人爽 | 亚洲成人一级 | 国产免费一级一级 | 精品视频一区二区三区四区 | 水蜜桃亚洲一二三四在线 | 亚洲精品福利视频 | 久久国产日本 | 亚洲欧美国产视频 | 日韩亚洲视频 | 国产91亚洲精品一区二区三区 | 国产激情偷乱视频一区二区三区 | 五月天婷婷综合 | 欧美群妇大交群中文字幕 | 国产精品久久久久久久白浊 | 国产高清视频在线 | 日韩欧美中文 | 日韩一区二区三区在线看 | 国产一区二区在线免费观看 | 七七婷婷婷婷精品国产 | 在线亚洲一区二区 | 国产一区二区三区在线观看免费 | 日韩欧美在线观看一区 | 欧美日韩看片 | 亚洲手机在线 | 国产一区二区三区在线 | 一区二区三区视频在线观看 | 高清久久久| 成人免费视频7777777 | 亚洲电影一区 | 日韩手机视频 | 久久机热| 欧美一区二区大片 | 中文在线一区二区 |