領域驅動設計(1)認識瞭解什麼是領域驅動

来源:https://www.cnblogs.com/szlblog/archive/2018/05/26/9091206.html
-Advertisement-
Play Games

領域驅動(1)認識瞭解什麼是領域驅動 廢話 領域驅動設計已經出現很早了,說實話很早以前的我很不喜歡看書、不論是pdf還是書本、買過的書籍還是有幾本的,這僅有的幾本書還是因為公司的業務或者某項技術遇到瓶頸需要自己和團隊進行突破的時候用來填充自己的大腦用的,當然這是被動的,畢竟:生下來、活下去很重要的。 ...


領域驅動(1)認識瞭解什麼是領域驅動

   廢話

 

領域驅動設計已經出現很早了,說實話很早以前的我很不喜歡看書、不論是pdf還是書本、買過的書籍還是有幾本的,這僅有的幾本書還是因為公司的業務或者某項技術遇到瓶頸需要自己和團隊進行突破的時候用來填充自己的大腦用的,當然這是被動的,畢竟:生下來、活下去很重要的。這兩年微服務的出現好像又推動了領域驅動設計的發展。

 

一、解釋什麼是領域驅動:

     其實對於IT的行業的我們理解起來很容易,很有可能在日常生活工作中我們也都有過接觸,對於領域是一個什麼樣的概念

舉例:

比如說我們要做一個有關用戶登錄的功能,使用最簡單的RBAC來進行設計但是在進行設計的時候我們首先需要明白的是用戶(甲方)有幾種級用戶的級別,每種級別處於什麼樣的角色,又有多少許可權,這個時候產品經理開始去接觸軟體使用方(方法),去瞭解他們的需求以及,期初因為產品經理不明白甲方的企業架構導致採集需求的時候工作異常難做,摩擦不斷,後來漸漸的接觸的多了,明白了甲方的企業架構,並且對甲方的一些專業的稱呼、名詞也漸漸的懂得了,在往後的溝通過程中雙方之間的摩擦也漸漸的少了起來。 在這個由壞變好的過程中,是因為產品經理漸漸的融入了甲方的領域內。

然後產品把業務拿了回來,軟體開發人員開始了設計開發工作,大多數開發人都把技術作為自己的能力,對領域並不去瞭解,導致了後來功能實現後,代碼不能很好的擴展,有一天產品經理拿了一份變更的需求回來了,為了實現新的需求,迫不得已軟體開發人員只有重新來過,導致了前面做的很多工作都是無用工,我相信這樣的場景很多的開發人員都遇到過,也埋怨過,其實開發人員也是有錯的假如我們開發人員也同樣進入了對方的領域中,在真正的實現過程中,就可能會提前發現隱藏的問題,再不濟也能寫出可擴展的設計或代碼,當真正的發生變更的時候,也不至於前面的所有的工作都成為了無用功。

其實領域驅動設計需要領域驅動專家和開發人員相互協作來完成的,在這個過程中無論是開發人員還是業務人員都積累了該領域的相關知識。

但是在開發過程中,時長會有人員流失的可能性,其實人員的流失也是相對應的領域知識的流失,有人這樣說,真正的高手寫出的代碼是可以讓菜鳥維護起來都不是很吃力的,為什麼呢,其實高手在寫代碼的時候已經傳承下了該領域的知識,等到新人來到的時候,根據代碼分析學習代碼中傳承下的領域知識,可以做到更快的瞭解業務。

代碼舉例:利用策略模式實現一個簡單的領域模型

用一個比較靠近生活的例子:一套服裝的價格在不同的地區出售不同的價格

我們把地區和服裝的價格聯繫起來

 /// <summary>
        /// 獲取衣服價格
        /// </summary>
        /// <returns></returns>
        public decimal GetClothing(string ClothingNO, string AreaNo)
        {
            ClothingModel clothingModel = new ClothingModel();
            SellAreaModel sellAreaModel = SellAreaModellist.Where(x => x.AreaNo == AreaNo).SingleOrDefault();
            if (sellAreaModel != null)
            {
                clothingModel = ClothingModellist.Where(x => x.ClothingNo == ClothingNO&& x.AreaNo==sellAreaModel.AreaNo).SingleOrDefault();
                //乘以折扣比率
                return clothingModel.ClothingPrice* clothingModel.Discount;
            }
            else
            {
                return 0.00M;
            }
        }
