《OOD启思录》—第2章2.6节角色与类
本節書摘來自異步社區《OOD啟思錄》一書中的第2章2.6節角色與類,作者【美】Arthur J.Riel,更多章節內容可以訪問云棲社區“異步社區”公眾號查看。
2.6 角色與類
OOD啟思錄
經驗原則2.11
確保你為之建模的抽象概念是類,而不只是對象扮演的角色。
“母親”或者“父親”是不是類,還是某個“人”對象所扮演的角色?答案取決于設計者為之建模的領域是什么。如果在給定的領域中,母親和父親具有不同的行為,那么或許他們應當被建模為類。如果他們的行為相同,那么他們只是“人”類的對象所扮演的不同角色。例如,我們可以把家庭看作“父親”類的對象、“母親”類的對象和幾個“子女”類的對象所構成的對象,也可以把家庭看作一個稱為“父親”的“人”對象、一個稱為“母親”的“人”對象和一組稱為“子女”的“人”對象構成的對象(參見圖2.11)。區分只在于不同的行為。在創建不同的類之前,請確保它們的行為確實是不同的,而不是每個角色只使用“人”的能力的一個子集。請記住,一個對象只用到它的類的行為的一個子集是毫無問題的。
有些設計者的做法是,測試一下公有接口中有沒有哪個成員對于特定的角色無法使用。如果有這樣的成員,那么就意味著需要另一個類。如果它只是沒有被用到,那么它只是被用作多個角色的同一個類。例如,如果“母親”的一個操作是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對象??刂莆挥诜椒▋炔繒r,接受消息的對象的引用。
經驗原則小結
經驗原則2.1 所有數據都應當隱藏在它所在的類內部。
經驗原則2.2 類的使用者必須依賴類的公有接口,但類不能依賴它的使用者。
經驗原則2.3 盡量減少類的協議中的消息。
經驗原則 2.4 實現所有類都理解的最基本公有接口[例如,拷貝操作(深拷貝與淺拷貝)、相等性判斷、正確輸出內容、從ASCII描述解析等]。
經驗原則2.5 不要把實現細節(例如放置共用代碼的私有函數)放到類的公有接口中。
經驗原則2.6 不要以用戶無法使用或不感興趣的東西擾亂類的公有接口。
經驗原則 2.7 類之間應該零耦合,或者只有導出耦合關系。也即,一個類要么同另一個類毫無關系,要么只使用另一個類的公有接口中的操作。
經驗原則2.8 類應當只表示一個關鍵抽象。
經驗原則2.9 把相關的數據和行為集中放置。
經驗原則2.10 把不相關的信息放在另一個類中(也即:互不溝通的行為)。
經驗原則2.11 確保你為之建模的抽象概念是類,而不只是對象扮演的角色。
本文僅用于學習和交流目的,不代表異步社區觀點。非商業轉載請注明作譯者、出處,并保留本文的原始鏈接。
總結
以上是生活随笔為你收集整理的《OOD启思录》—第2章2.6节角色与类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tomcat源代码解析系列
- 下一篇: 【Scrapy】Unsupported