在程序設(shè)計(jì)中,
內(nèi)聚度:程序中操作之間聯(lián)系緊密的程度,反應(yīng)一個(gè)子程序內(nèi)部成份相互聯(lián)系的強(qiáng)度
耦合度:兩子程序之間聯(lián)系的強(qiáng)度
顯然,程序設(shè)計(jì)的目標(biāo)是強(qiáng)內(nèi)聚和松耦合(子程序內(nèi)部完整性強(qiáng),與其他子程序的聯(lián)系靈活,程度?。?。
功能分解是面向過程設(shè)計(jì)時(shí)很自然的一種處理復(fù)雜問題的方法,它的基本思想是把問題拆分成多個(gè)功能步驟。,由于“需求總會(huì)發(fā)生變化”,因此不可避免的程序設(shè)計(jì)時(shí)要處理變化。對(duì)此功能分解的對(duì)策是模塊化設(shè)計(jì),但是模塊化設(shè)計(jì)的一大缺點(diǎn)是低聚合和緊耦合,“牽一發(fā)而動(dòng)全身”。
UML Relationships(關(guān)系)初探
基本關(guān)系有四種:依賴(Dependency), 關(guān)聯(lián)(Association), 泛化(Generalization),實(shí)現(xiàn)(Realization)
每種都可以細(xì)化為變體。
依賴關(guān)系(Dependency)
是事物(Thing)之間的關(guān)系, 因此包括類之間的關(guān)系、包之間的關(guān)系、用例之間的關(guān)系、對(duì)象之間的關(guān)系、建模元素與模型之間的關(guān)系等。
依賴關(guān)系用虛線加普通箭頭表示,由客戶(源*)指向供應(yīng)(目標(biāo)*)
兩個(gè)類之間的依賴關(guān)系可以是:
客戶類訪問定義在供應(yīng)者類內(nèi)部的數(shù)據(jù)值
客戶類的操作調(diào)用了定義在供應(yīng)者類內(nèi)部的操作
客戶類的返回類或參數(shù)是供應(yīng)者類的實(shí)例
如果在順序圖中的兩個(gè)對(duì)象存在消息的傳送,而且它們之間沒有結(jié)構(gòu)方面的連接,可以在類圖上用依賴關(guān)系建模。
類之間依賴關(guān)系的細(xì)化:
a.友元依賴<<friend>>
目標(biāo)類視源類為友元,允許源類訪問目標(biāo)類的所有私有屬性和操作
例: 目標(biāo)類:二叉樹,源類:迭代器
b.導(dǎo)出依賴<<derive>>
源類可以從目標(biāo)類通過計(jì)算得出。
例: 源類: 年齡Age 目標(biāo)類: 出生日期
c.細(xì)化依賴<<refine>>
在類圖中表示同一模型的不同詳細(xì)程度的規(guī)格說明,源類比目標(biāo)類更為詳細(xì).
d.實(shí)例化依賴<<instantiate>>
一個(gè)類的對(duì)象是由另一個(gè)的對(duì)象創(chuàng)建,則稱為實(shí)例化依賴。源類創(chuàng)建了目標(biāo)的一個(gè)實(shí)例
例:源類: Array 目標(biāo)類: Stack
e.使用依賴<<use>>
不加任何修飾的依賴即為使用依賴。
如Binary Search Tree類使用依賴于Binary Tree類
f.綁定(Binding)依賴
目標(biāo)類是模板類,源類是模板實(shí)例化后的類
包(package)之間依賴關(guān)系的細(xì)化:
a.訪問依賴<<access>>
源包被授予了可訪問目標(biāo)包的權(quán)限
b.導(dǎo)入依賴<<import>>
它表明了源包可以訪問目標(biāo)包里的元素,但各個(gè)包有自己獨(dú)立的命名空間,這意味著屬于不同包的兩個(gè)元素可以重名。導(dǎo)入
依賴可以使目標(biāo)包內(nèi)的公共可見元素進(jìn)入源包的命名空間。
用例(use case)之間依賴關(guān)系的細(xì)化:
a.包含依賴<<include>>
源用例顯式的包含目標(biāo)用例作為其行為的一部分。此時(shí)源用例稱為基用例,目標(biāo)用例稱為內(nèi)含用例
如果兩個(gè)用例存在包含依賴關(guān)系,則說明基用例的動(dòng)作序列中含有特定的步驟把內(nèi)含用例的動(dòng)作序列包含進(jìn)來
b.擴(kuò)展依賴<<extend>>
它表明源用例擴(kuò)展了目標(biāo)用例的行為。此時(shí),源用例稱為基用例,目標(biāo)用例稱為擴(kuò)展用例。
擴(kuò)展用例在特定條件下為基用例提供附加的動(dòng)態(tài)行為。
例如,在人機(jī)交互過程(基用例)中出現(xiàn)差錯(cuò)時(shí)進(jìn)行的異常處理即為擴(kuò)展動(dòng)作。
擴(kuò)展依賴與包含依賴的區(qū)別在于,如果僅將擴(kuò)展從基用例地動(dòng)作序列中去除,基用例仍然是語義完備的,
即它的執(zhí)行仍將產(chǎn)生有意義的結(jié)果。而包含依賴則不然。
對(duì)象之間依賴關(guān)系的細(xì)化:
a.轉(zhuǎn)換依賴<<become>>
當(dāng)需要在交互圖上表示對(duì)象狀態(tài)的轉(zhuǎn)換時(shí)可以用轉(zhuǎn)換依賴。主要強(qiáng)調(diào)由于消息而導(dǎo)致對(duì)象狀態(tài)的改變。
轉(zhuǎn)換依賴連接的目標(biāo)對(duì)象和源對(duì)象是同一個(gè)對(duì)象。
b.調(diào)用依賴<<call>>
當(dāng)需要在交互圖或?qū)ο髨D上顯式強(qiáng)調(diào)對(duì)象之間或操作之間的調(diào)用關(guān)系時(shí)要用調(diào)用依賴。
它表明源對(duì)象引用了目標(biāo)對(duì)象的操作,或源操作引用了目標(biāo)操作。
c.復(fù)制依賴<<copy>>
為了在交互圖或活動(dòng)圖上描述對(duì)象復(fù)制的動(dòng)作可以采用復(fù)制依賴。它連接兩個(gè)對(duì)象,目標(biāo)對(duì)象是源對(duì)象的完全相同而又獨(dú)立的副本。
d.發(fā)送依賴<<send>>
它連接一個(gè)對(duì)象(在源端)和一個(gè)消息(在目標(biāo)端),表明源對(duì)象在交互過程中發(fā)送了一個(gè)消息,可以用在狀態(tài)機(jī)的描述中。
它針對(duì)內(nèi)嵌有狀態(tài)機(jī)的對(duì)象,可用來描述如何通過發(fā)送信號(hào)以產(chǎn)生某種事件的動(dòng)作。
建模元素與模型之間的依賴關(guān)系:
a.回溯依賴<<trace>>
它連接兩個(gè)模型元素,表明目標(biāo)是源的歷史上的前驅(qū)。如交互和協(xié)作就是從用例導(dǎo)出的。
關(guān)聯(lián)關(guān)系(association)
關(guān)聯(lián)是一種結(jié)構(gòu)關(guān)系, 它描述一組鏈,這些鏈?zhǔn)穷愔g或類與接口之間的連接。
通過這種連接,一個(gè)對(duì)象可以訪問另一個(gè)對(duì)象的屬性或調(diào)用另一個(gè)對(duì)象的操作。
關(guān)聯(lián)是雙向的,其中的角色代表一個(gè)類的對(duì)象在另一個(gè)類中的存在。
例: 兩個(gè)類Employee, Employer存在關(guān)聯(lián)關(guān)系
聚合(aggregation)是一種特殊類型的關(guān)聯(lián), 它描述整體與部分的結(jié)構(gòu)關(guān)系。整體端有一個(gè)菱形作為標(biāo)記
復(fù)合聚合(composite aggregation)是一種特殊的聚合關(guān)系, 又稱組合,它表明整體對(duì)象與部分對(duì)象有相同的生存周期。
角色的復(fù)雜度(Multiplicity)指角色在關(guān)聯(lián)關(guān)系中出現(xiàn)的次數(shù),如1, 0..1, 1..*, *等
例如,對(duì)應(yīng)于現(xiàn)實(shí)中的飛機(jī)場(chǎng)Airport, 可以說它聚合了0..*架飛機(jī)Aircraft,同樣的,一架Aircraft被0..1個(gè)Airport包容(可能處于飛行狀態(tài)),此時(shí)Airport與Aircraft的關(guān)系是聚合。
又如,一輛汽車Car,用于4~5個(gè)輪胎Tire(可能有備用胎),Car和Tire是密不可分的,Tire是Car的一部分,因此用組合來表示二者之間的關(guān)系。一個(gè)Car組合了4..5個(gè)Tire,一個(gè)Tire屬于1輛Car
聚合和組合都可以說是一種has-a關(guān)系,“擁有”,Airport“擁有”Aircraft,Car“擁有”Tire,二者的區(qū)別在于組合強(qiáng)調(diào)的“擁有”是真正意義的部分與整體的關(guān)系,從程序設(shè)計(jì)角度來看組合關(guān)系雙方生存期一致,同生共死;聚合的“擁有”則更多強(qiáng)調(diào)部分的一個(gè)集合與整體有從屬關(guān)系,部分集合內(nèi)部各元素是獨(dú)立的。