通用職責分配模式(grasp)
— 筆記整理自 北京理工大學 計算機學院
什麼是GRASP?
- General Responsibility Assignment Software Patterns(通用職責分配軟件模式)
- GRASP包括4個基本模式和5個擴展模式,描述了對象設計和職責分配的基本原則
- 職責是一個類的契約或義務
- “做”型職責是通過類的方法來實現的
- “知道”型職責是通過類內部封裝的屬性以及類間關係來 體現
- GRASP是如何設計一個面向對象系統的基礎
GRASP的9個模式
- 專家 :應該將職責分配給信息專家(誰的數據誰負責)
- 創建者 :創建對象的職責(何時,由誰來創建和銷燬)
- 低耦合 :類間的關係代表了類之間的耦合程度
- 高內聚 :一個類的職責之間的相關程度和集中程度
- 控制者 :把協調處理系統消息的職責分配給不同控制類
- 多態 :爲不同的派生類分配具體的工作,具有相同接口
- 純虛構 :非實體類,從其他類中抽取相關高內聚職責
- 中介者 :隔離藕合度過大的多個類,可能是虛構的
- 受保護變化:把易於變化部分封裝起來便於擴展
信息專家
- Information Expert
- 信息專家模式是面向對象設計的最基本原則
- 如果某個類擁有完成某個職責所需要的所有信息,那麼這個職責就應該分配給這個類來實現
- 示例:網上購物系統的購物車設計
- 需求:需要讓每種商品只在購物車內出現一次,購買相同商品,只需要更新商品的數量即可
- 方案1:判斷相同的職責與商品ID相關,它存在商品類中
- 方案2:商品類爲實體類,商品ID相關職責太多,應分散
創建者
- 儘可能少的建立對象之間的耦合和依賴關係
- 一般情況下,只在下列情況下才由類A來創建類B,即A是B的創建者:
- 1.A是B的聚合
- 2.A是B的容器
- 3.A持有初始化B的信息(數據)
- 4.A記錄B的實例
- 5.A頻繁使用B
低耦合
- 低耦合降低了因一個類的變化而影響其他類的範圍,而且讓類更簡單,更容易理解
- 造成類A、B之間耦合的情況:
- A是B的屬性
- A調用B的實例的方法
- A的方法中引用了B,包括B是A方法的返回值或參數
- A是B的子類,或者A實現了B
- 遵循一些面向對象設計的基本原則可以降低類間耦合,如LoD,信息專家(職責遷移),避免誇模塊類之間的直接訪問等
高內聚
- 給類儘量分配內聚的職責,即功能性內聚的職責
- 功能性緊密相關的職責應該放在一個類裏,並共同完成有限的功能
- 高內聚更有利於類的理解和重用,也便於類的維護
- 高內聚也是一種隔離
控制者
-
將處理系統事件消息的職責分派給代表下列事物的類:
- 代表整個系統的類
- 代表整個企業或組織的類
- 代表真實世界中參與職責的主動對象類
- 代表一個用例中所有事件的人工處理者類
-
控制者模式的相關原則:
- 1.系統事件的接收與處理通常由一個高級控制者類來代替
- 2.一個子系統會有很多控制者類,分別處理不同的事務
- 3.控制者一般將需要完成的工作分配給其他對象
多態
- 含義同面向對象的基本特性中的多態
- 當相關的可選擇的方法或行爲隨着類型變化時,將行爲的職責分配給那些行爲變化的類型
- 典型編程應用:用多態的方法判斷具體應該用哪個類,而不是用if來判斷類該執行什麼行爲
- 指導:儘量對抽象層編程
純虛構
- 純虛構與純虛函數意思相近
- 高內聚低耦合是系統設計的終極目標
- 從某種角度看,內聚和耦合永遠都是矛盾對立的
- 高內聚要求拆分出更多的類,但對象之間需要更多的協作來完成任務,這又造成了高耦合,反之亦然。
- 用純虛構模式,由一個純虛構的類來協調內聚和耦合,可以在一定程度上解決二者之間的矛盾
中介者
當多個類之間存在複雜的信息交互時,引入一箇中介者類,把多個類之間的關聯職責分配給它,從而降低類之間的耦合程度
備註:圖片託管於github,請確保網絡的可訪問性
受保護變化
- 預先找出不穩定的變化點,使用統一的接口封裝起來,如果未來發生變化的時候,可以通過接口擴展新的功能,而不需要去 修改原來舊的實現
- 與OCP(開閉原則)類似,即一個軟件實體應當對擴展開發,對修改關閉
- 在設計一個模塊的時候,要保證這個模塊可以在不需要被修改 的前提下可以得到擴展
- 通過擴展給系統提供了新的職責,以滿足新的需求,同時又沒有改變系統原來的功能
在迭代中使用GRASP
- 使用GRASP的根本原因是爲了滿足需求的變更
- 敏捷方法通過快速的迭代來刺激變化,讓變化及早暴露,再根據變化進行相應改動,並讓這種改動遵循GRASP,力圖使代碼以及代碼所表達的設計保持乾淨
- 軟件開發活動就是各種權衡:在簡單與複雜之間權衡,在一種方案與另一種方案之間權衡
- 不可能把每個問題、每個權衡的利弊都考慮清楚和全面
GRASP與設計模式
- GRASP是學習使用設計模式的基礎
- GRASP着重考慮設計類的原則及職責分配,比設計模式更重要
- 設計模式是關於類和對象的一種高效、靈活的使用方式,是對面向對象的基本原則的多種良好的實現或經驗的總結
- GoF設計模式提供具體的類結構,考慮設計的實現、類的交互和軟件的質量
- GoF設計模式背後都遵循的就是永恆的設計原則和模式
- GoF設計模式就是符合GRASP模式要求的面向對象設計模式