天天看點

軟體方法(下)第8章分析之分析類圖—知識篇Part12-識别泛化關系

8.3.2 識别泛化關系

8.3.2.1 識别泛化的思路

(1)直接形成

類圖中的兩個類可能會直接形成泛化關系,如圖8-98所示。嚴格的做法是針對每兩個類,思考“A是B的一種嗎?”,再反過來思考“B是A的一種嗎?”不過如果真的要這樣做,工作量還是挺大的。類圖中有n個類,就需要思考2C2 n=n(n-1)次。n=11時,就是110次了!實際工作中,往往是先掃描一遍,大腦迅速過濾出可能值得這樣思考的類,針對這些類思考即可。

軟體方法(下)第8章分析之分析類圖—知識篇Part12-識别泛化關系

圖8-98 直接形成-兩個類之間直接形成泛化關系

實際上,類圖上已有的兩個類有泛化關系但未識别的情況并不多,因為之前從用例規約識别類和屬性時很有可能已經發現了。

(2)自下而上(從特殊到一般)

更多的情況是發現類圖上已有的兩個或多個類有共同特征,于是抽象出共同的超類,如圖8-99所示。

軟體方法(下)第8章分析之分析類圖—知識篇Part12-識别泛化關系

圖8-99 自下而上-兩個類之上有共同的超類

關聯也可以看作類的屬性,關聯的角色名相當于類的屬性名稱。如果多個類關聯到同一個類而且角色名相同,也可以考慮泛化出共同的超類,如圖8-100。注意,角色名要相同,否則即使類型相同也不是同一屬性。

軟體方法(下)第8章分析之分析類圖—知識篇Part12-識别泛化關系

圖8-100 共同的關聯也可以提煉超類

(3)自上而下(從一般到特殊)

如圖8-101所示,這個識别思路就是8.2.5.5 屬性是否對所有對象都有意義裡的思路,此處就不再重複叙述。

軟體方法(下)第8章分析之分析類圖—知識篇Part12-識别泛化關系

圖8-101 自上而下-一個類分裂出子類

8.3.2.2 被誤作關聯的泛化

泛化關系有時會被誤認為關聯,下面列舉一些錯例供參考。

圖8-102中,“員工有排程員、裝卸工、配貨員”指的是員工的對象集合包含了排程員、裝卸工、配貨員的對象集合,不是指一個員工對象由排程員對象、裝卸工對象、配貨員對象構成。正确的關系是右側的泛化關系,而不是左側的關聯(此處是組合)關系。

軟體方法(下)第8章分析之分析類圖—知識篇Part12-識别泛化關系

圖8-102 泛化被誤作關聯 例1

很多系統經常需要設定一些參數,有人會把參數模組化成圖8-103左側的類圖,把逾時時間、鎖定設定、頻帶等作為參數的屬性。屬性其實就是關聯(此處是組合)的一種變體,8-103左側和右側是等同的。

軟體方法(下)第8章分析之分析類圖—知識篇Part12-識别泛化關系

圖8-103 泛化被誤作關聯 例2

圖8-103的意思是一個參數個體由若幹個具體參數個體組成,這不符合領域内涵。更符合領域内涵的是“具體參數是參數的一種”或者“參數的集合包含各具體參數的集合”,也就是說,泛化關系更合适。還有一種做法是把具體的參數全部抽象為“名稱”和“值”兩個屬性。如圖8-104。

軟體方法(下)第8章分析之分析類圖—知識篇Part12-識别泛化關系

圖8-104 泛化被誤作關聯 例2 更正

如果按圖8-103的方式模組化,參數類隻有一個對象,但這個對象有很多個屬性。當需要為系統設定一種新的參數時,就需要修改類結構,增加新的屬性。如果按圖8-104的方式模組化,隻需要增加新的參數對象即可,類結構不需要改變。

一些看起來像是多重性為1對0..1的關聯,有可能實際上是泛化關系。例如,1台電器可能是1台洗衣機,也可能不是;1台電器可能是1台電視機,也可能不是;1台電器可能是1台空調,也可能不是,有人以為是關聯關系,于是畫出圖8-105。

軟體方法(下)第8章分析之分析類圖—知識篇Part12-識别泛化關系

圖8-105 泛化被誤作關聯 例3

圖8-105的意思是:一台電器可能由一台洗衣機、一台電視機、一台空調組裝而成。這是錯誤的,應該是電器的集合包含洗衣機、電視機和空調的集合,即泛化關系。如圖8-106。

軟體方法(下)第8章分析之分析類圖—知識篇Part12-識别泛化關系

圖8-106 泛化被誤作關聯 例3 更正

繼續閱讀