[譯文]Domain Driven Design Reference(六)—— 提煉戰略設計

来源:https://www.cnblogs.com/Zachary-Fan/archive/2018/06/08/DDDReference6.html
-Advertisement-
Play Games

本書是Eric Evans對他自己寫的《領域驅動設計-軟體核心複雜性應對之道》的一本字典式的參考書,可用於快速查找《領域驅動設計》中的諸多概念及其簡明解釋。 其它本系列其它文章地址: [譯文]Domain Driven Design Reference(一)—— 前言 [譯文]Domain Driv ...


本書是Eric Evans對他自己寫的《領域驅動設計-軟體核心複雜性應對之道》的一本字典式的參考書,可用於快速查找《領域驅動設計》中的諸多概念及其簡明解釋。

 

 

其它本系列其它文章地址:

[譯文]Domain Driven Design Reference(一)—— 前言

[譯文]Domain Driven Design Reference(二)—— 讓模型起作用

[譯文]Domain Driven Design Reference(三)—— 模型驅動設計的構建模塊

[譯文]Domain Driven Design Reference(四)—— 柔性設計

[譯文]Domain Driven Design Reference(五)—— 為戰略設計的上下文映射 

[譯文]Domain Driven Design Reference(六)—— 提煉戰略設計

 

 

  你如何專註於你的核心問題,並避免陷入一大堆細枝末節?

  提煉是是一種分離混合物成分的過程,以提取出一種使其更有價值和有用的形式。模型是知識的提煉。隨著每一次重構的深入,我們抽象出領域知識和優先順序的一些關鍵方面。現在,回過頭來看戰略視角,本章將探討如何區分模型的涉獵範圍並提煉整個領域模型。

 

核心領域

  在一個大型系統中,有太多的合作組件,一切都很複雜,但都是成功的必要條件,所以領域模型的本質,真正的商業資產,可能會被掩蓋和忽略。

  殘酷的現實是,並非所有設計的部分都要同樣的精煉。優先事項必須確定。為了使領域模型成為一種資產,該模型的關鍵核心必須是整潔且充分利用來創建應用程式功能。但是缺乏豐富經驗的開發者傾向於對技術基礎設施或者可清晰定義的領域問題感興趣,這些問題可以在沒有專門領域知識的情況下被理解。

  因此:

  歸納模型。定義一個核心域,並提供一種可以很容易區分支持模型和代碼的方法。讓最有價值和最專業的概念顯露出來。

  將頂尖人才應用到核心領域,並據此招聘。在核心中花費精力尋找一個深層的模型,並開發一個柔性設計來實現系統的遠景。

  通過如何支持提煉出來的核心來證明對其他任何部分的投資是合理的。

 

通用子域

  模型的某些部分增加了複雜性,而沒有捕獲或傳播專業知識。任何無關緊要的東西都會使核心領域更難識別和理解。這個模型符合所有人都知道或者是屬於專業的一般原則,這些原則不是你的主要關註點,而是發揮輔助作用。然而,這些其他的元素對於系統的功能和模型的完整表達都是必不可少的。

  因此:

  識別不是你的項目動機的內聚子域。提取出這些子域的通用模型,並將它們放在單獨的模塊中。不要留下你的特點。

  一旦它們被分離,將它們的後續開發優先順序置於核心領域之下,並避免你的核心去做這些任務(因為這些核心開發將從他們那裡獲得很少的領域知識)。還要考慮這些通用子域的現成解決方案或已發佈的模型

 

領域願景宣言

  在項目開始時,模型通常是不存在的,但是關註其發展的需求已經存在。在開發的後期階段,需要對系統的價值進行解釋,而不需要對模型進行深入研究。此外,領域模型的關鍵方面可能跨越多個限界上下文,但是根據定義,這些不同的模型不能被構造來顯示它們的共同焦點。

  因此:

  寫一個關於核心領域的簡短描述(大概一頁)以及它將帶來的價值,即“價值主張”。忽略那些不區分該領域模型和其它東西的方面。顯示領域模型如何服務和平衡多種利益。保持它的精簡。儘早寫下此聲明,併在獲得新見解時對其進行修改。

 

突出核心

  領域願景宣言以廣義的術語來標識核心領域,但是它將特定的核心模型元素的識別留給了個體的解釋。除非團隊中的溝通水平非常高,否則單憑願景宣言沒有多大影響。

  即使團隊成員大致知道什麼是核心領域,但不同的人不會挑出相同的元素,即使是同一個人,在不同的時間點做出的選擇也不一定是一致的。不斷過濾模型以識別關鍵部分的腦力勞動更好地將註意力集中在設計思維上,並且需要對模型有全面的認識。必須使核心域更容易看到。

  對代碼進行重大的重構是識別核心領域的理想方式,但它們在短期內並不總是實用的。事實上,如果沒有團隊所缺乏的觀點,這種重大的代碼重構就很難進行。

  因此(作為突出核心的一種形式):

  編寫一個非常簡短的文檔(3到7個簡單頁面),描述核心領域和核心元素之間的主要交互。

  和/或(作為突出核心的另一種形式):

  在模型的主存儲庫中標記核心領域的元素,而不是特別地試圖闡明其角色。讓開發人員輕鬆瞭解核心的內外內容。

  如果濃縮文件概括了核心領域的要點,那麼它就可以作為一個實際的指標,說明模型變更的重要性。當模型或代碼變更影響到濃縮文檔時,需要與其他團隊成員協商。當更改完成時,需要立即通知所有團隊成員,並傳播新版本的文檔。除核心外的變更或未包含在濃縮文檔中的細節,可以不經協商或通知的情況下進行而集成,並且其他成員在其工作過程中也會遇到。然後開發人員擁有絕大多數敏捷過程所建議的自主權。

  儘管有願景宣言和突出的核心信息和指南的存在,但是它們實際上並沒有修改模型或代碼本身。劃分通用子域將從物理上去除一些分散註意力的元素。接下來,我們將研究其它方式來結構性地更改模型和設計本身,以使核心領域更易理解和管理。。。

 

