一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

六角架構(gòu)學(xué)的三個(gè)原則和技術(shù)1

jf_78858299 ? 來(lái)源:超級(jí)架構(gòu)師 ? 作者:南極真君 ? 2023-02-22 10:46 ? 次閱讀

Hexagonal Architecture于2005年由Alistair Cockburn撰寫(xiě),是一個(gè)具有許多優(yōu)勢(shì)的軟件架構(gòu),自2015年以來(lái)又重新引起了人們的興趣。

六角架構(gòu)的初衷是:

允許應(yīng)用程序同樣由用戶,程序,自動(dòng)化測(cè)試或批處理腳本驅(qū)動(dòng),并與最終的運(yùn)行時(shí)設(shè)備和數(shù)據(jù)庫(kù)隔離開(kāi)發(fā)和測(cè)試。

為了探索通過(guò)自動(dòng)化測(cè)試引導(dǎo)應(yīng)用程序的好處,或者從數(shù)據(jù)庫(kù)中單獨(dú)開(kāi)發(fā)和測(cè)試,我們建議您閱讀我們最近發(fā)布的測(cè)試金字塔上的這一系列博客文章:實(shí)踐中的測(cè)試金字塔。

承諾非常有吸引力,它還有另一個(gè)有益效果:它允許隔離應(yīng)用程序的核心業(yè)務(wù),并自動(dòng)測(cè)試其行為,而不依賴于其他任何事情。這可能是該架構(gòu)引起域驅(qū)動(dòng)設(shè)計(jì)(DDD)從業(yè)者關(guān)注的原因。但要小心,DDD和六邊形結(jié)構(gòu)是兩個(gè)相當(dāng)不同的概念,它們可以相互加強(qiáng),但不一定一起使用。但這是另一個(gè)時(shí)間的主題!

最后,這種架構(gòu)設(shè)置起來(lái)并不復(fù)雜。它基于一些簡(jiǎn)單的規(guī)則和原則。讓我們探索這些原則,看看它們?cè)趯?shí)踐中的含義。

  • 六角架構(gòu)原理
  • 細(xì)節(jié):內(nèi)部和外部的代碼如何組織?
  • 細(xì)節(jié):運(yùn)行時(shí)
  • 細(xì)節(jié):右側(cè)的依賴性反轉(zhuǎn)
  • 細(xì)節(jié):為什么左邊有借口?
  • 六角形結(jié)構(gòu)測(cè)試
  • 更進(jìn)一步
  • 參考

六角架構(gòu)學(xué)原理

六邊形體系結(jié)構(gòu)基于三個(gè)原則和技術(shù):

  • 明確區(qū)分應(yīng)用程序,域和基礎(chǔ)結(jié)構(gòu)
  • 依賴關(guān)系從應(yīng)用程序和基礎(chǔ)結(jié)構(gòu)到域
  • 我們使用端口和適配器隔離邊界

詞匯說(shuō)明:在本文的其余部分中,將使用“應(yīng)用程序”,“域”和“基礎(chǔ)結(jié)構(gòu)”等字樣。這些詞不是來(lái)自原始文章,而是來(lái)自領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)從業(yè)者頻繁使用六邊形體系結(jié)構(gòu)。作為參考,原始文章的文字在下面的部分中說(shuō)明。

原則:?jiǎn)为?dú)的應(yīng)用程序,域和基礎(chǔ)結(jié)構(gòu)

第一個(gè)原則是明確地將代碼分成三個(gè)大的形式化區(qū)域。

圖片

左側(cè),應(yīng)用程序端

這是用戶或外部程序與應(yīng)用程序交互的一面。它包含允許這些交互的代碼。通常,您的用戶界面代碼,API的HTTP路由,以及使用您的應(yīng)用程序的程序的JSON序列化都在這里。

這是我們找到驅(qū)動(dòng)領(lǐng)域的演員的一面。

注意:Alistair Cockburn談?wù)搼?yīng)用程序方面的左側(cè)或用戶側(cè)。

領(lǐng)域,在中心

