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