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

資訊專(zhuān)欄INFORMATION COLUMN

the-clean-architecture

社區(qū)管理員 / 499人閱讀

過(guò)去幾年,我們已經(jīng)看到了一系列關(guān)于系統(tǒng)架構(gòu)的想法,包括:

這些架構(gòu)有很多共同的點(diǎn)(思想),盡管它們細(xì)節(jié)上有所不區(qū)別,它們都有相同的目標(biāo),那就是關(guān)注點(diǎn)分離(the speration of concerns), 它們都是通過(guò)將軟件分層來(lái)實(shí)現(xiàn)這種分離,每個(gè)組件至少有一個(gè)用于業(yè)務(wù)規(guī)則的層和另一個(gè)用于接口的層。 這些架構(gòu)中每一個(gè)都會(huì)產(chǎn)生這樣的系統(tǒng):

  1. 獨(dú)立的框架:該架構(gòu)不依賴于某些特性軟件庫(kù)的存,

  2. 可測(cè)試的(Testable):可以在不依賴UI、數(shù)據(jù)庫(kù)、Web服務(wù)器或任何其他外部依賴的情況下進(jìn)行測(cè)試

  3. 獨(dú)立于UI:UI可以輕松的更改,而無(wú)需更改系統(tǒng)的其余部分。例如用控制臺(tái)UI(終端)代替Web UI,而不需要更改業(yè)務(wù)規(guī)則。

  4. 獨(dú)立于數(shù)據(jù)庫(kù):你可以切換底層數(shù)據(jù)庫(kù),你的業(yè)務(wù)業(yè)務(wù)規(guī)則不應(yīng)該于數(shù)據(jù)庫(kù)綁定

  5. 獨(dú)立于任何外部依賴:你的業(yè)務(wù)規(guī)則根本不了解外部世界

本文頂部的圖是嘗試將所有這些體系結(jié)構(gòu)集成到一個(gè)可行的想法中的嘗試。

依賴性規(guī)則(The Dependency Rule)

同心圓表示軟件的不同的領(lǐng)域。一般來(lái)說(shuō),隨著軟件的發(fā)展,軟件會(huì)越來(lái)越高級(jí)(可以簡(jiǎn)單理解為分層越多)。越靠近外部的圓代表一種 機(jī)制(mechanisms),越內(nèi)部的圈代表一種政策(policy)。依賴性規(guī)則是軟件架構(gòu)很重要規(guī)則,該規(guī)則定義了源碼性依賴(source code dependencies)只能指向內(nèi)部,內(nèi)層不需要關(guān)注任何外層的邏輯。內(nèi)層的代碼不能夠引用外層的代碼,包括函數(shù),類(lèi),變量等。

實(shí)體(Entity)

實(shí)體封裝了企業(yè)范圍的業(yè)務(wù)規(guī)則。實(shí)體可以是一個(gè)具有方法的對(duì)象,也可以是一組數(shù)據(jù)結(jié)構(gòu)或函數(shù),只要實(shí)體可以被企業(yè)多個(gè)應(yīng)用程序使用,都可以成為實(shí)體。 如果你只是編寫(xiě)一個(gè)簡(jiǎn)單的業(yè)務(wù)程序(不涉及企業(yè)),那么該程序的業(yè)務(wù)對(duì)象就是實(shí)體。實(shí)體封裝了最通用和最高級(jí)的規(guī)則。當(dāng)某些外部變化時(shí),它們變化的 可能性最小。例如,你不可希望當(dāng)修改一個(gè)前端頁(yè)面時(shí),需要修改這些實(shí)體對(duì)象。對(duì)任何外層的修改都不會(huì)影響到實(shí)體層。

用例(Use Cases)

這一層通常是應(yīng)用程序的業(yè)務(wù)規(guī)則(Application Specific),它封裝并實(shí)現(xiàn)了應(yīng)用程序的所有用例,這些用例編排流入和流出實(shí)體層的數(shù)據(jù),通過(guò)這實(shí)體所實(shí)現(xiàn) 的企業(yè)業(yè)務(wù)規(guī)則實(shí)現(xiàn)用例業(yè)務(wù)規(guī)則。 我們不希望這一層的改變影響到實(shí)體層,同時(shí)也不會(huì)希望外層如數(shù)據(jù)庫(kù)的實(shí)現(xiàn)影響到這一層。

接口適配(Interface Adapters)

這一層的軟件(或模塊)是一組適配器,用來(lái)將用例層獲取的數(shù)據(jù)轉(zhuǎn)換為外層依賴(數(shù)據(jù)庫(kù),HTTPServer)的數(shù)據(jù)格式.例如GUI的MVC結(jié)構(gòu)通常在這一層實(shí)現(xiàn)。 實(shí)圖、演示者和控制器都屬于這一層。 同樣,這一層也會(huì)發(fā)生數(shù)據(jù)轉(zhuǎn)換,在這一層中數(shù)據(jù)會(huì)從用例層的結(jié)構(gòu)裝換持久性框架的結(jié)構(gòu)比如數(shù)據(jù)庫(kù),這一層不需要關(guān)注任何數(shù)據(jù)庫(kù)實(shí)現(xiàn)的邏輯

