軟件工程筆記:通用職責分配模式(grasp)

通用職責分配模式(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模式要求的面向對象設計模式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章