My friends, my life, my style - James S.F. Hsieh

9/07/2009

[OOAD] Abstraction 抽象化的目的

抽象化在軟體架構中是個極為重要的過程, 我們利用抽象化來簡化複雜度, 抽象是幫助人們思考的重要手段, 抽象化的目的在於: 提供一個清楚且明確定義的抽象層次, 該層次必須能夠容易描述, 理解, 分析且富含彈性, 抽象層只揭露出必要的資訊, 隱藏不需要知道的細節. 所以, 我們可以視抽象層是個 "思考問題的邊界" "運作的協定" 對於邊界內外的兩端是無關的, 兩者唯一相依的就是抽象的定義.

抽象化的設計原則為 Principle of least astonishment:
1.     明確且可行的抽象目的與具有望文生義的命名 Purpose, Primitiveness, Naming
2.     抽象層獨立於 client 與 supplier 並且隱藏細節 Dependency Inversion Principle
3.     分離無關的抽象相度 Single Responsibility Principle,  Interface Segregation Principle
4.     抽象層之可擴充性與之不變性, Extendable, Applicability, and Invariant, Open Closed Principle
5.     抽象層的行為責任必須明確定義 Well-defined contract model and IOPE
6.     抽象層的複用性越高越好 Reusability
7.     相同層次具有一致性的抽象概念 Conceptual consistency
8.     相同層次具有責任的正交與最簡性 Sufficiency and Fine-grained
9.     相同層次具有責任的完備性 Completeness
10.   不同層次間的差異性必須適當 Semantic gap
11.   不同抽象層之間的耦合性必須降低

實作抽象層的原則:
1.     完全符合抽象層定義的行為與語意 Liskov Subsititution Principle
2.   使用抽象層時完全不需要/不能對實作與細節有認知與假設
3.    實作多個抽象層時, 各抽象層相互無關


抽象層的改變越多, 語意就越難保持一致性, 最後導致開發人員必須花掉大部分的時間去追蹤程式碼來了解其語意, 至此, 抽象的存在就蕩然無存了.