這是我們想要從左側(cè)和右側(cè)隔離的部分。它包含所有關(guān)注和實(shí)現(xiàn)業(yè)務(wù)邏輯的代碼。業(yè)務(wù)詞匯和純粹的業(yè)務(wù)邏輯,與解決您的應(yīng)用程序的具體問(wèn)題,使其豐富和具體的所有內(nèi)容相關(guān)聯(lián),處于中心位置。理想情況下,不知道如何編碼的領(lǐng)域?qū)<铱梢蚤喿x本部分中的一段代碼并指出您的不一致(真實(shí)的故事,這些都可能發(fā)生在您身上!)。

注意:Alistair Cockburn談?wù)撚虻闹行幕驑I(yè)務(wù)邏輯。

右側(cè),基礎(chǔ)設(shè)施方面

在這里,我們可以找到您的應(yīng)用程序需要什么,它驅(qū)動(dòng)的工作。它包含必要的基礎(chǔ)結(jié)構(gòu)詳細(xì)信息,例如與數(shù)據(jù)庫(kù)交互的代碼,調(diào)用文件系統(tǒng)或處理對(duì)您所依賴的其他應(yīng)用程序的HTTP調(diào)用的代碼。

這是我們找到由領(lǐng)域管理的演員的一面。

注意:Alistair Cockburn談?wù)摶A(chǔ)設(shè)施方面的右側(cè)或服務(wù)器端。

以下原則將允許在應(yīng)用程序,域和基礎(chǔ)結(jié)構(gòu)之間實(shí)現(xiàn)這種邏輯分離。

為什么這很重要?

這種分離的第一個(gè)重要特征是它將問(wèn)題分開(kāi)。在任何時(shí)候,您都可以選擇專注于單個(gè)邏輯,幾乎獨(dú)立于其他兩個(gè)邏輯:應(yīng)用程序邏輯,業(yè)務(wù)邏輯或基礎(chǔ)架構(gòu)邏輯。它們?cè)诓换旌系那闆r下更容易理解,并且每個(gè)邏輯的約束對(duì)其他邏輯的影響較小。

另一個(gè)特點(diǎn)是我們將業(yè)務(wù)邏輯放在代碼的最前端。它可以在目錄或模塊中隔離,以使其對(duì)所有開(kāi)發(fā)人員都明確。它可以在不承擔(dān)程序其余部分的認(rèn)知負(fù)荷的情況下進(jìn)行定義,改進(jìn)和測(cè)試。這很重要,因?yàn)樽罱K,開(kāi)發(fā)人員對(duì)生產(chǎn)中的業(yè)務(wù)有了解。

最后,在自動(dòng)化測(cè)試方面(我們將在下面看到),我們將以合理的努力成功進(jìn)行測(cè)試:

  1. 整個(gè)域單獨(dú),
  2. 在Infrastructure端獨(dú)立地集成Application和Domain
  3. 在應(yīng)用程序端獨(dú)立地集成域和基礎(chǔ)架構(gòu)

插圖:應(yīng)用程序的一個(gè)小例子

為了更具體地說(shuō)明這些原則,我們將使用Alistair期間在“Hexagon”事件中使用的小例子,該事件由Thomas Pierrain(@tpierrain)和Alistair Cockburn(@TotherAlistair)于2017年提出。注意:您可以在文章末尾找到視頻和事件代碼。

這個(gè)小應(yīng)用程序的目的是提供一個(gè)命令行程序,將詩(shī)歌寫(xiě)入控制臺(tái)的標(biāo)準(zhǔn)輸出。

此應(yīng)用程序的預(yù)期輸出示例:

$ ./printPoem
Here is some poem:
I want to sleep
Swat the files
Softly, please.
-- Masaoka Shiki (1867 - 1902)
Type enter to exit...

為了正確地說(shuō)明三個(gè)區(qū)域(應(yīng)用程序,域,基礎(chǔ)設(shè)施),此應(yīng)用程序?qū)⒃谕獠肯到y(tǒng)中搜索詩(shī)歌:文件。我們還可以將此應(yīng)用程序連接到數(shù)據(jù)庫(kù),原則是相同的。

在這種情況下,我們?nèi)绾螒?yīng)用這第一個(gè)原則,即分成三個(gè)區(qū)域?如何在左側(cè)(什么驅(qū)動(dòng)它),在中心(核心業(yè)務(wù))和右側(cè)(什么是驅(qū)動(dòng))分發(fā)?

圖片

應(yīng)用方面

