【渐进】浅尝DDD,对试卷建模
????? 領域模型是OO分析中最重要的和經典的模型。領域驅動設計(DDD)則是有效的軟件復雜性的應對之道。
??? 領域模型其實是一種語言,領域專家與分析人員、開發人員之間交流的通用語言。?一開始,分析人員與領域專家需要對這個通用語言達成一致,雙方能熟練的運用領域模型描述問題,表達、分析、處理問題。
??? 1. 領域模型不是圖,圖只是讓核心、關鍵的概念清晰的呈現出來。圖的表達能力有限,模型必須配備描述(需求采集會議中的口頭描述,或文檔中的文字描述),將圖形所代表的意義,以及圖形中沒有呈現出來的規則、斷言、細節進行補充,才能完整地表述需求。
??? 2. 領域模型的UML或者類UML圖不能太細太完整,否則過于龐大的模型會干擾人的思維,阻礙對主要部分,或者復雜邏輯的梳理。業務總是被切分成一個個片斷進行分析,在每一個片斷里,畫出幾個主要的對象和交互邏輯,細節的部分用文字記錄、描述。
??? 3. 領域模型中不應當出現設計、技術方面的術語,也不應當出現開發人員不理解的業務術語。
????? 關于領域模型表達方法(UML圖Visio圖)的選擇問題,標準的形式是使用UML,但如果領域專家或開發人員根本無法對UML圖例形成清晰的概念(將UML圖映射到領域對象、邏輯,或代碼實現),將注定DDD方式應用失敗。因為沒有掌握語言就無法使用它正確交流。第三節中強調建模人員要直接與開發過程接觸,重要的一個作用是確認開發人員對領域模型這個語言是否正確理解,確保代碼實現保持了建模者要表達的意圖。因此DDD的一個關鍵思想是建模人員自始至終維護領域模型這個語言,以及它表達的內容,向團隊的各個角色(領域專家、開發人員等)詮釋各個建模元素的含義,讓各個角色掌握這個語言,運用它來表達、實現實際需求。這是分析人員最關鍵的職責,貫穿整個過程。
????? 領域邏輯的表達不要受UML圖的約束,否則可能是問題所在,適當的描述就可以很好的解決這個問題。
????? 關于DDD和UML相關的具體介紹可參考:
??? 《UML和模式應用》(第三版)
??? 《.NET.Domain.Driven.Design.with.C.Sharp》
????? 從領域問題,場景中分析找出概念類,確定一組概念類則是OO分析的核心。以下就“試卷”這個領域來進行DDD的分析和設計嘗試。
- 場景描述
????? 試卷由多個大題組成,每個大題下有多道試題,試卷還可以有多個分卷,如分卷I,分卷II,可以統計大題下的試題信息…
- 概念類提取
????? 從上述描述提取出概念類:試卷,分卷,大題,試題。
- UML概念類表達
- 幾個設計方案
???? 方案一:按級聯關系相應設計試卷結構,形成試卷->分卷->大題->試題的結構。
???? 方案二:將試卷的分卷,大題,試題都認為是試卷分塊,試卷成為一個試卷分塊的線性列表。
???? 方案三:將試卷的分卷,大題等歸屬于結構相關信息,對試卷抽象出試題列表和試卷結構,
- 方案比較(略)
???? 方案一完全依賴場景描述設計層級結構,固化了試卷結構,方案二,三的設計思路都是將試題列表設計為線性,屏蔽業務和呈現需求的差異。
- 最終方案
???? 試卷(Paper)主要由試卷結構(PaperStruct)和試題列表(PaperQuestionList)構成,試卷結構包含試卷分塊列表,試卷分塊用于表示試卷中的大題概念。
???? 試題列表是為此場景而特化設計的集合,僅僅是對試卷分塊(PaperPart)中試題列表的邏輯映射,僅公開部分集合相關操作。
???? 試卷分塊主要包含試題索引范圍(QuestionIndexRang)和 分塊試題列表(QuestionList)的定義以及相關統計屬性。
???? 最終方案的優勢:即保證了結構和業務的剝離,又使得呈現可以以直觀的層級進行。
- UML詳細設計模型
- 基本代碼成型
???? 試卷:
?
??? 試卷分塊:分塊將維持試題索引范圍
?
??? 試卷試題列表:此設計用于映射分塊中的試題,并控制對其的調用,使得對它的相關操作能映射至實際的試題。
?
- 更多考慮
???? 對于模型的接口和屬性暴露:本文所提及的設計并非采用貧血模型,模型內部需維持主要邏輯,對于對外接口和屬性應慎重,如對于引用類型的屬性,應考慮使用者有可能并不總是按照設計者的預期來使用,因此最小化設計原則和按需暴露接口,或者返回接口而非真實引用尤為必要。
???? 領域模型并非為傳輸而設計,若希望模型同時能夠支持跨層傳輸和序列化,則需額外注意相關屬性和字段的設計和暴露。
???? DDD是從業務出發,關注業務,以業務價值為導向的設計方法,測試和業務的實現均是由它出發,以對象而不是關系數據庫作為模型基礎,而對于存儲則不是業務人員需要過多關心,通常web開發者習慣了數據驅動設計,總是希望實體和數據庫一一映射,那么您恐怕需要換個思路思考了,因而一個強有力的ORM框架支持也是DDD的執行的保證。
?
???? 篇后語:學習和實踐中,請多多指正。歡迎拍磚。
轉載于:https://www.cnblogs.com/wsky/archive/2009/10/27/1590873.html
總結
以上是生活随笔為你收集整理的【渐进】浅尝DDD,对试卷建模的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在.Net 模板页中使用CSS样式
- 下一篇: 教育部的新部长