我是這麼玩領域驅動設計的DDD

来源:https://www.cnblogs.com/cgli/archive/2023/03/23/17245492.html
-Advertisement-
Play Games

領域驅動設計(Domain Driven Design,簡稱:DDD)設計思想和方法論早在2005年時候就被提出來,但是一直沒有被重視和推薦使用,直到2015年之後微服務流行之後,再次被人重視和推薦使用。 下麵我來介紹一下DDD設計思想和方法論,同時結合我們在實際項目中應用總結和思考。 目錄 1、為 ...


領域驅動設計(Domain Driven Design,簡稱:DDD)設計思想和方法論早在2005年時候就被提出來,但是一直沒有被重視和推薦使用,直到2015年之後微服務流行之後,再次被人重視和推薦使用。

下麵我來介紹一下DDD設計思想和方法論,同時結合我們在實際項目中應用總結和思考。

目錄

1、為什麼要用DDD

2、DDD架構設計

3、領域建模方法

4、代碼實踐

5、問題總結

 

1、為什麼要用DDD


面向過程
      很多時候,我們都是操著面向對象的語言乾著面向過程的勾當。大部分的系統都是從單一業務開始的。但是隨著支持的業務越來越多,代碼裡面開始出現大量的if-else邏輯,這個時候代碼開始有壞味道,沒聞到的同學就這麼繼續往上堆,聞到的同學會重構一下,但因為系統沒有統一的可擴展架構,重構的技法也各不相同,這種代碼的不一致性也是一種理解上的複雜度。

分層不合理
      分層太多和沒有分層都會導致系統複雜度的上升。

隨心所欲
      隨心所欲是因為缺少規範和約束。

面向對象
     深入的理解面向對象設計原則、模式、方法論有很多,同時要具備非常好的業務理解力和抽象能力。
     SOLID是單一職責原則(SRP),開閉原則(OCP),里氏替換原則(LSP),介面隔離原則(ISP)和依賴倒置原則(DIP)的縮寫,原則是要比模式更基礎更重要的指導準則,深入理解面向對象設計原則極大的提升我們的面向對象設計的能力和代碼質量。

分層設計
      分層最大的好處就是分離關註點,讓每一層只解決該層關註的問題,從而將複雜的問題簡化,起到分而治之的作用。

領域建模
      領域模型可以準確地反映業務語言,使業務語義顯性化,而傳統的J2EE或Spring+Hibernate/Mybatis等事務性編程模型只關心數據,這些數據對象除了簡單setter/getter方法外,沒有任何業務方法,被稱為成貧血模式。

規範設計
        各歸其位、命名約定、通用業務狀態碼約定等。

 

DDD概念定義

領域驅動設計:一種軟體開發方法,是一種軟體核心複雜性應對之道,它可以幫助我們設計高質量的軟體模型。

DDD目的:

  1. DDD是為瞭解決複雜業務邏輯的問題
  2. DDD的核心問題不是技術問題,而是關於討論、聆聽、理解、發現業務價值的問題
  3. DDD是技術人員擁有產品思維的一個體現
  4. DDD的學習曲線很陡主要是因為它是一種方法論,每個人對它的理解存在差異

 

領域模型與事務腳本對比

 

富血模型:就是屬性和方法都封裝在Domain Object里,所有業務都直接操作Domain Object。 service層只是完成一些簡單的事務之類的,甚至可以不用service層。也就是直接從action->entity。

貧血模型:就是一個對象里只有屬性,要實現業務,要依靠service層來實現相關方法,service層的實現是面向過程的,大量傳統的分層應用action->service->dao->entity的方式就是這種貧血的模式實現。

 

舉個例子,銀行轉賬實現類

各位看官看到上面的代碼是不是有一種似曾相似的感覺?咋一看也沒有啥問題,能正常運行,能快速交付業務。如果僅是為了應付需求任務交差,當然沒有什麼啥問題了。

從設計角度來看確實存在一些問題,代碼糊在一起,沒有分層設計,偽面向對象的方法。

我們碼農總得要有自己一點的追求,為偉大代碼事業創造一點藝術貢獻!

  • 如果業務需求快速變化怎麼辦,需求越來越複雜怎麼辦?
  • 如果團隊裡面有多人協作,代碼需要經過多人反覆修改接手傳承,你敢保證後面接手的人不會罵你嗎?
  • 難道設計上有沒有可以改進的空間?

答案是肯定的!

客觀來說上面的這段代碼不算複雜,也算寫得中規中舉。下麵我來讓貼一段曾經在我們實際生產系統跑了將近一年的神代碼,你才知道什麼叫複雜和神奇!16層if..else+for迴圈!就問你怕了沒有?

》》》請點開看下麵神碼片段

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

-Advertisement-
Play Games
更多相關文章
  • 在使用阿裡雲伺服器部署完flask項目後,實際訪問網站發現網站載入速度慢 問題分析: 打開開發者工具-網路,發現echarts文件及其3D庫載入時間過長,頁面空白時間長,用戶等待時間長,如下圖 解決辦法: 1、利用CDN內容分髮網絡使用戶根據自己網路的特點更快、更穩定地訪問到節點伺服器中的資源,從而 ...
  • CSS 為實現重疊效果,將 margin-top 設為負值時,div 背景被 img 圖片遮擋 一、未實現重疊效果 <body> <img src="https://cdn.uviewui.com/uview/swiper/swiper2.png" style="width: 375px;" alt ...
  • <template> <el-button style="float: right; margin: 10px" type="primary" @click="export2">導出</el-button> <!-- 導出表格 start--> <el-table class="tableExpor ...
  • const: 這個最簡單,只需記住是聲明的常量,定義的時候必須聲明const的具體值,且之後不允許改變const的值 var和let區別 1、由於js引擎存在預解析,會把var變數名進行提升 對於var來說是這樣執行的 var m; console.log(m); m=10; let不存在變數提升, ...
  • ### canvas特性 標簽中的文本只有在瀏覽器下支持canvas標簽時才顯示 行內塊元素 高度設置在標簽屬性上 ### 填充色設置 ctx.fillStyle="#ff0000" ### 線條顏色設置 ctx.strokeStyle="ff0000" ### 線條粗細 ctx.lineWidth ...
  • 備忘錄模式(Memento Pattern):是一種行為型設計模式,在不破壞封裝性的前提下,捕獲一個對象的內部狀態,併在該對象之外保存這個狀態。在JavaScript中,可以使用閉包來實現備忘錄模式。 備忘錄模式通常用於處理用戶界面的狀態。當用戶與應用程式交互時,應用程式會根據用戶的輸入更改其狀態。 ...
  • 在基於vue-next-admin 的 Vue3+TypeScript 前端項目中,可以整合自己的 .NET 後端,前端操作一些功能的時候,為了使用方便全局掛載的對象介面,以便能夠快速處理一些特殊的操作,如消息提示、輔助函數、正則測試等等。本篇隨筆介紹在Vue3+TypeScript 前端項目中全局... ...
  • 眾所周知,網頁的暗黑模式可以減少屏幕反射和藍光輻射,減少眼睛的疲勞感,特別是在夜間使用時更為明顯。其實暗黑模式也給霓虹燈效應(Neon Effect)提供了發揮的環境。 霓虹燈效應是一種視覺效果,其特點是在深色背景上使用鮮艷的顏色來產生強烈的視覺衝擊。這種效應通常用於設計海報、廣告、標誌和網頁等。霓 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...