什麼是DDD領域驅動設計的統一語言?

banq發表於2019-05-03

統一語言也稱為無處不在的語言、通用語言、泛在語言,無處不在的語言是在有界的上下文中建模的,在其中標識表達了業務領域的術語和概念,並且不應該有歧義。
無處不在的語言是Eric Evans在“域驅動設計 - 處理軟體核心中的複雜性”中使用的術語,用於構建由團隊,開發人員,領域專家和其他參與者共享的語言。
無論您的軟體是如何設計的,都需要在分隔的上下文中反映清晰且建模的泛在語言。
要產生清晰的無所不在的語言,您必須瞭解更多業務。

無所不在的語言的特徵

  • 無處不在的語言必須在領域模型中表達。
  • 無處不在的語言統一了專案團隊的員工表達語言。
  • 無所不在的語言消除了領域專家的不準確和矛盾。
  • 無所不在的語言不是領域專家強加的業務語言。
  • 無處不在的語言不是行業中使用的語言。
  • 無處不在的語言隨著時間的推移而發展,它並不是完全在一次會議中定義的。
  • 應該拒絕不屬於泛在語言的概念。


常見問題
我想強調我們應該避免的想法:

  • 由於缺少通用語言導致“翻譯”,這對域模型不利,並導致錯誤的域模型的建立。
  • 由於缺乏共同語言,團隊成員使用不同的術語而沒有意識到。
  • 即使存在,也不使用普遍存在的語言進行通訊。
  • 由技術團隊建立用於構建域模型的抽象,域專家無法理解。
  • 技術團隊無視領域專家參與領域模型,認為對領域專家而言過於抽象。但域專家必須參與,因為誰可以驗證構建的域模型?


如何開發無所不在的語言?
你可能會問自己:但是如何開發無所不在的語言?有什麼方法?誰參與了?有什麼過程?
第一點是即使是領域專家也可能彼此不同意,只有透過公開討論,分析現有文件,詞典,標準等,我們才能提出更好的語言。

  1. 畫:在白板上表達您的業務領域,不要擔心它們是否是正式設計。
  2. 建立詞彙表:定義開發所有術語的詞彙表。
  3. 使用事件風暴:領域專家和開發人員可以使用Event Storming實現業務流程學習的快速迴圈,從而促進泛在語言的發展。
  4. 檢視並更新:準備好以敏捷方式檢視和更新​​生成的內容。

這些只是開發泛在語言的第一步。

沃恩弗農說:

程式碼是無所不在的語言的持久表達,準備放棄難以及時更新的圖紙,術語表和其他文件。

程式碼需要表達無所不在的語言
想象一下,您正在開發電子商務系統,產品所有者提出以下要求:
“系統必須允許更改客戶的電子郵件。”
簡單,不是嗎?但是你會如何在程式碼中表示這一點?
以下是一個實施示例:

public class People : Entity
{
    public string Name { get; set; }
    public string Email { get; set; }
    ...

    public void Update(string name, string email, ...)
    {
        if(!string.IsNullOrEmpty(name))
        {
            Name = name;
        }

        if(!string.IsNullOrEmpty(email))
        {
            Email = email;
        }

        ...
    }
}


你怎麼看待這段程式碼?你認為它真的反映了無所不在的語言嗎?
請記住,聚合,值物件,領域服務,儲存庫,命令,事件等需要表達泛在語言。

請參閱下面反映泛在語言的程式碼示例:

public class Client : Entity
{
    public string Name { get; private set; }
    public string Email { get; private set; }
    ...

    public void ChangeEmail(string email)
    {
        Email = email;
    }
}


 

相關文章