實現DDD讀書筆記1

什麼是DDD

DDD是英文Domain-Driven Design的簡稱,在2004年由Eric Evans提出的一套軟件設計的概念和方法論。

DDD並不是關於技術的,而是關於討論、聆聽、理解、發現業務價值的,而這些都是爲了將知識集中起來。將領域專家引入到團隊是大有好處的。

  • 領域專家不見得就知道所有的業務,他們也得學習。你向領域專家提出的問題有可能暴露出他們不知道的地方。
  • 領域專家不是一個職位,他可以是精通業務的任何人。
  • 領域模型是關於某個特定業務領域的軟件模型。通常,領域模型通過對象模型來實現,這些對象同時包含了數據和行爲,並且表達了準確的業務含義。

開發過程中,最大的鴻溝之一便存在於領域專家和開發者之間,通常,領域專家將關注點放在交付業務價值上,而開發者則將注意力放在技術實現上。

影響:領域專家和開發者雖一同工作,他們之間的協作也只是表面的。過程中產生了一種映射:將業務人員所想的映射到開發者所理解的。這樣,軟件便不能完全反映出領域專家的思維模型。這種鴻溝將增加軟件的開發成本。隨着開發者轉到其他項目或離職,本應駐留在軟件中的領域知識也就丟失了。

另一個問題,發生在多個領域專家之間存在分歧的時候。因爲每個專家只熟悉某個或者某些特定領域。另外在某個領域找不到真正的專家也是可能的,此時,有人可能對領域有所瞭解,但他更像一個業務分析員。這些問題將導致相互矛盾的軟件模型。

更糟的是,軟件的技術實現可能錯誤地改變軟件的業務規則。比如:ERP軟件通常修改業務操作以滿足某個特定用戶的需求。解決方案纔是主要的投入。

DDD的作用是簡化,而不是複雜化。我們應該採用最簡單的方式對複雜領域進行建模,而不是使問題變得更加複雜。

貧血領域對象有出現的原因:它反映了一種自然的過程式的編程風格。很多開發者都是學着示例代碼做開發,通過情況下,示例代碼只是儘可能簡單的方式來展示某個特定的概念或API特性,而並不強調要遵循多好的設計原則。

如何DDD

DDD兩大支柱:

  • 通用語言。在邊界之內的每種領域術語、詞組或句子,是團隊自己創建的公用語言,團隊中同時包含領域專家和軟件開發人員。其都有確定的上下文含義,在邊界之外,這些可能表示不同的意思。 通用詞不是業務語言;不必完全採用工業標準術語;不是領域專家專用的。
  • 限界上下文(Bounded Context)。整個應用程序之內的一個概念性邊界。

掌握通用語言的方法:

  • 同時繪製物理模型圖和概念模型圖,並標以名字和行爲。雖然這些圖並不是正式的設計圖,但它們卻包含了軟件建模的某些方面。即使你的團隊在使用統一建模語言UML來完成正式建模,也不要得意忘形,因爲這樣可能反而不利於團隊的討論,最終將阻礙通用語言的產生。
  • 創建一個包含簡單定義的術語表。將你能想到的術語都羅列出來,包括好的和不好的,並註明好與不好的原因。在你給術語下定義時,你在不經意間就會創造出一些可重用的詞彙,因爲此時你使用的是領域中的通用 語言。
  • 如果你不喜歡術語表,可以採用其他類型的文檔,但是記得將那些“不正式”的模型圖也包含進去。同樣,這裏最終的目的也是發現通用語言中的術語和詞組。
  • 由於團隊中有些人工作在術語表上,還有些人工作在文檔上,此時你需要找到團隊的其他人員來檢查你的成果。分歧肯定是有的,你應該對此有所準備。
  • 這樣建立起來的模型不能直接用於指導開發,而只是建立通用語言的起步而已。此後改進之後的通用語言將反映到系統的源代碼中。通用語言會過時,只有團隊的交流和代碼才能持續到最後,也只有這兩者才能實時地反映通用語言。
  • 由於團隊交流和代碼纔是對通用語言的持續表達,你應該試着拋棄那些模型圖、術語表和文檔。這樣做的原因是,我們很難將項目文檔和軟件系統保持同步。對通用語言達成一致後,纔開始着手開發。對領域模型的修改也將導致對應用層的修改。每個應用層的方法都對應着一個單一的用例流。

對通用語言的理解:

  • 通用意思是“普遍的”,或者“到處都存在的“。通用 語言在團隊範圍內使用,並且只表達一個單一的領域模型。
  • “通用語言”並不表示全企業、全公司或者全球性的萬能領域語言。
  • 限界上下文和通用語言間存在一對一的關係。
  • 限界上下文是一個相應較小的概念,通常比我們起初的想象的要小。限界上下文剛好能夠容納下一個獨立的限界上下文中所使用的通用語言。
  • 只有當團隊工作在一個獨立的限界上下文中時,通用語言纔是”通用“的。
  • 雖然我們只工作在一個限界上下文中,但是通常我們還需要和其他限界上下文打交道,這時可以通用上下文映射圖對這些限界上下文進行集成。每個限界上下文都有自己的通用語言,而有時語言間的術語可能有重疊的地方。
  • 如果你試圖將某個通用語言運用到整個企業範圍之內,或者更大的、跨企業的範圍內,你將失敗。

通用語言((ubiquitous language)實例

個人(實體):包含並管理用戶的個人信息.包括名字和聯繫方式等。
激活租戶:通過該操作激活一個租戶,激活後再對租戶的當前狀態進行確認。
禁用租戶:通過該操作禁用一個租戶,在禁用一個租戶時,用戶可能還沒有被認證。
認證服務:協調對用戶的認證過程,首先需要保證他們所屬的租戶處於激活狀態。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章