內聚機制

  開始膨脹設計使得計算有時會達到一個複雜程式。概念性的"做什麼"被機械的"如何做"所淹沒。提供解決問題演算法的大量方法模糊了表達問題的方法。

  因此:

  將概念上的內聚機制分離到一個單獨的輕量級框架。特別註意形式主義或有良好文檔的演算法類別。用意圖揭示介面來公開框架的功能。現在,領域中的其他元素就可以只專註與如何表達問題(做什麼)了,而把解決方案的複雜細節(如何做)轉移給了框架。

  分解通用子域會減少混亂,而內聚機制有助於封裝複雜的操作。這就留下了一個更專註的模型,減少了對用戶進行活動的方式沒有特別價值的這類干擾。但是,你不可能在沒有核心的領域模型中找到好的結果。分離的核心是採取直接的方式來結構化地標記出核心領域。。。

 

隔離核心

  模型中的元素可能部分服務於核心領域,並且部分扮演輔助角色。核心元素可能與通用元素緊密耦合。核心的概念性內聚力可能不強或缺失。所有這些混亂和複雜關係扼殺了核心。設計師不能清楚地看到最重要的關係,導致設計薄弱。

  因此:

  對模型進行重構,把核心概念從支持性元素(包括定義得不清楚的那些元素)中分離出來,並增強核心的內聚性,同時減少它與其他代碼的耦合。把所有通用元素或支持性元素提取到其他對象中,並把這些對象放到其他的包中,即使這會把一些緊密耦合的元素分開。

 

抽象核心

  即使是核心領域模型通常也有很多細節,因此溝通大局面可能是困難的。當單獨模塊中的子域之間存在很多交互時,要麼在模塊之間創建許多引用,要麼就會破壞分區的大部分價值,否則交互將不得不間接地進行,這使得模型變得模糊。

  因此:

  確定模型中最基本的區分概念,並將它們分為不同的類,抽象類或介面。設計這個抽象模型,以表達大部分重要組件之間的交互。將這個抽象的整體模型放在它自己的模塊中,而專門的、具體的實現類留在由子域定義的它們自己的模塊中。

 

 

 

 

作者:Zachary_Fan
出處:http://www.cnblogs.com/Zachary-Fan/p/DDDReference6.html

 

 

如果你想及時得到個人自寫文章的消息推送,歡迎掃描下麵的二維碼~。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 什麼是HTML? HTML其實是HyperText Markup Language的縮寫,超文本標記語言 如何重命名文件? 首先利用記事本保存了一個標題和兩段描述,然後修改純文本文件的擴展名為.html,然後再利用瀏覽器打開 打開之後發現顯示的格式不對,不對的原因是在純文本文件中所有文字都是同級別的 ...
  • 如圖為jd的廣告頁面 如果想給每個盒子加上美觀的border,實現如下效果 如果給每個li加border的話盒子就會被撐開,則依照浮動特性一行就容納不下4個li,li會自動掉下來。這時,可以給ul一個寬度,li就不會掉下來,如下圖所示 這時,剛好ul會比外面的盒子高幾像素和幾及像素(如果不清除浮動u ...
  • 在windows系統中如何查看文件的擴展名,預設情況下windows系統是不顯示文件的擴展名的,但是作為一個開發者而言,查看文件的擴展名是我們必備的技能 win10:隨便打開一個文件夾 點擊查看 將文件擴展名的選項勾上 html文件的擴展名是.html 電腦上的一個文件是可以“同時”被多個軟體打開的 ...
  • HTTP是Hypertext Transfer Protocol的縮寫,譯為:超文本傳輸協議 什麼是協議? 在現實生活中有很多的協議,例如租房協議/買賣協議/離婚協議 無論是什麼協議它們都有一個共同點,就是用來規範/約束某一類事物 HTTP協議是用來規範/約束哪一類事物? HTTP協議就是相當於我們 ...
  • ...
  • 請求報文:請求行+請求頭+空行+請求體 響應報文:響應行+響應頭+響應體 如何打開谷歌的開發者工具? ...
  • 什麼是伺服器? 伺服器也是電腦,只不過是比我們的電腦配置更高的電腦,並且24小時不斷電,不關機的電腦 伺服器是專門用於存儲數據的電腦,訪問者可以訪問伺服器獲得伺服器上存儲的數據 伺服器一旦關機,訪問者就無法訪問 3.瀏覽器訪問網頁原理(理解) 所以綜合我們的第二點和第三點,我們得出一個結論,這些系 ...
  • body{ font family: SimSun,PingFang SC; } ubuntu搭建nodejs生產環境——快速部署手冊 為什麼不用CentOS而用Ubuntu作為生產環境的運行平臺?這個我也比較好奇,公司訂的只能沿用傳統,從使用成本的角度來說,此舉也是值得肯定的。 測試環境 騰訊雲 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...