框架和驅(qū)動(dòng)程序(Frameworks and Drivers)

最外層通常是由框架和工具組成,如數(shù)據(jù)庫(kù)、Web框架,通常情況下這一層不需要有太多的代碼,只是一些粘合下層的代碼。這一層是所有細(xì)節(jié)所在,WEB是一個(gè) 細(xì)節(jié),數(shù)據(jù)庫(kù)是一個(gè)細(xì)節(jié),我們將這些放在外面,方便后續(xù)修改而不需要改動(dòng)底層。

是不是只有四層?

當(dāng)然不是,四層只是理想下的軟件分層模型,實(shí)際情況根據(jù)需求調(diào)整。依賴性原則始終適用,源碼依賴性始終是從外層指向內(nèi)層的,越往內(nèi)層移動(dòng),抽象級(jí)別越高。

跨越邊界(Crossing boundaries)

上圖的右下方是我們?nèi)绾卧竭^(guò)圓邊界的示例。它顯示了控制器和演示者在下一層與用例進(jìn)行通信。注意控制流程。它從控制器開(kāi)始,遍歷 用例,然后在演示者中結(jié)束執(zhí)行。另請(qǐng)注意源代碼依賴性。他們每個(gè)人都指向用例。我們通常通過(guò)使用依賴倒置原則解決這種明顯的矛盾。 例如,在Java之類(lèi)的語(yǔ)言中,我們將安排接口和繼承關(guān)系,以使源代碼依賴項(xiàng)在跨邊界的正確點(diǎn)處反對(duì)控制流。例如,考慮用例需要呼叫 演示者。但是,此調(diào)用不能直接進(jìn)行,因?yàn)檫@會(huì)違反“依賴關(guān)系規(guī)則”:外層中的任何定義都不能由內(nèi)層提及。 因此,我們?cè)趦?nèi)層中有一個(gè) 用例調(diào)用接口(在此處顯示為用例輸出端口),并在內(nèi)層中有一個(gè)演示者來(lái)實(shí)現(xiàn)它。使用相同的技術(shù)來(lái)跨越架構(gòu)中的所有邊界。 我們利用 動(dòng)態(tài)多態(tài)性來(lái)創(chuàng)建與控制流相反的源代碼依賴項(xiàng),以便無(wú)論控制流的方向如何,我們都可以遵守“依賴關(guān)系規(guī)則”。

什么數(shù)據(jù)需要跨越邊界

通常,跨越邊界的數(shù)據(jù)是簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)。如果愿意,可以使用基本結(jié)構(gòu)或簡(jiǎn)單的數(shù)據(jù)傳輸對(duì)象。或者,數(shù)據(jù)可以只是函數(shù)調(diào)用中的參數(shù)。 或者,您可以將其打包到一個(gè)哈希圖中,或?qū)⑵錁?gòu)造到一個(gè)對(duì)象中。重要的是,隔離的,簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)跨邊界傳遞。我們不想欺騙并傳 遞實(shí)體或數(shù)據(jù)庫(kù)行。我們不希望數(shù)據(jù)結(jié)構(gòu)具有任何違反《依賴性規(guī)則》的依賴性。例如,許多數(shù)據(jù)庫(kù)框架都響應(yīng)查詢返回方便的數(shù)據(jù)格式。 我們可以稱(chēng)其為RowStructure。 我們不想將該行結(jié)構(gòu)向內(nèi)跨邊界傳遞。 這將違反“依賴關(guān)系規(guī)則”,因?yàn)樗鼤?huì)迫使一個(gè)內(nèi)圈知道一些 關(guān)于外圈的信息。因此,當(dāng)我們跨邊界傳遞數(shù)據(jù)時(shí),數(shù)據(jù)總是以最方便內(nèi)層形式出現(xiàn)。

總結(jié)


遵循這些簡(jiǎn)單規(guī)則并不難,并且可以避免許多麻煩。通過(guò)將軟件劃分為多個(gè)層,并遵循“依賴關(guān)系規(guī)則”,您將創(chuàng)建一個(gè)具有內(nèi)在可測(cè)試性 的系統(tǒng),并具有其所隱含的所有優(yōu)勢(shì)。當(dāng)系統(tǒng)的任何外部部分(例如數(shù)據(jù)庫(kù)或Web框架)過(guò)時(shí)時(shí),您都可以以最少的麻煩替換那些過(guò)時(shí)的元素。


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

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

相關(guān)文章

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<