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