成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

the-clean-architecture

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

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

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

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

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

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

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

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

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

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

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

實體(Entity)

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

用例(Use Cases)

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

接口適配(Interface Adapters)

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

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

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

是不是只有四層?

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

跨越邊界(Crossing boundaries)

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

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

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

總結(jié)


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


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

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/127934.html

相關(guān)文章

發(fā)表評論

0條評論

閱讀需要支付1元查看
<