突出核心(Highlighted Core)
我們需要對模型有全面性的了解,
因此核心領域必須要顯而易見.
精煉文檔可使用UML或順序圖..等. 但它並不是一份完全設計的文檔, 只是提供最低限度的要求.
寫一份"非常簡短"(3~7頁)的文檔, 集中描述核心領域及核心元素之間的主要交互作用.
將模型倉庫中的核心領域的元素標記起來,
而不是去闡述它們的任務.
精煉文檔給出核心領域主要的輪廓, 若模型或代碼的改變影響到精煉文檔, 那麼就需與其他團隊協商,
在改變實施後需立即通知團隊所有成員, 並發布新版的精煉文檔.
內聚機制(Cohesive
Mechanisms)
模型中的概念應用"是什麼(what)"來解釋,
而不是"怎麼做(how)".
將(算法)概念上的內聚機制分離到一個獨立的輕量型框架, 用一個釋意接口說明該框架的功能, 現在領域中的其他元素可以集中描述問題"是什麼"了, 而"怎麼做"的細節交給框架去完成.
通用子域v.s. 內聚機制所承担責作的不同在於:
通用子域: 團隊應如何看待領域中一些的方面, 這點與核心領域無異, 但它沒有核心領域這麼重要與專業化.
內聚機制: 不是用來表示領域,
而是負責解決一些由描述性模型提出的棘手(計算)問題.
總而言之, 模型提出問題, 內聚機制解決問題
若機制本身就是一項資產, 或屬於軟體價值的一個關鍵部份, 那麼就是一種例外.(ex:
排班演算法?)
精煉到聲明性風格
精煉的價值是在於能看到正在做的工作, 而不受不無關的內容干擾,
直指系統本意
隔離核心(Segregated Core)
重構模型, 將核心概念與輔助概分離開來, 加強核心的內聚力, 同時減少核心與其他的代碼的聯系.
分離隔離核心步驟如下:
(1) 確定一個核心子域
(2) 把相關類移至新的模塊, 並為模塊指定一個與概念相符的名稱
(3) 重構代碼, 將無法直接表示核心概念的數據或方法分離出來, 盡量把它們放在概念上相關的模塊中, 但別花太多時間,
把工作重點放在精煉核心子域上, 核心子域對其他的模塊引用必須突出明確.
(4) 對得到的隔離核心重構, 使其中關係與交互作用簡單易懂, 同時減少它與其他模塊的關係(此步驟的重點)
(5) 對其他核心子域重複以上步驟.
對核心進行隔離有時會破壞原本的非核心類之間緊密聯系, 使之變的模糊甚至複雜, 但它可使核心領域更加清晰, 更容易處理.
由於核心領域和設計中的其他部份一樣是不斷演進的, 團隊成員對哪些是核心元素,
哪些是輔助元素也會產生新的認識, 而這些認識應該反饋到核心領域和隔離核心模塊中來, 使它們的定義得到進一步精化.
團隊內部溝通必要非常高效, 保證每個人對核心認識都是一致的
抽象核心(Abstract Core)
當不同模塊的子塊之間有很多交互作用時, 要嘛引用, 要嘛只能間接實現這些交互作用. 前者喪失了劃分模塊的很多優點, 後者會使模型變的難以理解.
找出模型中最根本的"概念", 並把它們分離為不同具體類, 抽象類或接口. 設計一個抽象模型來表重要組件間的大部分交互作用. 把這個抽象的網領性模型放在它自己的模塊中, 而那些專用的, 具體的實現類則放在由其子域的模塊中.
[DDD]學習筆記 第15章 精煉(Distillation)
原文:http://www.cnblogs.com/YangMark/p/3567137.html