UML精粹 UML類圖全面剖析
本節(jié)和大家一起學(xué)習(xí)一下UML精粹中的類圖,主要從六個(gè)方面向大家介紹,希望通過(guò)本節(jié)的學(xué)習(xí)你對(duì)UML精粹中類圖的知識(shí)有一定的了解,下面讓我們一起來(lái)學(xué)習(xí)UML類圖吧。
UML精粹-類圖
一直覺得自己對(duì)UML的理解還遠(yuǎn)遠(yuǎn)不夠深刻,最近在畫即時(shí)消息系統(tǒng)核心模塊的類圖時(shí)越有這種感覺。急忙找來(lái)老馬的<<UML精粹>>很補(bǔ)一下下。***篇,是關(guān)于UML類圖的:
一、區(qū)分操作operation和方法method
操作是對(duì)對(duì)象提出的事情(過(guò)程說(shuō)明),而方法則是過(guò)程體。例如,超類的getPrice()就是一個(gè)操作,而他的所有子類的getPrice()則是方法。
操作可分為恒態(tài)操作query和改態(tài)操作modifier。區(qū)別是他們能夠改變可觀察到的狀態(tài)。恒態(tài)操作的一個(gè)優(yōu)點(diǎn)是改變恒態(tài)操作的執(zhí)行順序而不改變系統(tǒng)的行為,所以突出恒態(tài)操作是有益的,通常的習(xí)慣是,使改態(tài)操作不帶返回值,這樣,有返回值的就是恒態(tài)操作,雖然這樣有時(shí)會(huì)感到不便。(Meyer的‘改態(tài)操作-恒態(tài)操作分隔原理’)。
二、依賴
UML精粹中類圖一般在如下兩周情況下會(huì)發(fā)生依賴關(guān)系:一個(gè)類把消息發(fā)給另外一個(gè)類;一個(gè)類以另外一個(gè)類作為數(shù)據(jù)部分。
過(guò)于復(fù)雜的依賴可能會(huì)導(dǎo)致‘漣漪效應(yīng)’。這種效應(yīng)的結(jié)果是,以后萬(wàn)一有改動(dòng),就會(huì)牽一發(fā)而動(dòng)全身。
《常用表示依賴的詞匯》
call源調(diào)用目標(biāo)中的操作
create源創(chuàng)建目標(biāo)的實(shí)例
derive源由目標(biāo)導(dǎo)出
instantiate源是目標(biāo)的一個(gè)實(shí)例(如果源是一個(gè)類,則這個(gè)類本身就是類的一個(gè)實(shí)例,也就是說(shuō),目標(biāo)類是個(gè)一元類)
permit目標(biāo)允許源訪問(wèn)目標(biāo)的私用特征
realize源是由目標(biāo)定義的規(guī)約或接口的一個(gè)實(shí)現(xiàn)
refine源可以是一個(gè)設(shè)計(jì)類,目標(biāo)是相應(yīng)的分析類
substitute源可以置換目標(biāo)
trace用于追蹤諸如需求到類或者一個(gè)模型中的改動(dòng)如何連接到別處的改動(dòng)
use源要求目標(biāo)為其實(shí)現(xiàn)
設(shè)計(jì)依賴的原則:
1。使依賴減至極少,特別是在他們跨越系統(tǒng)的大區(qū)域時(shí);
2。提防循環(huán)依賴,因?yàn)樗麄儠?huì)引起循環(huán)的改動(dòng);
3。試圖表明一個(gè)類圖中的所有依賴是徒勞無(wú)功的,依賴太多,改動(dòng)也多,當(dāng)這個(gè)依賴和題目由直接聯(lián)系才畫出來(lái);
4。嚴(yán)格將表象與領(lǐng)域分開也是一個(gè)好習(xí)慣。
三、聚合與組合
UML精粹中類圖的聚合aggregation是整體和部分的關(guān)系。很多開發(fā)人員認(rèn)為聚合很重要,即使他們基于的理由不同。于是,UML包含了聚合。但是,聚合在UML中沒有任何語(yǔ)義!而組合composition則不同,它表示一個(gè)類可以是多個(gè)其他類的成分,但任一實(shí)例必須只能是一個(gè)擁有者的成分,即它只屬于一個(gè)擁有者。例如,點(diǎn)的實(shí)例可以是多邊行的部分或者是一個(gè)圓形,但二者不能兼是。這個(gè)規(guī)則也叫做‘非共享規(guī)則’。其次,如果這個(gè)多邊行被刪除了,應(yīng)該自動(dòng)確保它擁有的所有點(diǎn)也都被刪除。
在UML中略去聚合,只使用組合。對(duì)于其他人的類圖中出現(xiàn)的聚合,因該仔細(xì)分析,不同的作者或者開發(fā)團(tuán)隊(duì)對(duì)使用聚合可能有不同的目的。
四、分類與泛化多重分類與動(dòng)態(tài)分類
提防‘子類都是is-a關(guān)系’這樣的想法。有時(shí)候使用繼承可能造成不合適或職責(zé)混淆。看下面的短語(yǔ):
1)Shep是一只牧羊犬
2)牧羊犬是一只犬
3)犬是動(dòng)物
4)牧羊犬是一屬Breed
5)犬是一個(gè)種Species
由1-4可以推出Shep是一屬,而由2-5可推出牧羊犬是一個(gè)種,這樣看起來(lái)就不大合適了。這是因?yàn)?,在這里面并不是所有的關(guān)系都是泛化(牧羊犬類型是犬類型的一個(gè)子類),有些是分類(對(duì)象Shep是牧羊犬類型的一個(gè)實(shí)例)。泛化是傳遞的,分類則不然。
為什么會(huì)把Shep對(duì)象和其他類扯到一起呢?看看分類的定義,分類指的是對(duì)象及其類型之間的關(guān)系。主流編程語(yǔ)言都假定,一個(gè)對(duì)象只屬于一個(gè)類。但在多重分類中,一個(gè)對(duì)象可以表述為若干類型,他們不一定是用繼承來(lái)連接溝通的。
五、何時(shí)使用類圖
1。盡量使用簡(jiǎn)潔的表達(dá)方式(類,關(guān)聯(lián),屬性,泛化,約束),少用高級(jí)的圖示法;
2。不要對(duì)所有事情都繪制類圖,而要集中考慮關(guān)鍵方面
用類圖***的危險(xiǎn)就是,你可能全神貫注于結(jié)構(gòu)而忽略行為。所以,繪制UML精粹中類圖的同時(shí),***連同使用某種形式的行為技術(shù)。
六、按照契約進(jìn)行設(shè)計(jì)
斷言是按契約設(shè)計(jì)的和行,按契約設(shè)計(jì)使用了三中特定的斷言:前置條件pre-condition,后置條件post-consition和不變式invariant。前置條件和后置條件用于操作。后置條件是操作執(zhí)行后‘事前就該如此’的一種陳述(比如計(jì)算的公式,你輸入?yún)?shù),我就按這個(gè)公式給你結(jié)果),他用以表示‘我不做什么而不是我們?nèi)绾稳プ?rsquo;。換言之,他是把接口和實(shí)現(xiàn)分開的一種有用的方法。前置條件是在操作執(zhí)行前,我們指望事情如何的一種陳述(比如對(duì)輸入值的要求)。前置條件明確了‘誰(shuí)負(fù)責(zé)核查輸入條件的正確性’(比如輸入的參數(shù)置的取值范圍)。這很重要,如果沒有這樣明確的職責(zé)陳述,則可能是‘核查過(guò)少’(沒有檢查)或者‘核查過(guò)多’(雙發(fā)都檢查)。
通過(guò)前置條件和后置條件,我們可以對(duì)異常Exception得出一個(gè)比較深刻的理解:異常發(fā)生在啟用操作時(shí),其前置條件滿足,但該操作卻不能回送使后置條件滿足的結(jié)果。不變式是加在與給定類所有公用操作相關(guān)的前置條件和后置條件之上的。在方法執(zhí)行中,不變式可以為假,但是它在任何別的對(duì)象可對(duì)接受者做任何事情時(shí)它就因該回復(fù)成真。
斷言對(duì)子類的構(gòu)造可起到獨(dú)特的作用。繼承的危險(xiǎn)之一是,你可能定義一個(gè)新的子類,但它和超類的操作不相容。斷言減少了這種情況出現(xiàn)的機(jī)會(huì)。類的不變式和后置條件必須用于所有子類。子類可以選擇加強(qiáng)這些斷言,但不能削弱它們。另一方面,前置條件卻不能加強(qiáng),但可以減弱。(在動(dòng)態(tài)綁定中,如果一個(gè)子類加強(qiáng)前置條件,則當(dāng)它用于子類時(shí),超類的操作就會(huì)失?。?/p>
【編輯推薦】















 
 
 
 
 
 
 