天天看點

《OOD啟思錄》—第2章2.6節角色與類

本節書摘來自異步社群《ood啟思錄》一書中的第2章2.6節角色與類,作者【美】arthur j.riel,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

2.6 角色與類

ood啟思錄

經驗原則2.11

確定你為之模組化的抽象概念是類,而不隻是對象扮演的角色。

“母親”或者“父親”是不是類,還是某個“人”對象所扮演的角色?答案取決于設計者為之模組化的領域是什麼。如果在給定的領域中,母親和父親具有不同的行為,那麼或許他們應當被模組化為類。如果他們的行為相同,那麼他們隻是“人”類的對象所扮演的不同角色。例如,我們可以把家庭看作“父親”類的對象、“母親”類的對象和幾個“子女”類的對象所構成的對象,也可以把家庭看作一個稱為“父親”的“人”對象、一個稱為“母親”的“人”對象和一組稱為“子女”的“人”對象構成的對象(參見圖2.11)。區分隻在于不同的行為。在建立不同的類之前,請確定它們的行為确實是不同的,而不是每個角色隻使用“人”的能力的一個子集。請記住,一個對象隻用到它的類的行為的一個子集是毫無問題的。

《OOD啟思錄》—第2章2.6節角色與類

有些設計者的做法是,測試一下公有接口中有沒有哪個成員對于特定的角色無法使用。如果有這樣的成員,那麼就意味着需要另一個類。如果它隻是沒有被用到,那麼它隻是被用作多個角色的同一個類。例如,如果“母親”的一個操作是go_into_labor()(分娩),那麼“父親”最好實作為另一個獨立的類,因為父親是無法分娩的。但是,如果這個家庭生活在一個父系社會中,隻有母親才會執行change_diaper()(換尿布)方法,那麼“母親”隻是“人”類所扮演的一個角色。得出這一結論的理由是因為如果有必要的話,父親也可以執行change_diaper()方法。但是,在更抽象的領域,若那個領域中“無法執行”與設計者或者領域選擇“不去執行”的差異并不明顯,那麼這種方法就難以奏效了。

在設計過程中,面向對象設計者需要決定是否把一個特定的角色塑造成一個類。這就意味着我們還需要一條經驗原則來指導這一決定。下面的章節将嘗試給出這樣的經驗原則,但我對結果并不完全滿意,因為這條經驗原則并不是在所有領域中都适用的。

術語表

abstract class

抽象類。不知道如何執行個體化自身對象的類。

class

類。以雙向聯系的方式封裝資料和行為的構造。與現實世界中的一個概念對應。抽象資料類型(adt)是類的同義詞。

concrete class

具體類。知道如何執行個體化自身對象的類。

constructor

構造函數。類的一個特殊的操作,負責建立/初始化該類的對象。

destructor

析構函數。類的一個特殊的操作,負責銷毀/清除該類的對象。

dynamic semantic

動态語義。類的對象所能具有的所有可能狀态,以及這些狀态之間被允許的轉換的集合。常用狀态轉換圖來表示。

information hiding

資訊隐藏。類向該類的對象的使用者隐藏它的實作細節的能力。

instantiation relationship

執行個體化關系。類和它的對象之間的關系。我們說類執行個體化對象。

key abstraction

關鍵抽象。關鍵抽象被定義成領域模型中的一個主要實體。關鍵抽象經常表現為領域詞彙中的一個名詞。

message

消息。類中定義的操作的名稱。在強類型語言中,消息可以包含名稱、傳回類型以及操作參數類型(也即操作的原型)。

method

方法。消息的實作。

object

對象。屬于它的類的一個樣例,包含它自己的辨別、類的行為、類的接口、類的資料的一份拷貝。也稱為類的執行個體。

overloaded function

重載函數。系統中的兩個函數可以有相同的名字的能力,隻要它們的參數類型不同(類内重載)或者所屬的類不同(類間重載)。

protocol

協定。類能響應的消息清單。

self object

self對象。控制位于方法内部時,接受消息的對象的引用。

經驗原則小結

經驗原則2.1 所有資料都應當隐藏在它所在的類内部。

經驗原則2.2 類的使用者必須依賴類的公有接口,但類不能依賴它的使用者。

經驗原則2.3 盡量減少類的協定中的消息。

經驗原則 2.4 實作所有類都了解的最基本公有接口[例如,拷貝操作(深拷貝與淺拷貝)、相等性判斷、正确輸出内容、從ascii描述解析等]。

經驗原則2.5 不要把實作細節(例如放置共用代碼的私有函數)放到類的公有接口中。

經驗原則2.6 不要以使用者無法使用或不感興趣的東西擾亂類的公有接口。

經驗原則 2.7 類之間應該零耦合,或者隻有導出耦合關系。也即,一個類要麼同另一個類毫無關系,要麼隻使用另一個類的公有接口中的操作。

經驗原則2.8 類應當隻表示一個關鍵抽象。

經驗原則2.9 把相關的資料和行為集中放置。

經驗原則2.10 把不相關的資訊放在另一個類中(也即:互不溝通的行為)。

經驗原則2.11 確定你為之模組化的抽象概念是類,而不隻是對象扮演的角色。

本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。