牛津大學“領域驅動設計”課程

banq發表於2024-03-13


領域驅動設計(“DDD”)是一種專注於系統領域而不是技術的軟體設計方法。重點是構建共享的心理模型並以儘可能簡單的方式在程式碼中表示該領域模型。資料庫儲存、框架等技術細節被認為是設計的次要方面。該模組將重點關注 DDD 和一般設計以及相關主題,例如文件和軟體架構的某些方面。本課程使用基本的函數語言程式設計概念來表達領域和設計:型別作為文件,函式(以及函式的組合)用於實現。在適當的時候也可以引入物件導向的等價物和麵向物件的設計模式。

頻率:
該課程每年舉辦一次。

課程日期:
2024 年 10 月 21 日    牛津大學電腦科學系——在系內舉行    剩餘 09 個名額。

目標
完成課程後,學員將:

  • 瞭解領域驅動設計的原理以及它與物件導向設計、資料庫驅動設計等的區別。
  • 瞭解何時以及為何使用 DDD 而不是其他方法。
  • 瞭解如何採訪領域專家以瞭解領域中的關鍵概念和活動,重點強調溝通和開發共享的心理模型。
  • 瞭解如何使用代數型別和函式記錄這些概念和活動
  • 瞭解如何使用型別來捕獲儘可能多的領域細節,以及如何“使非法狀態無法表示”並減少單元測試的需要。
  • 瞭解適用於函式和型別的組合原則,以及如何從較小的函式組合活動(建模為函式)。
  • 瞭解如何應用 DDD 方法來處理錯誤。
  • 瞭解如何將非純元素整合到設計中(I/O、資料庫等)並管理應用程式中的狀態。
  • 瞭解 DDD 方法來劃分設計(“有界上下文”)以及設計如何與軟體架構相關。

內容
瞭解域:
軟體開發過程;需求、分析、設計;溝通與反饋;用例、故事、工作流程

域建模:
代數型別和函式型別;繼承、介面;請求/響應與輸入/輸出

細化域:
使用型別來捕獲約束;可選型別和總和型別;身份、實體、價值物件;重構

建模狀態及時間:
狀態機;不變數;命令和事件;事件溯源;時間相互作用

針對錯誤進行設計:
總功能;“誠實”的函式簽名;域錯誤;建模和組合誤差生成函式;驗證

純度、I/O 和測試:
以資料庫為中心與以領域為中心的架構;有狀態與無狀態設計;確定性和單元測試;將 IO 移至邊緣;錯誤恢復、交易、補償;不可變資料、賬本

領域驅動的設計和資料庫:
持久化到資料庫或文件儲存;命令查詢分離;在資料庫中儲存狀態機;快照儲存、時態資料庫、事件源;報告

分割槽和構建域驅動設計:
有界上下文;上下文對映,“反向康威策略”;公共領域事件與內部事件;序列化域物件;部署(模組化單體、SOA/微服務、無伺服器)

總結:
審查所有技術;構建完整的應用程式,包括需求收集、設計、實現、錯誤處理和資料庫儲存

評估標準
該任務旨在按照重要性遞減的順序確定:

  • 您瞭解領域驅動設計的關鍵原則嗎?您能解釋一下 DDD 與其他軟體設計方法有何不同嗎?
  • 您是否演示過如何使用非技術領域專家和其他利益相關者可以理解的代數型別來表示領域?
  • 您是否瞭解如何避免使用原語以及如何表示簡單的約束型別、可選資料等?您能否展示如何改進設計以消除某些型別的錯誤以及防禦性程式設計的需要?
  • 您瞭解狀態管理和資料庫的 DDD 方法嗎?
  • 您瞭解如何劃分設計並圍繞此規劃架構嗎?

要求
該課程將需要基本的程式設計技能,例如使用編輯器、使用 git 等。不需要 DDD 或函數語言程式設計的先驗知識 - 所有概念將根據需要在課程中介紹。它無意於涵蓋任何深度的函數語言程式設計;它獨立於 FPR,但與之互補。

本課程使用的程式語言是 F#,因為它支援物件導向和函數語言程式設計風格。無需具備 F# 經驗。

 

相關文章