View Code

由於季節發生了改變,衣服的價格需要根據不同的季節進行價格上的改動,這種情況被稱為商品的季節性,這是商品銷售領域的基本常識,然而有的技術人員對這項規則並不瞭解。

需求文檔中增加了這樣一句話:衣服根據不同的季節會發生價格上下浮動的變化。春季下調10% 冬季上調10%.

 

/// <summary>
        /// 獲取衣服價格
        /// </summary>
        /// <returns></returns>
        public decimal GetClothing(string ClothingNO, string AreaNo,int SeasonMark) 
        {
            //根據季節規定價格浮動比例
            double floatNum = SeasonMark != 0 ? 0.1 : 1.1;

            ClothingModel clothingModel = new ClothingModel();
            SellAreaModel sellAreaModel = SellAreaModellist.Where(x => x.AreaNo == AreaNo).SingleOrDefault();
            if (sellAreaModel != null)
            {
                clothingModel = ClothingModellist.Where(x => x.ClothingNo == ClothingNO && x.AreaNo == sellAreaModel.AreaNo).SingleOrDefault();
                //乘以該地區的折扣比率*季節價格調動比例
                return clothingModel.ClothingPrice * clothingModel.Discount* (decimal)floatNum;
            }
            else
            {
                return 0.00M;
            }
        }
View Code

 

這樣的代碼已經變得複雜了起來,當業務規則在增加的時候代碼將變得更加的複雜,這個時候我想一個新人想要在代碼中得到業務規則也將變得困難起來。規則越複雜情況越糟糕。

現在代碼這樣改動:使用策略模式

      策略模式(Strategy)概念:策略模式一般指定義一組演算法,將每個演算法都進行封裝,可以使程式可有由一個或多個可替換的策略組合成。                  

 

 

    /// <summary>
        /// 獲取衣服價格
        /// </summary>
        /// <returns></returns>
        public decimal GetClothing(string ClothingNO, string AreaNo, int SeasonMark)
        {
            //根據季節規定價格浮動比例
            double floatNum = SeasonMark != 0 ? 0.1 : 1.1;
            SellAreaModel sellAreaModel = SellAreaModellist.Where(x => x.AreaNo == AreaNo).SingleOrDefault();
            if (sellAreaModel != null)
            {
             ClothingModel    clothingModel = ClothingModellist.Where(x => x.ClothingNo == ClothingNO && x.AreaNo == sellAreaModel.AreaNo).SingleOrDefault();
                return ComputedPrice(clothingModel, floatNum);
            }
            else
            {
                return 0.00M;
            }
        }
        /// <summary>
        /// 計算衣服的價格
        /// </summary>
        /// <param name="clothingModel">服裝信息</param>
        /// <param name="floatNum">滑動比例</param>
        /// <returns></returns>
        public decimal ComputedPrice(ClothingModel clothingModel, double floatNum)
        {
            //乘以該地區的折扣比率*季節價格調動比例
            return clothingModel.ClothingPrice * clothingModel.Discount * (decimal)floatNum;
    }
View Code

 

    /// <summary>
        /// 獲取衣服價格
        /// </summary>
        /// <returns></returns>
        public decimal GetClothing(string ClothingNO, string AreaNo, int SeasonMark)
        {
            //根據季節規定價格浮動比例
            double floatNum = SeasonMark != 0 ? 0.1 : 1.1;
            SellAreaModel sellAreaModel = SellAreaModellist.Where(x => x.AreaNo == AreaNo).SingleOrDefault();
            if (sellAreaModel != null)
            {
             ClothingModel    clothingModel = ClothingModellist.Where(x => x.ClothingNo == ClothingNO && x.AreaNo == sellAreaModel.AreaNo).SingleOrDefault();
                return ComputedPrice(clothingModel, floatNum);
            }
            else
            {
                return 0.00M;
            }
        }
        /// <summary>
        /// 計算衣服的價格
        /// </summary>
        /// <param name="clothingModel">服裝信息</param>
        /// <param name="floatNum">滑動比例</param>
        /// <returns></returns>
        public decimal ComputedPrice(ClothingModel clothingModel, double floatNum)
        {
            //乘以該地區的折扣比率*季節價格調動比例
            return clothingModel.ClothingPrice * clothingModel.Discount * (decimal)floatNum;
    }
