使用CRC cards的『責任驅動設計』方法


本文簡單介紹一般人比較不熟習的所謂『責任驅動設計』(Responsibility-Driven Design 簡稱 RDD),這種設計方法是根據系統的責任,來設計類別的行為與方法或功能,因此RDD可運用在軟體發展上。

1989年Rebecca Wirfs-Brock與Brain Wilkerson在OOPSLA'89發表『責任驅動設計』的軟體設計方法,後來她們與Lauren Wiener共同寫了一本叫『Designing Object-Oriented Software』(PTR Prentice Hall 1990)的書用以實作RDD,2003年Wirfs-Brock與Alan McKean合著『Object Design - Roles, Responsibilities, and Collaborations』(Addison-Wesley)一書更深入介紹RDD,讀者如沒有這兩本書而有興趣的話可從網路叫出RDD相關文章參考。

本文介紹這種軟體設計方法,乃是因為在OOSE或OOAD的書籍很少提到,據我所知上課時老師也很少介紹,這種方法的設計觀念是認為,軟體物件以及大型原件的設計是基於『責任』(responsibilities)、『角色』(roles)、以及『合作』(collaborations),這種觀念,有部份異於諸如UP之類的「傳統」軟體發展想法,但是RDD是一種非正規(informal)的設計概念,其後半部如與傳統的設計與實作連結,這個方法應該值得關注,不過我在此地必須說明,RDD並非完全脫離一般OOAD甚至OOSE的觀念,只不過它對於物件的定義有別於UML的型態 ,物件並非單純資料與演繹的結合,而認為物件是結合其『角色』與『責任』的東西,當要執行某些責任時需與其他物件合作才能完成。因此,RDD的重點在於,發展物件之間的合作與溝通模式,以及物件責任與動態,而不在於物件的內部狀態(internal state)與結構,CRC cards的內涵剛好符合這種需要。如果我們定義軟體應用系統是由一群物件間的相互作用(interactions)而成,則這種相互作用就是得自於client/server模式。

Client/Server模式

物件的作業元(operations)在RDD中視為『服務』,這種服務可以提供需要的其他物件,因此只要服務存在,我們說物件就有責任提供給需要服務者,所謂責任依照Wirfs-Brock et al.的定義包括下列主要項目:
  • 物件所保養的知識(knowledge),以及 
  • 一個物件能夠履行的行為(actions)。 
所謂知識(資料)形成一群責任提供給需要這些資料的物件,這些物件如需要可以改變這些資料,至於履行行為就是提供給需要服務的物件的責任,由於物件時常都具備給要求服務的其他物件,這種關係就是所謂client/server的關係。

因此,RDD重點在於物件的何種責任需要完成,有些責任除物件本身可以自行完成外,須要合作者(collaborators)來協助完成,合作可以依照client/server的相互作用(interactions)完成,因此client/server模式影響RDD。所謂client/server模式(或說機制)是client發出要求server提供資訊或履行一些作業,Server就適當地提供資訊或依照要求完成履行作業,但client並不知道server如何完成其要求,這就是所謂『資訊隱藏』(information hiding)。Client與server交換資訊是根據兩者間的合約(contract)進行,這種合約集中在:(1) 物件負責何種行為(actions)?(2)物件提供何種資訊?這兩種的問題答案相當我們在CRC cards一文所提的『責任』(responsibilities): doing與knowing責任,下圖表示這種client與server的關聯:

                        

此地我們不擬詳細說明RDD,只是提供「另類」的軟體發展方法,讀者或可參考「現代軟體工程─物件導向軟體發展策略」書籍。

留言

這個網誌中的熱門文章

CMMI是什麼?

TCSE 2017

CRC cards - 非正規物件導向發展技術