領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)與模型驅(qū)動(dòng)開發(fā)
《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)與模型驅(qū)動(dòng)開發(fā)》由會(huì)員分享,可在線閱讀,更多相關(guān)《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)與模型驅(qū)動(dòng)開發(fā)(142頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、領(lǐng) 域 驅(qū) 動(dòng) 設(shè) 計(jì)與 模 型 驅(qū) 動(dòng) 開 發(fā) 鐘 瑋 軍2015年 3月 致 謝 : 此 培 訓(xùn) 材 料 借 鑒 了 來(lái) 自 參 考 文 獻(xiàn) 以 及 互 聯(lián) 網(wǎng) 的 大 量 資料 , 部 分 資 料 的 參 考 來(lái) 源 未 能 盡 數(shù) 列 舉 , 謹(jǐn) 在 此 對(duì) 那 些 在網(wǎng) 絡(luò) 中 無(wú) 私 分 享 自 己 知 識(shí) 的 人 表 達(dá) 我 的 衷 心 感 謝 ! 培訓(xùn)內(nèi)容領(lǐng) 域 驅(qū) 動(dòng) 設(shè) 計(jì) 簡(jiǎn) 介領(lǐng) 域 通 用 語(yǔ) 言領(lǐng) 域 驅(qū) 動(dòng) 設(shè) 計(jì) 的 構(gòu) 造 塊領(lǐng) 域 驅(qū) 動(dòng) 設(shè) 計(jì) 編 程 實(shí) 踐CQRS架 構(gòu)模 型 驅(qū) 動(dòng) 開 發(fā) 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)思想的發(fā)展 2002年Martin Fower在
2、其出版企業(yè)應(yīng)用架構(gòu)模式中,歸納總結(jié)了40多種企業(yè)應(yīng)用架構(gòu)的設(shè)計(jì)模式。其中所提到的多種設(shè)計(jì)模式和概念,如事務(wù)腳本、活動(dòng)記錄和領(lǐng)域模型等,對(duì)業(yè)界產(chǎn)生了深遠(yuǎn)的影響。 2004年著名建模專家Eric Evans發(fā)表了他最具影響力的著名書籍:Domain-Driven Design Tackling Complexity in the Heart of Software(中文譯名:領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)軟件核心復(fù)雜性應(yīng)對(duì)之道),書中提出了“領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(簡(jiǎn)稱DDD)”的概念。 2010年Greg Young在“CQRS, Task Based UIs, Event Sourcing agh! ”一文中對(duì)Betra
3、nd Meyer的CQS模式進(jìn)行改造,提出CQRS模式。 此后Jimmy Nilsson的Applying Domain-Driven Design and Patterns、Abel Avram和Floyd Marinescu合作的Domain-Driven Design Quickly、Dan Haywood的Domain-Driven Design Using Naked Objects、以及Vaughn Vernon的Implementing Domain-Driven Design等書籍的出版,豐富了領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的實(shí)踐和指導(dǎo)。 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)是什么 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)事實(shí)上針對(duì)是OOAD的一
4、個(gè)擴(kuò)展和延伸,DDD基于面向?qū)ο蠓治雠c設(shè)計(jì)技術(shù),對(duì)技術(shù)框架進(jìn)行了分層規(guī)劃,同時(shí)對(duì)每個(gè)類進(jìn)行了策略和類型的劃分。n Its a set of proven modeling techniques especially targeted to complex applications.n Its a set of principles and practices supporting the development process.n Its a set of patterns that support a clean and coherent view of the domain model.
5、n Its a set of pragmatic strategies allowing applications to scale in size and complexity maintaining their integrity. 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的特性 成 熟 、 清 晰 的 分 層 架 構(gòu) 領(lǐng) 域 對(duì) 象 與 現(xiàn) 實(shí) 世 界 的 業(yè) 務(wù) 映 射 明 確 的 職 責(zé) 劃 分分 層 架 構(gòu) 領(lǐng) 域 對(duì) 象 是 核 心 領(lǐng) 域 對(duì) 象 復(fù) 用 : 完 整 的 業(yè) 務(wù) 對(duì) 象 描 述 設(shè) 計(jì) 復(fù) 用 : 設(shè) 計(jì) 基 于 領(lǐng) 域 對(duì) 象 而 非 數(shù) 據(jù) 庫(kù)復(fù) 用 具 備 復(fù) 雜 業(yè) 務(wù) 邏 輯 的
6、 軟 件 開 發(fā) 對(duì) 設(shè) 計(jì) 和 開 發(fā) 人 員 要 求 較 高 不 適 用 普 通 CRUD的 業(yè) 務(wù) 軟 件 的 維 護(hù) 性 和 擴(kuò) 展 性 良 好 (Testable)使 用 場(chǎng) 景 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)分層規(guī)劃(一) 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)分層規(guī)劃 用 戶 界 面 /展 現(xiàn) 層 負(fù) 責(zé) 向 用 戶 展 現(xiàn) 信 息 以 及 解 釋 用 戶 命 令 。展 示 層 的 組 件 實(shí) 現(xiàn) 用 戶 與 應(yīng) 用 交 互 的 功 能 。一 般 建 議 用 MVC, MVP或 者 MVVM模 式來(lái) 分 隔 這 些 組 件 為 子 層應(yīng) 用 層 很 薄 的 一 層 , 用 來(lái) 協(xié) 調(diào) 應(yīng) 用 的 活 動(dòng) , 實(shí) 現(xiàn)協(xié) 調(diào)
7、應(yīng) 用 的 “ 通 道 ” , 例 如 事 務(wù) 、 執(zhí) 行 單位 操 作 、 調(diào) 用 應(yīng) 用 程 序 的 任 務(wù) 。 它 不 包 含業(yè) 務(wù) 邏 輯 。 它 不 保 留 業(yè) 務(wù) 對(duì) 象 的 狀 態(tài) , 但它 保 有 應(yīng) 用 任 務(wù) 的 進(jìn) 度 狀 態(tài) 。類 似 于 Faade模 式 , 調(diào) 用 領(lǐng) 域 層 和 基 礎(chǔ) 設(shè) 施 層 來(lái) 完 成 應(yīng) 用 的 用 例 。領(lǐng) 域 層 本 層 包 含 關(guān) 于 領(lǐng) 域 的 信 息 。 這 是 業(yè) 務(wù) 軟 件的 核 心 所 在 。 在 這 里 保 留 業(yè) 務(wù) 對(duì) 象 的 狀 態(tài) ,對(duì) 業(yè) 務(wù) 對(duì) 象 和 它 們 狀 態(tài) 的 持 久 化 被 委 托 給了 基 礎(chǔ)
8、 設(shè) 施 層 。基 礎(chǔ) 設(shè) 施層 本 層 作 為 其 他 層 的 支 撐 庫(kù) 存 在 。 它 提 供 了層 間 的 通 信 , 實(shí) 現(xiàn) 對(duì) 業(yè) 務(wù) 對(duì) 象 的 持 久 化 ,包 含 對(duì) 用 戶 界 面 層 的 支 撐 庫(kù) 等 作 用 。 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)分層規(guī)劃(二) 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)是對(duì)傳統(tǒng)N層架構(gòu)模式的繼承和發(fā)展 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)分層規(guī)劃(三) 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)是對(duì)傳統(tǒng)N層架構(gòu)模式的繼承和發(fā)展 Core J2EE Patterns例 : J2EE參 考 分 層 架 構(gòu) 傳 統(tǒng) J2EE或Spring+Hibernate等事 務(wù) 性 編 程 模 型 只 關(guān)心 數(shù) 據(jù) , 這 些 數(shù) 據(jù) 對(duì)象 除 了 簡(jiǎn) 單
9、sette/getter方 法 外 ,沒(méi) 有 任 何 業(yè) 務(wù) 方 法 ,被 比 喻 成 “ 失 血 模型 ” 。 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)分層規(guī)劃(四) 分布式領(lǐng)域驅(qū)動(dòng)設(shè)計(jì) 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)分層規(guī)劃(五) 分布式領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)與DotNET技術(shù)架構(gòu)體系之間的關(guān)系映射 面向?qū)ο蠓治雠c設(shè)計(jì)技術(shù) 面向過(guò)程vs.面向?qū)ο?事 務(wù) 腳 本 模 式 把 業(yè) 務(wù) 邏 輯 組 織 成 單 個(gè) 過(guò) 程 , 在 過(guò) 程 中 直 接 調(diào) 用 數(shù) 據(jù) 庫(kù) , 業(yè) 務(wù) 邏 輯 在 服 務(wù) (Service)層處 理 。 事 務(wù) 腳 本 模 式 的 特 點(diǎn) 是 簡(jiǎn) 單 容 易 理 解 , 面 向 過(guò) 程 設(shè) 計(jì) 。 對(duì) 于 少 量 邏 輯
10、 的 業(yè) 務(wù) 應(yīng) 用 來(lái) 說(shuō) , 事 務(wù) 腳 本模 式 簡(jiǎn) 單 自 然 , 性 能 良 好 , 容 易 理 解 , 而 且 一 個(gè) 事 務(wù) 的 處 理 不 會(huì) 影 響 其 他 事 務(wù) 。 不 過(guò) 缺 點(diǎn) 也 很 明 顯 , 對(duì) 于 復(fù) 雜 的 業(yè) 務(wù) 邏 輯 處 理 力 不 從 心 , 難 以 保 持 良 好 的 設(shè) 計(jì) , 事 務(wù) 之 間 的 冗 余代 碼 不 斷 增 多 , 通 過(guò) 復(fù) 制 粘 貼 方 式 進(jìn) 行 復(fù) 用 。 可 維 護(hù) 性 和 擴(kuò) 展 性 變 差 。 對(duì)類的策略和類型的劃分 對(duì) 類 進(jìn) 行 StereoType(“ 構(gòu) 造 型 ” )劃 分 的 好 處 在 于 : ( 1
11、) 指 導(dǎo) 設(shè) 計(jì) ( 2) 幫 助 命 令 對(duì) 象 ( 3) 輔 助 理 解 按照策略和類型對(duì)類進(jìn)行劃分 六邊形架構(gòu) 以領(lǐng)域模型為核心的六邊形架構(gòu) 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中的設(shè)計(jì)模式 有助于獲得柔性設(shè)計(jì)的設(shè)計(jì)模式 每 個(gè) 元 素 的 名 稱 都 提 供了 一 次 揭 示 設(shè) 計(jì) 意 圖 的機(jī) 會(huì) 。 站 在 客 戶 開 發(fā) 人員 的 角 度 上 來(lái) 思 考 它 。 人 們 為 了 使 所 有 類 和 操 作 都 具 有 相 似 的 規(guī) 模而 尋 找 一 種 一 致 的 力 度 。 粒 度 的 大 小 并 不 是唯 一 要 考 慮 的 問(wèn) 題 , 我 們 還 要 考 慮 粒 度 在 哪種 場(chǎng) 合 下 使
12、 用 。隨 著 代 碼 重 構(gòu) 不 斷 適 合 新 理 解 的 概 念 或 需 求 ,概 念 輪 廓 也 就 逐 漸 形 成 了 。 搞 內(nèi) 聚 低 耦 合 原則 既 適 用 于 代 碼 , 也 適 用 于 概 念 。 領(lǐng) 域 驅(qū) 動(dòng) 設(shè) 計(jì) 軟 件 核 心 復(fù) 雜 性 應(yīng) 對(duì) 之 道 第 10章 任 何 對(duì) 未 來(lái) 操 作 產(chǎn) 生 影 響 的 系 統(tǒng)狀 態(tài) 的 改 變 都 可 以 成 為 副 作 用 。把 命 令 和 查 詢 嚴(yán) 格 地 放 到 不 同 操作 中 ; 創(chuàng) 建 并 返 回 Value Object。允 許 我 們 安 全 地 對(duì) 多 個(gè) 操 作 進(jìn) 行組 合 。 使 用 斷 言
13、 把 副 作 用 明確 表 示 出 來(lái) , 使 它 們更 易 于 處 理 。尋 找 在 概 念 上 內(nèi) 聚 的模 型 , 更 易 推 出 預(yù) 期ASSERTION, 從 而加 快 學(xué) 習(xí) 過(guò) 程 并 避 免代 碼 矛 盾 。 盡 一 切 可 能 保 持 低 耦 合 。 把 所 有 無(wú) 關(guān) 概 念 提 取 到對(duì) 象 之 外 , 類 就 變 成 完 全 孤 立 的 了 , 使 得 我 們 可以 單 獨(dú) 地 研 究 和 理 解 它 。 每 個(gè) 孤 立 類 都 極 大 減 輕了 因 理 解 Module而 帶 來(lái) 的 負(fù) 擔(dān) 。操 作 閉 合 : 在 適 當(dāng) 的 情 況 下 , 在定 義 操 作 時(shí)
14、讓 它 的 返 回 類 型 與 其參 數(shù) 相 同 。 閉 合 操 作 提 供 了 一 個(gè)高 層 接 口 , 同 時(shí) 又 不 會(huì) 引 入 對(duì) 其他 概 念 的 任 何 依 賴 性 。 培訓(xùn)內(nèi)容領(lǐng) 域 驅(qū) 動(dòng) 設(shè) 計(jì) 簡(jiǎn) 介領(lǐng) 域 通 用 語(yǔ) 言領(lǐng) 域 驅(qū) 動(dòng) 設(shè) 計(jì) 的 構(gòu) 造 塊領(lǐng) 域 驅(qū) 動(dòng) 設(shè) 計(jì) 編 程 實(shí) 踐CQRS架 構(gòu)模 型 驅(qū) 動(dòng) 開 發(fā) 使用通用語(yǔ)言的重要性 Talking different languages makes projects fail.n Programmers speak using technical jargon (design patterns, ac
15、ronyms, geeky in-jokes)n Domain experts use terminology specific to their field of expertise n Computers speak programming languagesn 大 家 必 須 妥 協(xié) 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的關(guān)鍵點(diǎn) 關(guān)注核心領(lǐng)域(Core Domain) 領(lǐng)域?qū)<液蛙浖臉I(yè)者共同開發(fā)模型 在一個(gè)明確的限界上下文(Bounded Context)中使用領(lǐng)域通用語(yǔ)言(ubiquitous language) 通用語(yǔ)言(一) 通用語(yǔ)言(UBIQUITOUS LANGUAGE)是團(tuán)隊(duì)共享的語(yǔ)言。領(lǐng)域?qū)<液?/p>
16、開發(fā)者使用相同的通用語(yǔ)言進(jìn)行交流。事實(shí)上,團(tuán)隊(duì)中每個(gè)人都使用相同的通用語(yǔ)言。不管你在團(tuán)隊(duì)中的角色如何,只要你是團(tuán)隊(duì)的一員,你都將使用通用語(yǔ)言。n 通用語(yǔ)言是團(tuán)隊(duì)自己創(chuàng)建的公用語(yǔ)言。團(tuán)隊(duì)中同時(shí)包含領(lǐng)域?qū)<液蛙浖_發(fā)人員。n 通用語(yǔ)言更多地是關(guān)于業(yè)務(wù)本身如何思考和運(yùn)作的,領(lǐng)域?qū)<覍?duì)通用語(yǔ)言有很大影響。不同領(lǐng)域?qū)<視?huì)在概念和術(shù)語(yǔ)上產(chǎn)生分歧,甚至也會(huì)犯錯(cuò),當(dāng)領(lǐng)域?qū)<液烷_發(fā)者一起創(chuàng)建領(lǐng)域模型的時(shí)候,他們有時(shí)會(huì)達(dá)成一致,有時(shí)會(huì)做一些妥協(xié),但最終目的都是為了創(chuàng)造最適合項(xiàng)目的通用語(yǔ)言。團(tuán)隊(duì)成員們妥協(xié)的絕對(duì)不應(yīng)是通用語(yǔ) 言的質(zhì)量,而是概念、術(shù)語(yǔ)和含義。最初的一致并不表示始終一致,通用語(yǔ)言也會(huì)隨著時(shí)間推移而不斷演
17、化改變。n 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的一個(gè)核心思想就是使用基于模型的共同語(yǔ)言。因 為 模 型 是 軟 件 滿 足 領(lǐng) 域 的 共 同 點(diǎn) , 它 很 適 合作 為 這 種 通 用 語(yǔ) 言 的 構(gòu) 造 基 礎(chǔ) 。 使 用 模 型 作 為 語(yǔ) 言 的 核 心 骨 架 , 要 求 團(tuán) 隊(duì) 在 進(jìn) 行 所 有 的 交 流 都 是 使 用 一 致 的語(yǔ) 言 , 在 代 碼 中 也 是 這 樣 。 在 共 享 知 識(shí) 和 推 敲 模 型 時(shí) , 團(tuán) 隊(duì) 會(huì) 使 用 語(yǔ) 言 、 文 字 和 圖 形 。 這 兒 需 要 確 保 團(tuán) 隊(duì) 使用 的 語(yǔ) 言 在 所 有 的 交 流 形 式 中 看 上 去 都 是 一 致 的
18、, 這 種 語(yǔ) 言 被 稱 為 “ 通 用 語(yǔ) 言 ( Ubiquitous Language) ” 。n 通用語(yǔ)言的詞匯表包括類名稱和主要操作。語(yǔ) 言 中 包 含 術(shù) 語(yǔ) , 有 些 術(shù) 語(yǔ) 用 來(lái) 討 論 模 型 中 已 經(jīng) 明 確 的 規(guī) 則 , 還有 一 些 術(shù) 語(yǔ) 則 來(lái) 自 施 加 于 模 型 上 的 高 級(jí) 組 織 原 則 。 最 后 , 團(tuán) 隊(duì) 一 致 應(yīng) 用 于 領(lǐng) 域 模 型 的 模 式 名 稱 使 這 種 語(yǔ) 言 更為 豐 富 。 模 型 之 間 的 關(guān) 系 成 為 所 有 語(yǔ) 言 都 具 有 的 組 合 規(guī) 則 , 詞 和 短 語(yǔ) 的 意 義 反 映 了 模 型 的 語(yǔ)
19、 義 。 通用語(yǔ)言(二) 在應(yīng)用通用語(yǔ)言時(shí),應(yīng)注意:n 將模型作為語(yǔ)言的中心。確保團(tuán)隊(duì)在所有交流活動(dòng)和代碼中堅(jiān)持使用這種語(yǔ)言。在畫圖、寫東西特別是講話時(shí)也要使用這種語(yǔ)言。n 通過(guò)嘗試不同的表示方法(它們反映了不同模型)來(lái)消除難點(diǎn)。然后重構(gòu)代碼,并對(duì)類、方法和模塊重新命名,以便與新模型相一致。解決交談中的術(shù)語(yǔ)混淆問(wèn)題,就像我們對(duì)普通詞匯形成一個(gè)公認(rèn)的理解一樣。n 要認(rèn)識(shí)到UBIQUITOUS LANGUAGE中的更改就是對(duì)模型的更改。n 領(lǐng)域?qū)<覒?yīng)該避免使用拗口或無(wú)法表達(dá)領(lǐng)域理解的術(shù)語(yǔ)或結(jié)構(gòu),開發(fā)人員應(yīng)該密切監(jiān)視那些將會(huì)妨礙設(shè)計(jì)的有歧義和不一致的地方 有了通用語(yǔ)言,模型就不僅僅是一個(gè)設(shè)計(jì)工作了。
20、它成為開發(fā)人員和領(lǐng)域?qū)<夜餐瓿傻拿宽?xiàng)工作中的不可或缺的部分。語(yǔ)言以動(dòng)態(tài)形式傳遞知識(shí)。使用這種語(yǔ)言進(jìn)行討論能夠更清楚地表達(dá)圖和代碼背后的真實(shí)含義。 通用語(yǔ)言是那些不以代碼形式出現(xiàn)的設(shè)計(jì)方面的主要載體,這些方面包括把整個(gè)系統(tǒng)組織在一起的比例結(jié)構(gòu)、定義了不同系統(tǒng)和模型之間關(guān)系的Bounded Context,以及在模型和設(shè)計(jì)中使用的其他模式。 通用語(yǔ)言的應(yīng)用 通用語(yǔ)言貫穿于項(xiàng)目的各個(gè)環(huán)節(jié)n User Storiesn Project Meetingsn Team Emailsn Instant Messagesn Schedule Plann Software Documents 在限界上下文中,
21、保持語(yǔ)言的一致性(如口語(yǔ)、圖形(如UML圖等)、文字、代碼等)。 通用語(yǔ)言的應(yīng)用示例(一) User StoriesNOWhen User logs on with valid credentials, an empty panel is displayed.YESWhen Player logs on with valid credentials, an empty board game is displayed. (from a Tic Tac Toe Game software example) 通用語(yǔ)言的應(yīng)用示例(二) Code ExampleNO. Integer i = new I
22、nteger();. String char1 = new String();. public class GameDAO() . catch (Exception e)YES . String realMeaningOfMyString = new String();. public class ScoreDataLoader() . catch (Exception NotLoggedInException) NO. Ambiguities. Inconsistencies. Synonyms. AbbreviationsYES. Clarity. Precision. Reuse. Fu
23、ll Names package tictactoe.client.userInterface;/* Add the string O or X to a cell in the grid.*/public class ShowCellGridpublic static void displayUser (Grid grid, Cell cell) if (!Initialization.flag String mk= showString(Initialization.gameStatus .getCurrentUser().getUserString(); grid.setHTML(cel
24、l.getRowIndex(), cell.getCellIndex(), mk); Initialization.gameStatus.getStatus()cell.getRowIndex()cell .getCellIndex() = Initialization.gameStatus .getCurrentUser(); GameEnd.checkEnd(Initialization.gameStatus, cell.getRowIndex(), cell.getCellIndex(); (.) A class BEFORE and AFTER Ubiquitous Languagep
25、ackage tictactoe.client.userInterface;/* Performs a move in the game.*/public class PlayerMove /* When the player clicks in a cell, the game draws an O or a X on the * game grid depending on which players turn it is.*/public static void makeMove (GameGrid gameGrid, Cell cell) if (!GameInitialization
26、.waitingMoveFlag String marker = showPlayerIcon(GameInitialization.currentGameStatus .getCurrentPlayer().getPlayerIcon(); gameGrid.setHTML(cell.getRowIndex(), cell.getCellIndex(), marker); GameInitialization.currentGameStatus.getGameMoves()cell.getRowIndex()cell.getCellIndex() = GameInitialization.c
27、urrentGameStatus.getCurrentPlayer(); CheckWinner.checkForWinner(GameInitialization.currentGameStatus, cell.getRowIndex(), cell.getCellIndex(); (.)(Excerpted from a Tic Tac Toe Game source code) Which one would a Stakeholder better understand?Player Move Performs a move in the game. Make Move When th
28、e player clicks in a cell, the game draws an O or a X on the game grid depending on which players turn it is. Is Cell Empty The Player can select a cell only if it wasnt already selected.Show Cell Grid Add the String O or X to a cell in the grid. Display User Is Empty (Excerpted from a Tic Tac Toe G
29、ame source code) 模型的統(tǒng)一 模型的內(nèi)部一致性又叫做“統(tǒng)一”,這樣每個(gè)術(shù)語(yǔ)都不會(huì)有模棱兩可的意義,也不會(huì)有規(guī)則沖突。除非模型在邏輯上是一致的,否則它就沒(méi)有意義。 識(shí)別限界上下文中的不一致:重復(fù)的概念和假同源n 重復(fù)的概念是指兩個(gè)模型元素(以及伴隨的實(shí)現(xiàn))實(shí)際上表示同一個(gè)概念。每當(dāng)這個(gè)概念的信息發(fā)生改變時(shí),都必須要更新兩個(gè)地方。每次由于新的知識(shí)導(dǎo)致一個(gè)對(duì)象被修改時(shí),也必須重新分析和修改另一個(gè)對(duì)象。如果不進(jìn)行實(shí)際的重新分析,結(jié)果就會(huì)出現(xiàn)同一個(gè)概念的兩個(gè)版本,它們遵守不同的規(guī)則,甚至不同的數(shù)據(jù)。更重要的是,團(tuán)隊(duì)成員必須學(xué)習(xí)同一操作的兩種方法,以及保持這兩種方法同步的各種方式。 n 假
30、同源是指使用相同術(shù)語(yǔ)(或已實(shí)現(xiàn)的對(duì)象)的兩個(gè)人認(rèn)為他們是在談?wù)撏患虑?,但?shí)際上并不是這樣。但是,當(dāng)兩個(gè)定義都與同一個(gè)領(lǐng)域方面相關(guān),而只是在概念上稍有區(qū)別時(shí),這種沖突更難以發(fā)現(xiàn)。假同源會(huì)導(dǎo)致開發(fā)團(tuán)隊(duì)互相干擾對(duì)方的代碼,也可能導(dǎo)致數(shù)據(jù)庫(kù)中含有奇怪的矛盾,還會(huì)引起團(tuán)隊(duì)溝通的混淆。 注意用詞詞匯n 注意正確用詞,不要歪曲詞義n 開發(fā)人員經(jīng)常習(xí)慣于使用增/刪/改/查(CRUD)此類動(dòng)詞詞匯,也許有時(shí)候它們也確實(shí)屬于通用語(yǔ)言,但大多數(shù)情況下,它們并不能正確反映業(yè)務(wù),用詞上混淆了業(yè)務(wù)概念。 模型的分裂 在理想的世界中,我們可以有一種把整個(gè)企業(yè)領(lǐng)域包含進(jìn)來(lái)的單一模型;這個(gè)模型將是統(tǒng)一的,沒(méi)有任何相互矛盾或
31、相互重疊的術(shù)語(yǔ)定義;每個(gè)有關(guān)領(lǐng)域的邏輯聲明都將是一致的。但大型系統(tǒng)開發(fā)并不是這樣理想。 大型系統(tǒng)領(lǐng)域模型的完全統(tǒng)一是不可行的,也不是一種經(jīng)濟(jì)有效的做法。我們可以采用限界上下文(Bounded Context)定義每個(gè)模型的應(yīng)用范圍,采用上下文映射(Context Map)給出項(xiàng)目上下文以及它們之間關(guān)系的總體視圖。 n 任何一個(gè)大型項(xiàng)目都會(huì)存在多個(gè)模型。而當(dāng)基于不同模型的代碼被組合到一起后,軟件就會(huì)出現(xiàn)bug、變得不可靠和難以理解。團(tuán)隊(duì)成員之間的溝通變得混亂。人們往往弄不清楚一個(gè)模型不應(yīng)該在哪個(gè)上下文中使用。n 明確地定義模型所應(yīng)用的上下文。根據(jù)團(tuán)隊(duì)的組織、軟件系統(tǒng)的各個(gè)部分的用法以及物理表現(xiàn)(
32、代碼和數(shù)據(jù)庫(kù)模式等)來(lái)設(shè)置模型的邊界。在這些邊界中嚴(yán)格保持模型的一致性,而不要受到邊界之外問(wèn)題的干擾和混淆。在Context中,要保證模型在邏輯上統(tǒng)一,而不用考慮它是不是適用于邊界之外的情況。在其他Context中,會(huì)使用其他的模型,這些模型具有不同的術(shù)語(yǔ)、概念、規(guī)則和UBIQUITOUS LANGUAGE的技術(shù)行話。 n 定義Bounded Context:視察項(xiàng)目的現(xiàn)狀,而不是它的理想狀態(tài)。 領(lǐng)域、子域和限界上下文 核心域、支撐域和通用域 A Core Domain is a part of the business Domain that is of primary importance
33、 to the success of the organization. It is of utmost importance to the ongoing success of the business. If a domain models some aspect of the business that is essential, yet not Core, it is a Supporting Subdomain. if a domain captures nothing special to the business, yet is required for the overall
34、business solution, it is a Generic Subdomain. Focus on the core domain 戰(zhàn)術(shù)建模與戰(zhàn)略建模 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的綜合應(yīng)用 共享內(nèi)核(Shared Kernel) 當(dāng)不同團(tuán)隊(duì)開發(fā)一些緊密相關(guān)的應(yīng)用程序時(shí),如果團(tuán)隊(duì)之間不進(jìn)行協(xié)調(diào),即使短時(shí)間內(nèi)能夠取得快速進(jìn)展,他們開發(fā)出的產(chǎn)品也可能互相不適合,最后可能不得不在轉(zhuǎn)換層上花費(fèi)大量時(shí)間,而且得到的產(chǎn)品也五花八門。n 從 領(lǐng) 域 模 型 中 選 出 兩 個(gè) 團(tuán) 隊(duì) 都 同 意 共 享 的 一 個(gè) 子 集 。 當(dāng) 然 , 除 了 模 型 的 這 個(gè) 子 集 以 外 , 這 還 包 括 與該 模
35、型 部 分 相 關(guān) 的 代 碼 子 集 , 或 數(shù) 據(jù) 庫(kù) 設(shè) 計(jì) 的 子 集 。 這 部 分 明 確 共 享 的 內(nèi) 容 具 有 特 殊 的 狀 態(tài) , 而 且一 個(gè) 團(tuán) 隊(duì) 在 沒(méi) 與 另 一 個(gè) 團(tuán) 隊(duì) 商 量 的 情 況 下 不 應(yīng) 擅 自 更 改 它 。 n 功 能 系 統(tǒng) 要 經(jīng) 常 進(jìn) 行 集 成 , 但 集 成 的 頻 率 應(yīng) 該 比 團(tuán) 隊(duì) 中 Continuous Integration的 頻 率 低 一 些 。 在 進(jìn) 行這 些 集 成 的 時(shí) 候 , 兩 個(gè) 團(tuán) 隊(duì) 都 要 運(yùn) 行 測(cè) 試 。n Shared Kernel通 常 是 Core Domain, 或 是 一
36、 組 Generic Subdomain( 通 用 子 領(lǐng) 域 ) , 也 可 能 二 者 兼 有 。 企業(yè)架構(gòu)方法與領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)3. 架 構(gòu) 內(nèi) 容 框 架 4. 企 業(yè) 連 續(xù) 系 列1. 架 構(gòu) 開 發(fā)方 法2. 架 構(gòu) 開 發(fā) 指 引 和 技 術(shù) 5. 參 考 模 型6. 架 構(gòu) 能 力 框 架 兩者都強(qiáng)調(diào)Business和IT的高度統(tǒng)一,很多企業(yè)架構(gòu)方法對(duì)于領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)“戰(zhàn)略設(shè)計(jì)”的具體實(shí)施辦法具有詳實(shí)的指導(dǎo)意義。如TOGAF V9構(gòu)件: eTOM業(yè)務(wù)建模Level 0 ProcessesLevel 1 Processes Level 2 Processes業(yè) 務(wù) 流 程 解 耦 /
37、分 解 eTOM業(yè)務(wù)建模BSS業(yè) 務(wù) 流 程 框 架 領(lǐng) 域 解 決 特 定 問(wèn) 題 eTOM信息數(shù)據(jù)模型eTOM 0級(jí)視圖 SID 1級(jí)視圖ABE:Aggregate Business Entity,ABE是 SID中一組定義良好的實(shí)體,具有高內(nèi)聚、低耦合的特征。 共 享 內(nèi) 核 eTOM信息數(shù)據(jù)模型 參考讀物 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)軟件核心復(fù)雜性應(yīng)對(duì)之道及實(shí)現(xiàn)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中的相關(guān)章節(jié) 軟件方法-業(yè)務(wù)建模和需求第三章“業(yè)務(wù)建?!敝械南嚓P(guān)內(nèi)容 參考模型范例:n TMForum的 eTOM模 型 : http:/ 培訓(xùn)內(nèi)容領(lǐng) 域 驅(qū) 動(dòng) 設(shè) 計(jì) 簡(jiǎn) 介領(lǐng) 域 通 用 語(yǔ) 言領(lǐng) 域 驅(qū) 動(dòng) 設(shè) 計(jì) 的 構(gòu)
38、造 塊領(lǐng) 域 驅(qū) 動(dòng) 設(shè) 計(jì) 編 程 實(shí) 踐CQRS架 構(gòu)模 型 驅(qū) 動(dòng) 開 發(fā) 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的構(gòu)造塊 Entity(實(shí)體) 實(shí)體是一個(gè)具有唯一身份標(biāo)識(shí)的對(duì)象,并且可以在相當(dāng)長(zhǎng)的一段時(shí)間內(nèi)持續(xù)地變化。我們可以對(duì)實(shí)體做多次修改,故一個(gè)實(shí)體對(duì)象可能和它先前的對(duì)象大不相同,但是由于它們擁有相同的身份標(biāo)識(shí)(identity),它們依然是同一個(gè)實(shí)體。 我們通過(guò)標(biāo)識(shí)對(duì)對(duì)象進(jìn)行區(qū)分,而不是屬性,此時(shí)我們應(yīng)該將標(biāo)識(shí)作為主要的模型定義。同時(shí)我們需要保持簡(jiǎn)單的類定義,并且關(guān)注對(duì)象在其生命周期中的連續(xù)性和唯一標(biāo)識(shí)性。 隨著對(duì)象的改變,我們可能會(huì)跟蹤這樣的改變,比如什么時(shí)候發(fā)生了改變,發(fā)生了什么改變,是誰(shuí)做出的改變等
39、。我們應(yīng)該慎重對(duì)待在對(duì)象整個(gè)生命周期中所發(fā)生的合法改變。 唯一的身份標(biāo)識(shí)和可變性(mutability)特征將實(shí)體對(duì)象和值對(duì)象(Value Objects)區(qū)分開來(lái)。 n 很 多 時(shí) 候 , 一 個(gè) 領(lǐng) 域 概 念 應(yīng) 該 建 模 成 值 對(duì) 象 , 而 不 是 實(shí) 體 對(duì) 象 。n 實(shí) 體 和 值 對(duì) 象 是 領(lǐng) 域 模 型 概 念 , 而 不 是 數(shù) 據(jù) 存 儲(chǔ) 模 型 概 念 。 Value Objects(值對(duì)象) 值對(duì)象的特征n 它 度 量 或 者 描 述 了 領(lǐng) 域 中 的 一 件 東 西 。n 它 可 以 作 為 不 變 量 。n 它 將 不 同 的 相 關(guān) 的 屬 性 組 合
40、成 一 個(gè) 概 念 整 體 n 當(dāng) 度 量 和 描 述 改 變 時(shí) , 可 以 用 另 一 個(gè) 值 對(duì) 象 予 以 替 換n 它 可 以 和 其 他 值 對(duì) 象 進(jìn) 行 相 等 性 比 較n 它 不 會(huì) 對(duì) 協(xié) 作 對(duì) 象 造 成 副 作 用 。 當(dāng)我們只關(guān)心一個(gè)模型元素的屬性時(shí),應(yīng)把它歸類為值對(duì)象。我們應(yīng)該使這個(gè)模型元素能夠表示出其屬性的意義,并為它提供相關(guān)功能。值對(duì)象應(yīng)該是不可變的。不要為它分配任何標(biāo)識(shí),而且不要把它設(shè)計(jì)成Entity那么復(fù)雜。 應(yīng)該盡量使用值對(duì)象來(lái)建模而不是實(shí)體對(duì)象,即便一個(gè)領(lǐng)域概念必須建模成實(shí)體,在設(shè)計(jì)時(shí)也應(yīng)該更偏向于將其作為值對(duì)象容器,而不是子實(shí)體容器。 實(shí)體對(duì)象與值
41、對(duì)象是領(lǐng)域概念,而不是數(shù)據(jù)存儲(chǔ)模型概念n 值 對(duì) 象 可 以 與 其 所 在 的 實(shí) 體 對(duì) 象 保 存 在 同 一 張 表 中 , 值 對(duì) 象 的 每 一 個(gè) 屬 性 保 存 為 一 列 ; 值 對(duì) 象 也 可 以 獨(dú) 立 于 其 所 在 的 實(shí) 體 對(duì) 象 保 存 在 另 一 張表 中 , 值 對(duì) 象 獲 得 委 派 主 鍵 , 該 主 鍵 對(duì) 客 戶 端 是 不 可 見 的 。 Entity和Value Object示例 Aggregates(聚合) 在具有復(fù)雜關(guān)聯(lián)的模型中,要想保證對(duì)象更改的一致性是很困難的。不僅互不關(guān)聯(lián)的對(duì)象需要遵守一些固定規(guī)則,而且緊密關(guān)聯(lián)的各組對(duì)象也要遵守一些固定
42、規(guī)則。然而,過(guò)于謹(jǐn)慎的鎖定機(jī)制又會(huì)導(dǎo)致多個(gè)用戶之間毫無(wú)意義地互相關(guān)繞,從而使系統(tǒng)不可用。在任何具有持久化數(shù)據(jù)存儲(chǔ)的系統(tǒng)中,對(duì)數(shù)據(jù)進(jìn)行修改的事務(wù)必須要有一個(gè)范圍,而且要有一種保持?jǐn)?shù)據(jù)一致性的方式。 聚合(Aggregate)是一組相關(guān)對(duì)象的集合,我們把它作為數(shù)據(jù)修改的單元。每個(gè)聚合都有一個(gè)根和一個(gè)邊界,邊界定義了聚合的內(nèi)部都有什么,根則是聚合中所包含的一個(gè)特定實(shí)體。在聚合中,根是唯一允許外部對(duì)象保持對(duì)它的引用的元素,而邊界內(nèi)部的對(duì)象之間則可以互相引用。除根以外的其他Entity都有本地表示,但這些標(biāo)識(shí)只有在聚合內(nèi)部才需要加以區(qū)別,因?yàn)橥獠繉?duì)象除了根Entity之外看不到其他對(duì)象。 聚合行為視為是
43、一個(gè)整體,在每個(gè)事務(wù)完成時(shí),必須要滿足聚合內(nèi)所應(yīng)用的固定規(guī)則的要求,即保證數(shù)據(jù)變化的一致性。根實(shí)體最終檢查固定規(guī)則;刪除操作必須一次刪除聚合邊界之內(nèi)的所有對(duì)象;當(dāng)提交對(duì)聚合邊界內(nèi)部的任何對(duì)象的修改時(shí),整個(gè)聚合中的所有固定規(guī)則都必須被滿足。 原則:在一致性邊界之內(nèi)建模真正的不變條件;設(shè)計(jì)小聚合;通過(guò)唯一標(biāo)識(shí)引用其他聚合;在邊界之外使用最終一致性 盡量將根實(shí)體所包含的其他聚合建模成值對(duì)象,而不是實(shí)體。 Aggregates(聚合)示例 Domain Event(領(lǐng)域事件) Domain Event(領(lǐng)域事件)n 有 時(shí) 候 應(yīng) 用 需 要 記 錄 跟 蹤 事 情 的 發(fā) 生n 領(lǐng) 域 事 件 經(jīng)
44、常 被 建 模 為 Value Object, 但 這 些 Value Object并 不 能 被 共 享 , 因 為領(lǐng) 域 事 件 本 身 是 “ 唯 一 ” 的 。n 一 個(gè) 領(lǐng) 域 事 件 是 指 一 個(gè) 在 領(lǐng) 域 中 “ 有 意 義 ” 的 事 件 Hintsn UML四 色 原 型 中 有 一 個(gè) 相 近 概 念 , 稱 為 時(shí) 刻 -時(shí) 段 原 型 (Moment-interval), 即 表示 事 物 在 某 個(gè) 時(shí) 刻 或 某 一 段 時(shí) 間 內(nèi) 發(fā) 生 。 參考:四色原型 四色原型是誕生于90年代,現(xiàn)在被廣泛使用的一種系統(tǒng)分析方法,如Borland的Together架構(gòu)師版
45、,準(zhǔn)確地說(shuō),是由Peter Coad 和 Mark Mayfield首先提出,然后由David North拓展。 Repositories(資源庫(kù)/倉(cāng)儲(chǔ)) 客戶需要以一種符合實(shí)際的方式來(lái)獲取對(duì)以存在的領(lǐng)域?qū)ο蟮囊?。為每種需要全局訪問(wèn)的對(duì)象類型創(chuàng)建一個(gè)對(duì)象,這個(gè)對(duì)象就相當(dāng)于該類型的所有對(duì)象在內(nèi)存中的一個(gè)集合的“替身”。通過(guò)一個(gè)眾所周知的接口來(lái)提供訪問(wèn)。提供添加和刪除對(duì)象的方法,用這些方法來(lái)封裝在數(shù)據(jù)存儲(chǔ)中實(shí)際插入或刪除數(shù)據(jù)的操作。提供根據(jù)具體標(biāo)準(zhǔn)來(lái)挑選對(duì)象的方法,并返回屬性值滿足查詢標(biāo)準(zhǔn)的對(duì)象或?qū)ο蠹希ㄋ祷氐膶?duì)象是完全實(shí)例化的),從而將實(shí)際的存儲(chǔ)和查詢技術(shù)封裝起來(lái)。只為那些確實(shí)需要直接訪問(wèn)
46、的聚合提供Repository。讓客戶始終聚焦于模型,而將所有對(duì)象的存儲(chǔ)和訪問(wèn)操作交給Repository來(lái)完成。 Repository的接口應(yīng)當(dāng)采用領(lǐng)域通用語(yǔ)言。作為客戶端,不應(yīng)當(dāng)知道數(shù)據(jù)庫(kù)實(shí)現(xiàn)的細(xì)節(jié)。 Repository和DAO的作用類似,二者的主要區(qū)別:n DAO是 比 Repository更 低 的 一 層 , 包 含 了 如 何 從 數(shù) 據(jù) 庫(kù) 中 提 取 數(shù) 據(jù) 的 代 碼 。n Repository以 “ 領(lǐng) 域 ” 為 中 心 , 所 描 述 的 是 “ 領(lǐng) 域 語(yǔ) 言 ” 。 Repository把 ORM框 架 與 領(lǐng) 域 模 型隔 離 , 對(duì) 外 隱 藏 封 裝 了 數(shù)
47、 據(jù) 訪 問(wèn) 機(jī) 制 。 Repositories(資源庫(kù)/倉(cāng)儲(chǔ))示例public interface AccountRepository Account findAccount(String accountId); void addAccount(Account account);public class HibernateAccountRepository implements AccountRepository private HibernateTemplate hibernateTemplate; public HibernateAccountRepository(HibernateT
48、emplate template) hibernateTemplate = template; public void addAccount(Account account) hibernateTemplate.save(account); public Account findAccount(final String accountId) return (Account) DataAccessUtils.uniqueResult(hibernateTemplate. findByNamedQueryAndNamedParam( “Account.findAccountByAccountId”
49、, “accountId”, accountId); Services(領(lǐng)域服務(wù)) 當(dāng)領(lǐng)域中的某個(gè)操作過(guò)程或轉(zhuǎn)換過(guò)程不是實(shí)體或值對(duì)象的職責(zé)時(shí),我們便應(yīng)該將該操作放在一個(gè)單獨(dú)的接口中,即領(lǐng)域服務(wù)。如果勉強(qiáng)地把這些重要的領(lǐng)域功能歸為Entity或ValueObject的職責(zé),那么不是歪曲了基于模型的對(duì)象的定義,就是人為地增加了一些無(wú)意義的對(duì)象。應(yīng)確保領(lǐng)域服務(wù)和通用語(yǔ)言是一致的,并且保證它是無(wú)狀態(tài)的。 正確區(qū)分領(lǐng)域服務(wù)(Domain Service)和應(yīng)用服務(wù)(Application Service):n 我 們 不 應(yīng) 把 業(yè) 務(wù) 邏 輯 置 于 應(yīng) 用 服 務(wù) , 但 我 們 會(huì) 把 業(yè) 務(wù) 邏
50、 輯 置 于 領(lǐng) 域 服 務(wù) 中 。 (應(yīng) 用 )服 務(wù) 要 做“ 薄 ” 。 n 領(lǐng) 域 服 務(wù) 職 責(zé) : 跨 聚 合 實(shí) 例 業(yè) 務(wù) 邏 輯 ; 沒(méi) 辦 法 合 理 放 到 實(shí) 體 中 的 其 它 業(yè) 務(wù) 邏 輯 。n 應(yīng) 用 服 務(wù) 職 責(zé) : 跨 限 界 上 下 文 的 業(yè) 務(wù) 邏 輯 ; DTO轉(zhuǎn) 換 ; 事 務(wù) AOP、 權(quán) 限 AOP、 日 志 AOP、 異常 AOP; 外 部 系 統(tǒng) 訪 問(wèn) ( 郵 件 、 消 息 隊(duì) 列 ) 。n 領(lǐng) 域 服 務(wù) 設(shè) 計(jì) 原 則 : 用 來(lái) 組 織 業(yè) 務(wù) 邏 輯 , 面 向 業(yè) 務(wù) 邏 輯 ; 細(xì) 粒 度 ; 內(nèi) 部 視 圖 看 系 統(tǒng)
51、; 一 個(gè) 請(qǐng)求 對(duì) 應(yīng) 多 個(gè) 服 務(wù) 的 多 個(gè) 方 法 ; 服 務(wù) 之 間 會(huì) 存 在 依 賴 ;n 應(yīng) 用 服 務(wù) 設(shè) 計(jì) 原 則 : 用 來(lái) 封 裝 業(yè) 務(wù) 邏 輯 ; 面 向 用 例 ; 粗 粒 度 ; 外 部 視 圖 看 系 統(tǒng) ; 一 個(gè) 請(qǐng) 求 對(duì)應(yīng) 一 個(gè) 方 法 ; 服 務(wù) 之 間 互 不 依 賴 。n 應(yīng) 用 服 務(wù) 和 領(lǐng) 域 服 務(wù) 區(qū) 分 非 常 敏 感 , 有 時(shí) 候 需 要 在 快 速 性 /方 便 性 上 做 折 衷 。 Services(領(lǐng)域服務(wù))示例public interface MoneyTransferService BankingTransact
52、ion transfer(String fromAccountId, String toAccountId, double amount);public class MoneyTransferServiceImpl implements MoneyTransferService private final AccountRepository accountRepository; private final BankingTransactionRepository bankingTransactionRepository; public MoneyTransferServiceImpl(Acco
53、untRepository accountRepository, BankingTransactionRepository bankingTransactionRepository) BankingTransaction transfer(String fromAccountId, String toAccountId, double amount) 應(yīng)用服務(wù)、領(lǐng)域服務(wù)和基礎(chǔ)設(shè)施服務(wù) Factories(工廠) 當(dāng)創(chuàng)建一個(gè)對(duì)象或創(chuàng)建整個(gè)聚合時(shí),如果創(chuàng)建工作很復(fù)雜,或者暴露了過(guò)多的內(nèi)部結(jié)構(gòu),則可以使用Factory進(jìn)行封裝。應(yīng)該將創(chuàng)建復(fù)雜對(duì)象的實(shí)例和聚合的職責(zé)轉(zhuǎn)移到一個(gè)單獨(dú)的對(duì)象,這個(gè)對(duì)象本身在
54、領(lǐng)域模型中可能沒(méi)有職責(zé),但它仍是領(lǐng)域設(shè)計(jì)的一部分。 不同類型的工廠模式:n 工 廠 類n 工 廠 方 法 Modules(模塊) Module為人們提供了兩種觀察模型的方式,一是可以在Module中查看細(xì)節(jié),而不會(huì)被整個(gè)模型淹沒(méi),二是觀察Module之間的關(guān)系,而不考慮其內(nèi)部細(xì)節(jié)。 模塊之間應(yīng)該是低耦合的,而在模塊內(nèi)部則是高內(nèi)聚的。模塊并不僅僅是代碼的劃分,而且也是概念的劃分。一個(gè)人一次考慮的事情是有限的(因此才有低耦合);不連貫的思想和“一鍋粥”似的思想同樣難于理解(因此才有高內(nèi)聚)。 選擇能夠描述系統(tǒng)的Module,并使之包含一個(gè)內(nèi)聚的概念集合。這通常會(huì)實(shí)現(xiàn)Module之間的低耦合,但如果
55、效果不理想,則應(yīng)尋找一種更改模型的方式來(lái)消除概念之間的耦合,或者找到一個(gè)可作為Module基礎(chǔ)的概念,基于這個(gè)概念組織的模型可以以一種有意義的方式將元素集中到一起。找到一種低耦合的概念組織方式,從而可以相互獨(dú)立地理解和分析這些概 念。對(duì)模型進(jìn)行精化,直到可以根據(jù)高層領(lǐng)域概念對(duì)模型進(jìn)行劃分,同時(shí)相應(yīng)的代碼也不會(huì)產(chǎn)生耦合。 Module的名稱應(yīng)該是領(lǐng)域通用語(yǔ)言中的術(shù)語(yǔ)。模塊及其名稱應(yīng)反映出領(lǐng)域的深層知識(shí)。 培訓(xùn)內(nèi)容領(lǐng) 域 驅(qū) 動(dòng) 設(shè) 計(jì) 簡(jiǎn) 介領(lǐng) 域 通 用 語(yǔ) 言領(lǐng) 域 驅(qū) 動(dòng) 設(shè) 計(jì) 的 構(gòu) 造 塊領(lǐng) 域 驅(qū) 動(dòng) 設(shè) 計(jì) 編 程 實(shí) 踐CQRS架 構(gòu)模 型 驅(qū) 動(dòng) 開 發(fā) 概念辨析-VO/DT
56、O/DO/PO(一) View Object(視圖對(duì)象):視圖對(duì)象,用于展示層,其作用是把某個(gè)指定頁(yè)面(或組件)的所有數(shù)據(jù)封裝起來(lái)。 Data Transfer Object(數(shù)據(jù)傳輸對(duì)象):這個(gè)概念來(lái)源于J2EE的設(shè)計(jì)模式,原來(lái)的目的是為了EJB的分布式應(yīng)用提供粗粒度的數(shù)據(jù)實(shí)體,以減少分布式調(diào)用的次數(shù),從而提高分布式調(diào)用的性能和降低網(wǎng)絡(luò)負(fù)載,但在這里,我泛指用于展示層與服務(wù)層之間的數(shù)據(jù)傳輸對(duì)象。 Domain Object(領(lǐng)域?qū)ο螅簭默F(xiàn)實(shí)世界中抽象出來(lái)的有形或無(wú)形的業(yè)務(wù)實(shí)體、值對(duì)象或領(lǐng)域服務(wù)。 Persistent Object(持久化對(duì)象):跟持久層(通常是關(guān)系型數(shù)據(jù)庫(kù))的數(shù)據(jù)結(jié)構(gòu)形成
57、一一對(duì)應(yīng)的映射關(guān)系,如果持久層是關(guān)系型數(shù)據(jù)庫(kù),那么,數(shù)據(jù)表中的每個(gè)字段(或若干個(gè))就對(duì)應(yīng)PO的一個(gè)(或若干個(gè))屬性。 Ref: http:/ 概念辨析-VO/DTO/DO/PO(二) VO與DTO:絕大多數(shù)應(yīng)用場(chǎng)景下,VO與DTO的屬性值基本一致,但對(duì)于設(shè)計(jì)層面來(lái)說(shuō),概念上還是存在VO和DTO的區(qū)別,DTO代表服務(wù)層需要接收的數(shù)據(jù)和返回的數(shù)據(jù),而VO代表展示層需要顯示的數(shù)據(jù)。n 示 例 : 服 務(wù) 層 有 一 個(gè) getUser的 方 法 返 回 一 個(gè) 系 統(tǒng) 用 戶 , 其 中 有 一 個(gè) 屬 性 是gender(性 別 ), 對(duì) 于 服 務(wù) 層 來(lái) 說(shuō) , 它 只 從 語(yǔ) 義 上 定 義
58、 : 1-男 性 , 2-女 性 , 0-未 指定 , 而 對(duì) 于 展 示 層 來(lái) 說(shuō) , 它 可 能 需 要 用 “ 帥 哥 ” 代 表 男 性 , 用 “ 美 女 ” 代 表 女性 , 用 “ 秘 密 ” 代 表 未 指 定 。 說(shuō) 到 這 里 , 可 能 你 還 會(huì) 反 駁 , 在 服 務(wù) 層 直 接 就 返回 “ 帥 哥 美 女 ” 不 就 行 了 嗎 ? 對(duì) 于 大 部 分 應(yīng) 用 來(lái) 說(shuō) , 這 不 是 問(wèn) 題 , 但 設(shè) 想 一 下 ,如 果 需 求 允 許 客 戶 可 以 定 制 風(fēng) 格 , 而 不 同 風(fēng) 格 對(duì) 于 “ 性 別 ” 的 表 現(xiàn) 方 式 不 一 樣 ,又 或
59、者 這 個(gè) 服 務(wù) 同 時(shí) 供 多 個(gè) 客 戶 端 使 用 ( 不 同 門 戶 ) , 而 不 同 的 客 戶 端 對(duì) 于 表現(xiàn) 層 的 要 求 有 所 不 同 , 那 么 , 問(wèn) 題 就 來(lái) 了 。 再 者 , 回 到 設(shè) 計(jì) 層 面 上 分 析 , 從 職 責(zé) 單 一 原 則 來(lái) 看 , 服 務(wù) 層 只 負(fù) 責(zé) 業(yè) 務(wù) , 與 具 體 的 表 現(xiàn) 形 式 無(wú) 關(guān) , 因 此 , 它 返 回的 DTO, 不 應(yīng) 該 出 現(xiàn) 與 表 現(xiàn) 形 式 的 耦 合 。n 實(shí) 現(xiàn) 層 面 是 否 需 要 區(qū) 分 二 者 概 念 ? 具 體 問(wèn) 題 具 體 分 析 概念辨析-VO/DTO/DO/PO(三)
60、 DTO與DO:DTO是展示層和服務(wù)層之間的數(shù)據(jù)傳輸對(duì)象(可以認(rèn)為是兩者之間的協(xié)議),而DO是對(duì)現(xiàn)實(shí)世界各種業(yè)務(wù)角色的抽象,這就引出了兩者在數(shù)據(jù)上的區(qū)別,例如UserInfo和User,對(duì)于一個(gè)getUser方法來(lái)說(shuō),本質(zhì)上它永遠(yuǎn)不應(yīng)該返回用戶的密碼,因此UserInfo至少比User少一個(gè)password的數(shù)據(jù)。而在領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中,DO不是簡(jiǎn)單的POJO,它具有領(lǐng)域業(yè)務(wù)邏輯。 n 在 設(shè) 計(jì) 層 面 , 展 示 層 向 服 務(wù) 層 傳 遞 的 DTO與 服 務(wù) 層 返 回 給 展 示 層 的 DTO在 概 念 上 是 不 同 的 (如 返 回 UserInfo應(yīng) 該 不 包 含 passwo
61、rd, 但 創(chuàng) 建 User傳 入 的 參 數(shù) 需 要 包 含 password), 但 在 實(shí) 現(xiàn) 層 面 , 我 們 通 常 很 少 會(huì) 這 樣 做 ( 定 義 兩 個(gè) UserInfo, 甚 至 更 多 ) , 因 為 這 樣 做 并 不 見 得 很 明 智 , 我們 完 全 可 以 設(shè) 計(jì) 一 個(gè) 完 全 兼 容 的 DTO, 在 服 務(wù) 層 接 收 數(shù) 據(jù) 的 時(shí) 候 , 不 該 由 展 示 層 設(shè) 置 的 屬 性 ( 如 訂 單 的 總 價(jià) 應(yīng) 該 由 其 單 價(jià) 、 數(shù) 量 、 折 扣 等 決定 ) , 無(wú) 論 展 示 層 是 否 設(shè) 置 , 服 務(wù) 層 都 一 概 忽 略 ,
62、而 在 服 務(wù) 層 返 回 數(shù) 據(jù) 時(shí) , 不 該 返 回 的 數(shù) 據(jù) ( 如 用 戶 密 碼 ) , 就 不 設(shè) 置 對(duì) 應(yīng) 的 屬 性 。n 為 什 么 不 在 服 務(wù) 層 中 直 接 返 回 DO: DO具 有 一 些 不 應(yīng) 該 讓 展 示 層 知 道 的 數(shù) 據(jù) ; DO具 有 業(yè) 務(wù) 方 法 , 如 果 直 接 把 DO傳 遞 給 展 示 層 , 展 示 層 的 代碼 就 可 以 繞 過(guò) 服 務(wù) 層 直 接 調(diào) 用 它 不 應(yīng) 該 訪 問(wèn) 的 操 作 , 對(duì) 于 基 于 AOP攔 截 服 務(wù) 層 來(lái) 進(jìn) 行 訪 問(wèn) 控 制 的 機(jī) 制 來(lái) 說(shuō) , 這 問(wèn) 題 尤 為 突 出 , 而
63、 在 展 示 層 調(diào)用 DO的 業(yè) 務(wù) 方 法 也 會(huì) 因 為 事 務(wù) 的 問(wèn) 題 , 讓 事 務(wù) 難 以 控 制 ; ORM框 架 ( 如 Hibernate) “ 延 遲 加 載 ” 技 術(shù) , 如 果 直 接 把 DO暴 露 給 展 示 層 , 對(duì) 于 大 部 分 情 況 , 展 示 層 不 在 事 務(wù) 范 圍 之 內(nèi) , 如 果 其 嘗 試 在 Session關(guān) 閉 的 情 況 下 獲 取 一 個(gè) 未 加 載 的 關(guān) 聯(lián) 對(duì) 象 , 會(huì) 出 現(xiàn) 運(yùn) 行 時(shí) 異 常 ( 對(duì) 于 Hibernate來(lái) 說(shuō) , 就 是 LazyInitiliaztionException) ; 從 設(shè) 計(jì)
64、層 面 來(lái) 說(shuō) , 展 示 層 依 賴 于 服 務(wù) 層 , 服 務(wù) 層 依 賴 于 領(lǐng) 域 層 , 如 果 把 DO暴 露 出 去 , 就 會(huì) 導(dǎo) 致 展 示層 直 接 依 賴 于 領(lǐng) 域 層 , 這 雖 然 依 然 是 單 向 依 賴 , 但 這 種 跨 層 依 賴 會(huì) 導(dǎo) 致 不 必 要 的 耦 合 。n DTO應(yīng) 該 是 一 個(gè) “ 扁 平 的 二 維 對(duì) 象 ” 概念辨析-VO/DTO/DO/PO(四) DO與PO:DO和PO在絕大部分情況下是一一對(duì)應(yīng)的,PO是只含有g(shù)et/set方法的POJO,但某些場(chǎng)景還是能反映出兩者在概念上存在本質(zhì)的區(qū)別。n DO在 某 些 場(chǎng) 景 下 不 需
65、要 進(jìn) 行 顯 式 的 持 久 化 , 例 如 利 用 策 略 模 式 設(shè) 計(jì) 的 商 品 折 扣 策 略 , 會(huì) 衍 生 出 折 扣 策 略 的 接 口 和 不 同 折 扣 策 略 實(shí) 現(xiàn) 類 , 這些 折 扣 策 略 實(shí) 現(xiàn) 類 可 以 算 是 DO, 但 它 們 只 駐 留 在 靜 態(tài) 內(nèi) 存 , 不 需 要 持 久 化 到 持 久 層 , 因 此 , 這 類 DO是 不 存 在 對(duì) 應(yīng) 的 PO的 。 同 樣 的 道 理 , 某些 場(chǎng) 景 下 , PO也 沒(méi) 有 對(duì) 應(yīng) 的 DO, 例 如 老 師 Teacher和 學(xué) 生 Student存 在 多 對(duì) 多 的 關(guān) 系 , 在 關(guān) 系
66、數(shù) 據(jù) 庫(kù) 中 , 這 種 關(guān) 系 需 要 表 現(xiàn) 為 一 個(gè) 中 間 表 , 也 就 對(duì) 應(yīng) 有 一 個(gè) TeacherAndStudentPO的 PO, 但 這 個(gè) PO在 業(yè) 務(wù) 領(lǐng) 域 沒(méi) 有 任 何 現(xiàn) 實(shí) 的 意 義 , 它 完 全 不 能 與 任 何 DO對(duì) 應(yīng) 上 。 這 里 要 特 別 聲 明 , 并 不是 所 有 多 對(duì) 多 關(guān) 系 都 沒(méi) 有 業(yè) 務(wù) 含 義 , 這 跟 具 體 業(yè) 務(wù) 場(chǎng) 景 有 關(guān) , 例 如 : 兩 個(gè) PO之 間 的 關(guān) 系 會(huì) 影 響 具 體 業(yè) 務(wù) , 并 且 這 種 關(guān) 系 存 在 多 種 類 型 , 那 么這 種 多 對(duì) 多 關(guān) 系 也 應(yīng) 該 表 現(xiàn) 為 一 個(gè) DO, 又 如 : “ 角 色 ” 與 “ 資 源 ” 之 間 存 在 多 對(duì) 多 關(guān) 系 , 而 這 種 關(guān) 系 很 明 顯 會(huì) 表 現(xiàn) 為 一 個(gè) DO“權(quán) 限 ” 。n 某 些 情 況 下 , 為 了 某 種 持 久 化 策 略 或 者 性 能 的 考 慮 , 一 個(gè) PO可 能 對(duì) 應(yīng) 多 個(gè) DO, 反 之 亦 然 。 例 如 客 戶 Customer有 其 聯(lián)
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年防凍教育安全教育班會(huì)全文PPT
- 2025年寒假安全教育班會(huì)全文PPT
- 初中2025年冬季防溺水安全教育全文PPT
- 初中臘八節(jié)2024年專題PPT
- 主播直播培訓(xùn)提升人氣的方法正確的直播方式如何留住游客
- XX地區(qū)機(jī)關(guān)工委2024年度年終黨建工作總結(jié)述職匯報(bào)
- 心肺復(fù)蘇培訓(xùn)(心臟驟停的臨床表現(xiàn)與診斷)
- 我的大學(xué)生活介紹
- XX單位2024年終專題組織生活會(huì)理論學(xué)習(xí)理論學(xué)習(xí)強(qiáng)黨性凝心聚力建新功
- 2024年XX單位個(gè)人述職述廉報(bào)告
- 一文解讀2025中央經(jīng)濟(jì)工作會(huì)議精神(使社會(huì)信心有效提振經(jīng)濟(jì)明顯回升)
- 2025職業(yè)生涯規(guī)劃報(bào)告自我評(píng)估職業(yè)探索目標(biāo)設(shè)定發(fā)展策略
- 2024年度XX縣縣委書記個(gè)人述職報(bào)告及2025年工作計(jì)劃
- 寒假計(jì)劃中學(xué)生寒假計(jì)劃安排表(規(guī)劃好寒假的每個(gè)階段)
- 中央經(jīng)濟(jì)工作會(huì)議九大看點(diǎn)學(xué)思想強(qiáng)黨性重實(shí)踐建新功