View Code

這樣寫的好處在於,當開發設計人員看到這段代碼的時候可以明確的看到衣服不通季節有不同的價格計算策略,而不是像上面代碼一樣把一個重要的業務規則,寫成一句不引人註意的計算問題。這樣的代碼讀起來會開發人員更快的理解代碼

 

深層模型:

 

     每一個項目都會隨著對領域和需求的理解,模型也會逐漸的加深,可能項目剛開始的時候對於我們來說很重要的錶面元素,將變得不是那麼重要,也或者那些不重要的元素,隨著業務理解的深度或切換角度後變得重要起來。模型在一步步的變得龐大這也是知識消化後的產物,如果當領域專家和開發人員通過領域模型就能對業務需求有一定的認知,我想最起碼溝通的過程中目的的一致性也做到了。同樣會減少很多本不應該出現的需求變更的出現。

 

最近一兩個月將持續更新領域驅動設計。有偏差的望大家指出,相互學習。 

              有不足之處 希望大家指出相互學習,

                                   本文原創:轉載請註明出處 謝謝!

 


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

-Advertisement-
Play Games
更多相關文章
  • 一)什麼是JavaScript【以下簡稱JS】 JS是 (1)基於對象 JS本身就有一些現成的對象可供程式員使用,例如:Array,Math,String。。。 JS並不排除你可以自已按一定的規則創建對象 (2)事件驅動 JS代碼寫好後,需要外界觸發後,方可運行,例如:單擊事件,定時執行,。。。 ( ...
  • 原文鏈接地址:https://www.cnblogs.com/wangmeijian/p/4562304.html :first-child 選擇器用於選取屬於其父元素的首個子元素的指定選擇器。——w3school 嗯,乍一看好像說的不是很明白,因此這個選擇器很容易讓人誤解,通常會有兩種誤解:誤解一 ...
  • 一、盒模型 一個web頁面由許多html元素組成,而每一個html元素都可以表示為一個矩形的盒子,CSS盒模型正是描述這些矩形盒子的存在。 MDN的描述: When laying out a document, the browser's rendering engine represents ea ...
  • 網上看了許多,大多數都是nginx做成靜態項目,但是這樣局限性太多,與Web項目相比許多服務端想做的驗證都很麻煩,於是開始了艱難的探索之路,終於在不經意間試出來了,一把辛酸。。。 正常的打包就不說了。至於package.json裡面這個hompage的參數,無所謂,最後沒有用到。項目用的庫就是這些, ...
  • 深入css佈局(3) — margin問題與格式化上下文 在css知識體系中,除了css選擇器,樣式屬性等基礎知識外,css佈局相關的知識才是css比較核心和重要的點。今天我們來深入學習一下css佈局相關的知識。 css佈局篇已經講個2篇了,前面我們深入講解了 盒模型與box-sizing, 元素分 ...
  • 從input框獲取焦點到,輸入值,失去焦點這個過程所有事件,以及一些特點; 1、過程 onfocus -> 鍵盤輸入 -> onkeydown -> onkeypress -> onkeyup -> oninput -> 失去焦點 -> onchange -> onblur 如下,奉上代碼; 執行結 ...
  • 1.鏈接到某頁<input type="button" name="Submit" value="確 定" class="btn" onclick="location.href='filename.html'" />2.返回(等同後退)<input name="Submit2" type="butt ...
  • function loadIframe(url) { //獲取url鏈接 var u = window.location.href; //因為每次獲取的鏈接中都有之前的舊錨點, //所以需要把#之後的舊錨點去掉再來加新的錨點(即傳入的url參數) var end = u.indexOf("#"); ... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...