作者提出了deep model以及supple design的設計,所謂deep model也就是更加抽象、更容易掌握的模型,而supple design則是彈性的設計,讓模型更容易擴充,兩者都可以透過refactoring達到,很可惜,這裡refactoring不是類似code的操作方式,而是概念上的不斷重新調整
Deep Model
在討論domain model上有幾個重要的概念,可以幫助程式設計師,找出更恰當的模型或者修正一些模型的問題
- 反覆討論:確定與領域專家達成一致正確的共識,有時候領域專家會"尊重"程式設計師的設計,雖然這個設計可能跟現實不吻合,要反覆討論
- 傾聽語言:從交談過程中,確定專家是否確定這個模型與描述一致
- 找出矛盾:需求上是否有模型無法解釋處?
- 不斷學習:尋找過去經驗,或者閱讀相關書籍
- 找出implicit處:發覺應該抽出的概念,如限制、補充
在此作者提出了specification pattern,將依些限制或者補充,當成類似英文中的副詞的位置,有時這個元素必須要獨立出來,置於domain model,可以更加完整的描述整個模型
Supple Design
supple design的部分則是彈性的設計,然則會有overengineering的疑慮,導致過度的設計,然則一個最大的原則是low coupling high cohesion,將複雜的模型用簡單的關係表示,不要過度使用抽象層面
作者也沒有完全給出一個恰如其分的設計的明確方式,更沒有檢驗的方式,不過提出了若干的pattern作為思考的方向,如下圖表示
- Intention Revealing Interfaces:命名與操作時要描述他們的目的與效果,封裝物件的行為
- Side-Effect-Free Functions:盡可能地將邏輯封裝在function內,如果必要回傳考慮回傳value object,有效的控制影響層面
- Assertion:如果side-effect是implict的,大量交互作用下,結果變得無法預測,利用assertion可以減輕不可預期的效果
- Standalone Classes:極致的low coupling就是standalone class
- Closure of Operations:運作後回傳相同型態,可以降低依賴程度
- Conceptual Contours:找出輪廓,避免關係太複雜,也避免介面無法解釋。設計得太粗糙則介面無法解釋模型,關係太複雜則是呈現了太多的細節。
A Declarative Style of Design
由上面幾個組合而成,則得到類似Design by Contract的效果,可以達到某些特性的限定
- Acceptable and unacceptable input values or types, and their meanings
- Return values or types, and their meanings
- Error and exception condition values or types that can occur, and their meanings
- Side effects
- Preconditions
- Postconditions
- Invariants
可以更嚴格的保證行為以及其結果
沒有留言:
張貼留言