對象設計:角色、責任和協作
?
?
????????????????
書名:對象設計:角色、責任和協作
?????????
英文名:
Object Design:Roles,Responsibilities,and Collaborations
?????????
作者:
[
美
]Rebecca Wirfs-Brock, Alan McKean
?????????
出版社:人民郵電出版社
?????????
閱讀類別:精讀
?
2007
年
3
月
18
日星期日
這是一本由
RDD
(責任驅動設計)的創始人寫的關于
RDD
的書。從
Larman
的《
UML
和模式應用》中知道了按角色、責任和協作來設計對象,而基于這種思想進行設計我從看到這本書之前就已經這樣做了,我把它看作是一種自然的方式,對象就像人一樣,可以一起來完成一些事情,那些現實世界中的非生命體就像卡通人物一樣,在對象的世界都具有了生命。我當時在那本有一章關于面向對象介紹的書中說過“這里面有一個樸素的思想叫做換位思考,把你想象成你要設計的對象”,看看它該做點什么。
這本書從一個理論的高度概括了我自悟的那個設計對象的自然方式,同時給出了不同情況下的應用,并加入了設計模式。
下面是一句金子般的話,是
RDD
的核心思想。我是超級贊同這句話,并且覺得那些一味考察算法和數據結構還號稱自己使用面向對象構建系統的公司去死吧!
?
對象不僅僅只是簡單的邏輯和數據的綁定,它們是對象世界中享有各自責任的一員。
?
第一章??????
設計概念
對象機器
????
將一個軟件系統,看成是一部對象機器,而且是一部非常復雜的機器(比我們認識的機器還要復雜)。為了管理這種復雜性,我們將系統行為指派到具體特定角色的對象中(
P3
)。
?
作者接著為我們補充了對象設計的補充概念(之所以叫補充,或許在
RDD
之前不會考慮這些,嗯,也許之前的人們總是在關注算法和數據結構之類的東西,就像今天許多公司一樣。):
應用系統
=
一組相互作用的對象
???
對象
=
一個或多個角色的實現
???
角色
=
一組相關的責任
???
協作
=
執行一項任務或掌握某種信息的義務
???
契約
=
描述協作提綱的一種協定。
不知道是翻譯問題還是我理解能力有問題,總覺得這些話說得有些別扭。看看下面作者的詳細解釋吧。
?
角色、責任和協作
角色與責任的關系
?
P3
為了生存,對象將具有特定的使命——在給定環境中扮演一種角色。扮演相同角色的對象可以相互替換。
這個角色的概念應該就是生活中角色的本義吧,比如作者所舉的快遞公司的例子,它們都扮演快遞公司的角色,快遞公司就是所說的對象,按照綠框中的文字來講,角色就是責任,然而我覺得這句話應該是說:角色具有責任,因為其具有這種責任,則被稱為這種角色,好比,具有給學生講課這種責任的就叫老師角色,然后李老師、張老師這些對象都扮演老師這樣的角色,它們都具有給學生講課這種責任,
這本書的一個巨大的特點就是:每句話都很有用!
責任
就是對象在系統中要做的事,擔當的使命,完成的工作。相互替換使用
指的是扮演相同角色的對象可以相互替換,所以我覺得可能是翻譯的有些問題。
因此我覺得這句話的完整理解應該是:
角色具有可以由不同對象承擔的責任。
對象與角色的關系
?
P3
考察一個對象時,最好先思考一下對象到底扮演什么角色?
P3
在軟件機器中,角色就是一個插槽,在運行的時候由對象來填補。
我覺得這似乎就是在說:設計軟件系統時,先考慮角色,一個系統,應該由什么角色來組成——比如學校中,有教師、行政主管、后勤等角色組成,而至于由誰來扮演這些角色,等到學校運轉起來再定。
說某個對象扮演某個角色,是因為它擔當了這個角色的責任。
?
然而我還是有些疑惑,在一個軟件系統中,由多個對象扮演一個角色,是怎樣一種情況呢?多態?
?
對象社區
??
P5
軟件是由一組共同工作的對象所組成的社區。它們之間通過請求和應答相互協作。每個對象都由各自的責任,都為社區提供自己的信息和服務。
??
這里面說出了對象軟件的本質是對象社區。我是很贊同這種說法的,我們可以通過一種自然的思考方式,來考慮對象設計,對象應該具有什么責任(掌握什么信息,提供什么服務),以及對象是如何協作完成大型任務的。
?? P5
若對象能夠在自己所持有的信息基礎之上展開工作,那么它就具有更高的智能度。
??
這就是
Larman
所謂的“信息專家模式”,由掌握信息的對象來完成基于該信息的任務。知道一個對象所持有的信息似乎比了解一個對象的責任更容易,至少從我的實踐中可以得到這樣的結論。
?
對象
Role Stereotypes
這本書將
Role Stereotypes
翻譯成角色構造型,意思指代對象的本質和角色的類型。采用構造型這個術語應該是為了簡單,不過我覺得它不能很好的表明它的意思。所以我還是覺得就叫角色類型就好了,并且我認為對象的角色類型就決定了它的本質是什么。
角色類型
:
l????????
信息持有者:掌握并提供信息。(只扮演這一角色的應該就是
VO
了)
l????????
構造者:維護對象之間的關系以及與這些關系相關的信息。(指的應該是關聯對象)
l????????
服務提供者:執行工作,通常為其他對象提供服務。
l????????
協調者:通過向其他對象委托任務來響應事件。
l????????
控制者:進行決策并知道其他對象的行為。
l????????
接口:連接系統的各個部分,并在它們之間進行信息和請求的轉換。(這里的接口應該就是接口的本意,就是個連接器,而不是面向對象語言中的接口——只有方法聲明的類)
?
?
就像一個人可以扮演多種角色一樣,一個對象也可以同時屬于多種角色類型。比如一個完整的對象基本上都是信息的持有者和服務的提供者。角色類型只是將角色按不同責任分類,具有一定的指導意義,但不必太苛求。以自然的態度對待就好了。
?
?
對象契約
??????
對象契約就是對象的使用說明書,在什么條件滿足的情況下才能使用這個對象(前置條件,在這個書里叫使用條件),使用了這個對象會產生什么作用,這個對象是干什么的(也就是后置條件,本書叫使用效果)
?
對象契約描述了一些條件。在這些條件下,對象能確保其正確工作,并產生合理的效果。
?
領域對象
P8
領域對象為開發者與用戶一起討論系統提供了一個公共背景。它代表的是用戶和特定領域專家熟悉的概念。
P8
領域由用戶所需的信息、服務以及聯系兩者的結構所組成。
?
?
接口
?
?P10
接口表達了對外提供服務并且解釋了該如何得到這些服務。
?
?
?
?
接口就是兩個對象名片。我忽然覺得接口的概念和
OOP
中的接口是統一的,大家都是提供給外部系統其可以被外部系統使用的服務。
?
?
?
我們把一個對象的設計分成
3
個部分:它的公開接口、使用條件與術語及實現其業務的私有細節。
?
?
類
在這一部分中,作者給出了很多好的關于軟件類的觀點,這有別于來自于
C++
陣營或數學領域的專家給出的觀點,那些觀點大多數都是將類看成數據類型,也有別于那些沒什么編程經驗的對象專家,將類簡單類別成生活中的類。
作者認為:我們賦予一個類的特性就是那些我們期望它的實體會擁有的特性。我們賦予一個類實體的任何關于“知”、“行”或者“決策”的責任都會在類定義中具體化,并且被類所包含的實體方法來實現。
?
類通常擁有兩種角色:首先,它們就像一個工廠,初始化對象并且實現它們自身的責任;其次,它們就像一個獨立的服務提供者,為與其有關聯的客戶提供服務。
?
?
?
盡管共享一個定義,但實體之間通常都會表現出不同的行為。因為它們所依賴的自身私有數據和關聯幫助對象都是不同的。
共享一個定義就是說,這些實體都是由一個類創建的,類就是這些實體的定義。在這里,實體就是實例。
雖說將文中框圖中的內容摘錄出來是因為它們都很精辟,然而仔細閱讀本書的每一句都將非常有收獲,作者細致清晰毫不含糊的講解,使人感覺猶如醍醐灌頂。這是我看過的關于對象和類的關系最精辟的講解!
?
P14
一個對象數據域內的變量值就標識著該
對象的狀態
。這些變量定義了一個對象的內部結構以及其看待關聯對象的方式。一個對象可以持有其他對象的引用,
這些引用使得一個對象可以看見其他對象并且與其相互作用
。這些
引用
并沒有說明對象之間是如何交互的,只不過表明了對象之間潛在的協作關系。
?
復合與繼承
?????
在一個對象組織模型中,對象之間通常存在兩種關系:復合和繼承。
家族關系樹刻畫了一群人之間的關系結構。向這個關系樹中添加新成員只會有兩種方式,要么是婚姻迎娶
(
復合,在生命周期中有效,并且可以廢除關系
)
,要么就是作為某成員的新子孫
(繼承,一旦產生了就改變不了了,因為你爹永遠都是你爹!)。
?
??
復合就是在一個對象內部調用其它對象的服務來完成任務。復合就是我們最常用的一種擴展對象功能的方法,或者是說對象協作的方式。
一個對象通過協作來調用另外一個對象的責任
(復合)。同時,一個對象通過繼承擁有另外一個對象所擁有的責任。
?
體系結構風格
??????????
設計模式
是一種在協作者之間分配責任的風格,目的是為了解決特定的設計問題。
?????
體系風格
是軟件對象的組織風格。常見的體系風格有:層次式(
layered
),管道—過濾器式(
pipes-and filters
),黑板式(
blackboard
)
?