從用戶的角度來(lái)看,程序是作為控制臺(tái)應(yīng)用程序呈現(xiàn)的。因此,控制臺(tái)的概念將位于應(yīng)用程序端的左側(cè)。通過(guò)控制臺(tái),用戶將驅(qū)動(dòng)領(lǐng)域。

基礎(chǔ)設(shè)施方面

從技術(shù)上講,在我們的例子中,詩(shī)歌存儲(chǔ)在一個(gè)文件中。這個(gè)文件的概念將在基礎(chǔ)設(shè)施方面的右側(cè)找到。該企業(yè)將通過(guò)試用這一右側(cè)來(lái)提出其詩(shī)歌的要求,具體由PoetryLibraryFileAdapter實(shí)施。

在這里,如上所述,我們可以輕松地交換我們的詩(shī)歌來(lái)源(文件,數(shù)據(jù)庫(kù),網(wǎng)絡(luò)服務(wù)......)。因此,作為文件的源的實(shí)際實(shí)現(xiàn)是技術(shù)細(xì)節(jié)(也稱為技術(shù)實(shí)現(xiàn)細(xì)節(jié))。

領(lǐng)域方面

在這種情況下,我們的核心業(yè)務(wù)是對(duì)用戶有價(jià)值的東西,就是閱讀詩(shī)歌的概念。我們可以使用PoetryReader類在代碼中實(shí)現(xiàn)這個(gè)概念

應(yīng)用→域交互

從業(yè)務(wù)角度來(lái)看,請(qǐng)求是來(lái)自控制臺(tái)應(yīng)用程序還是其他應(yīng)用程序無(wú)關(guān)緊要,這是我們希望能夠抽象的技術(shù)細(xì)節(jié)。這恰恰是最初的意圖之一:“由用戶和測(cè)試一起驅(qū)動(dòng)”。因此,域中沒(méi)有控制臺(tái)的概念。然而,我們的應(yīng)用程序允許從用戶的角度(=它提供的服務(wù))來(lái)請(qǐng)求詩(shī)歌。我們將在域中找到這一概念(由IRequestVerses實(shí)現(xiàn)),這將允許應(yīng)用程序端與域進(jìn)行交互。

域→基礎(chǔ)設(shè)施互動(dòng)

同樣,從域的角度來(lái)看,詩(shī)歌是來(lái)自文件還是數(shù)據(jù)庫(kù)并不重要,我們希望能夠獨(dú)立于外部系統(tǒng)測(cè)試我們的應(yīng)用程序。域中沒(méi)有文件概念。要運(yùn)作,領(lǐng)域仍然需要得到詩(shī)歌。我們發(fā)現(xiàn)這個(gè)概念是以IObtainPoems界面的形式在Domain中獲取詩(shī)歌。正是這種獲取詩(shī)歌的概念將允許域與基礎(chǔ)設(shè)施方面進(jìn)行交互。

注意:從這里,當(dāng)您閱讀圖表時(shí),您可以開(kāi)始觀察顯示類之間關(guān)系的箭頭。實(shí)線箭頭表示調(diào)用或組合交互。沒(méi)有填充的箭頭表示繼承關(guān)系(如在UML中)。但不需要立即分析所有內(nèi)容,我們稍后會(huì)詳細(xì)探討。

注意:名稱IRequestVerses和IObtainPoems代表許多接口,我們將按照原則來(lái)討論它們。對(duì)于軼事,使用“i”啟動(dòng)接口名稱的約定不再流行,但Thomas Pierrain將接口名稱作為第一人稱單數(shù)的句子讀取。IRequestVerses寫(xiě)道:例如我請(qǐng)求經(jīng)文。我喜歡這個(gè)主意。

原則:依賴進(jìn)入內(nèi)部

這是實(shí)現(xiàn)目標(biāo)的基本原則。我們已經(jīng)開(kāi)始在先前的原則中看到這一點(diǎn)。

圖片

Principle: Dependencies go to the Domain

程序可以通過(guò)控制臺(tái)和測(cè)試來(lái)控制,域中沒(méi)有控制臺(tái)的概念。域不依賴于應(yīng)用程序端,應(yīng)用程序端依賴于域。應(yīng)用程序端(ConsoleAdapter)依賴于詩(shī)請(qǐng)求的概念,IRequestVerses(它定義了用戶方面的通用“詩(shī)請(qǐng)求”機(jī)制)。

