2013年7月1日 星期一

OO的"沉重",DDD (2)

在軟體開發過程,每個iteration一般會不斷添加新的需求,導致domain model不斷的變化,而軟體工程師以及領域專家,對於domain model也會更了解,而為了避免domain model不斷膨脹到無法處理,人們會發揮抽象、精練的能力

作者提出了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
可以更嚴格的保證行為以及其結果

沒有留言:

張貼留言