同樣,程序可以獨(dú)立于其外部系統(tǒng)進(jìn)行測(cè)試,Domain不依賴于Infrastructure方面,相反,它是依賴于Domain的Infrastructure方面,通過(guò)獲取詩(shī)歌的概念,IObtainPoems。從技術(shù)上講,基礎(chǔ)結(jié)構(gòu)方面的類將繼承Domain中定義的接口并實(shí)現(xiàn)它,我們將在下面詳細(xì)討論它以討論依賴性反轉(zhuǎn)。

內(nèi)在和外在

如果我們將依賴關(guān)系(<<>)視為箭頭,那么這個(gè)原則將中心域定義為內(nèi)部,將其他所有內(nèi)容定義為外部(見(jiàn)圖)。當(dāng)我們討論六邊形結(jié)構(gòu)時(shí),我們經(jīng)常發(fā)現(xiàn)內(nèi)部和外部的這些概念。它甚至可以成為記憶和傳播的基本點(diǎn):依賴關(guān)系進(jìn)入內(nèi)部。

換句話說(shuō),一切都取決于域,域不依賴于任何東西。Alistair Cockburn堅(jiān)持內(nèi)部和外部的這種劃分,這比應(yīng)用和基礎(chǔ)設(shè)施之間的差異更能解決最初的問(wèn)題。

圖片

原理:邊界與接口隔離

圖片

總而言之,應(yīng)用程序代碼通過(guò)業(yè)務(wù)代碼中定義的接口(此處為IRequestVerses)來(lái)驅(qū)動(dòng)業(yè)務(wù)代碼。業(yè)務(wù)代碼通過(guò)業(yè)務(wù)代碼(IObtainPoems)中定義的接口驅(qū)動(dòng)基礎(chǔ)架構(gòu)。這些接口充當(dāng)內(nèi)部和外部之間的顯式絕緣體。

隱喻:端口和適配器

六邊形體系結(jié)構(gòu)使用端口和適配器的比喻來(lái)表示內(nèi)部和外部之間的交互。圖像是域定義了端口,如果它們遵循端口定義的規(guī)范,則可以在其上交換連接所有類型的適配器。

圖片

例如,我們可以設(shè)想Domain的一個(gè)端口,我們將在單元測(cè)試期間連接硬編碼數(shù)據(jù)源,或者在集成測(cè)試中連接真實(shí)數(shù)據(jù)庫(kù)。只需在Infrastructure端編寫(xiě)相應(yīng)的實(shí)現(xiàn)和適配器,Domain就不會(huì)受到此更改的影響。

由業(yè)務(wù)代碼定義的這些接口隔離并允許與外部世界的交互,這些接口是Ports&Adapters隱喻的端口。注意:如前所述,端口由業(yè)務(wù)定義,因此它們位于內(nèi)部。

另一方面,適配器表示外部代碼在端口與應(yīng)用程序代碼或基礎(chǔ)結(jié)構(gòu)的其余部分之間形成粘合劑。這里,適配器分別是ConsoleAdapter和PoetryLibraryFileAdapter。這些適配器在外面。

另一個(gè)隱喻:六角形

圖片

正如我們?cè)谏蠄D中看到的那樣,另一個(gè)為這個(gè)架構(gòu)命名的比喻是六邊形。為什么是六邊形?主要原因是它是一個(gè)易于繪制的形狀,為圖表上的多個(gè)端口和適配器留出了空間。事實(shí)證明,即使六邊形最終是軼事,六邊形體系結(jié)構(gòu)的表達(dá)也比端口和適配器模式更受歡迎??赡苁且?yàn)槁?tīng)起來(lái)更好?

理論部分已經(jīng)結(jié)束,沒(méi)有其他原則:對(duì)于其他一切我們完全自由。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3884

    瀏覽量

    65580
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3817

    瀏覽量

    82171
  • ddd
    ddd
    +關(guān)注

    關(guān)注

    0

    文章

    23

    瀏覽量

    3006
  • 腳本驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    1374
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    六角逆變器

    HEF4069UBP這個(gè)六角逆變器有什用?具體功能是什么?
    發(fā)表于 10-26 20:36

    求助絲印為360A1六角芯片資料

    絲印為360A1六角芯片,有了解的請(qǐng)指點(diǎn)一下。
    發(fā)表于 08-31 20:45

    MC14069UBDR2G六角逆變器的相關(guān)資料推薦

    MC14069UB六角形逆變器采用MOS P溝道構(gòu)建和單通道中的N通道增強(qiáng)模式器件結(jié)構(gòu)體。這些逆變器主要用于低功率需要耗散和/或高抗噪性。 六個(gè)中的每一個(gè)逆變器是最小化傳播延遲的單一階段。特征?電源
    發(fā)表于 11-16 09:16

    一種改進(jìn)的六角形砍邊細(xì)分方法

    研究了六角形網(wǎng)格上的曲面細(xì)分算法,改進(jìn)了六角形網(wǎng)格砍邊細(xì)分算法。在邊形網(wǎng)格的砍邊細(xì)分過(guò)程中,利用對(duì)偶砍法對(duì)非六角形網(wǎng)格進(jìn)行
    發(fā)表于 01-15 16:22 ?6次下載

    自行車輻條巧制內(nèi)六角扳手

    自行車輻條巧制內(nèi)六角扳手 家電維修時(shí)廠需要用到不同規(guī)格的內(nèi)六角扳手。這類
    發(fā)表于 09-09 15:14 ?2629次閱讀
    自行車輻條巧制內(nèi)<b class='flag-5'>六角</b>扳手

    六角和內(nèi)六角螺栓,該如何選擇?

    結(jié)構(gòu)上,內(nèi)六角螺栓和外六角螺栓很容易辨別。螺紋部分基本沒(méi)有差異,外六角是頭部的邊呈邊形,頭部沒(méi)有凹陷。為了增大頭部承壓面積,還可以做成外六角
    的頭像 發(fā)表于 01-08 11:29 ?2908次閱讀

    內(nèi)六角螺栓硬度等級(jí)及優(yōu)勢(shì)

    所謂的內(nèi)六角螺栓就是指的圓柱頭為內(nèi)六角形狀的,也可以稱為內(nèi)六角螺釘,內(nèi)六角圓柱頭螺釘和內(nèi)六角螺絲。我們一般情況下常用的內(nèi)
    的頭像 發(fā)表于 02-13 13:41 ?6104次閱讀

    六角反相器-74LV04

    六角反相器-74LV04
    發(fā)表于 02-15 19:34 ?0次下載
    <b class='flag-5'>六角</b>反相器-74LV04

    3.3 V 六角逆變器-74LVT04

    3.3 V 六角逆變器-74LVT04
    發(fā)表于 02-15 19:55 ?0次下載
    3.3 V <b class='flag-5'>六角</b>逆變器-74LVT04

    六角反相器-74ALVC04

    六角反相器-74ALVC04
    發(fā)表于 02-16 20:41 ?0次下載
    <b class='flag-5'>六角</b>反相器-74ALVC04

    六角反相器-74ABT04

    六角反相器-74ABT04
    發(fā)表于 02-17 19:23 ?0次下載
    <b class='flag-5'>六角</b>反相器-74ABT04

    六角架構(gòu)學(xué)三個(gè)原則技術(shù)2

    除了上面提到的原則,我們完全可以自由地按照我們的意愿在每個(gè)區(qū)域內(nèi)組織代碼。 關(guān)于業(yè)務(wù)代碼,內(nèi)部,一個(gè)好主意是選擇根據(jù)業(yè)務(wù)邏輯組織其模塊(或目錄)。
    的頭像 發(fā)表于 02-22 10:59 ?520次閱讀
    <b class='flag-5'>六角</b><b class='flag-5'>架構(gòu)</b><b class='flag-5'>學(xué)</b>的<b class='flag-5'>三個(gè)</b><b class='flag-5'>原則</b>和<b class='flag-5'>技術(shù)</b>2

    六角反相器-74LV04AT

    六角反相器-74LV04AT
    發(fā)表于 02-27 19:08 ?0次下載
    <b class='flag-5'>六角</b>反相器-74LV04AT

    六角逆變器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《六角逆變器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 05-11 11:07 ?0次下載
    <b class='flag-5'>六角</b>逆變器數(shù)據(jù)表

    六角逆變器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《六角逆變器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 05-14 11:06 ?0次下載
    <b class='flag-5'>六角</b>逆變器數(shù)據(jù)表