表示對象之間的聯(lián)系
描述類的結(jié)構(gòu)之間的關(guān)系。具有方向、名字、角色和多重性等信息。一般的關(guān)聯(lián)關(guān)系語義較弱。也有兩種語義較強(qiáng),分別是聚合與組合
表示類與類之間的連接,它使得一個類知道另外一個類的屬性和方法。
關(guān)聯(lián)可以使用單箭頭表示單向關(guān)聯(lián),使用雙箭頭或者不適用箭頭表示雙向關(guān)聯(lián),不建議使用雙向關(guān)聯(lián),關(guān)聯(lián)有兩個端點(diǎn),每個端點(diǎn)可以有一個基數(shù),表示這個關(guān)聯(lián)的類可以有幾個實(shí)例。
0..1 表示可以有0個或者1個實(shí)例
0..* 表示對實(shí)例的數(shù)目沒有限制
1 表示只能有一個實(shí)例
1..* 表示至少有一個實(shí)例
表現(xiàn)在代碼層面,為被關(guān)聯(lián)的類B以類屬性的形式出現(xiàn)在類A中,也可能是關(guān)聯(lián)類A引用了被關(guān)聯(lián)類B的全局變量。
在Java中,關(guān)聯(lián)關(guān)系是使用實(shí)例變量來實(shí)現(xiàn)的
比如:學(xué)生與課程之間就是通過選課關(guān)系進(jìn)行關(guān)聯(lián)
特殊關(guān)聯(lián)關(guān)系,指明一個聚集(整體)和組成部分之間的關(guān)系
表示兩個類之間是“is part of”關(guān)系,即整體–部分關(guān)系。
是關(guān)聯(lián)關(guān)系的特例,是強(qiáng)的關(guān)聯(lián)關(guān)系,聚合是整個與個體的關(guān)系,即has-a關(guān)系,
此時整體和部分是可以分離的,他們具有各自的生命周期,部分可以屬于多個對象,也可以被多個對象共享
比如計(jì)算機(jī)和CPU,公司與員工的關(guān)系
在代碼層面聚合與關(guān)聯(lián)是一致的,只能從語義上來區(qū)分。
語義更強(qiáng)的聚合,部分和整體具有相同的生命周期
組合關(guān)系應(yīng)該是A類的屬性中含有一個B的對象;構(gòu)成has a關(guān)系
也是關(guān)聯(lián)關(guān)系的一種特例,體現(xiàn)的是一種contain-a關(guān)系,比聚合更強(qiáng),是一種強(qiáng)聚合關(guān)系。它同樣體現(xiàn)整體與部分的關(guān)系,但此時整體與部分是不可分的,整體生命周期的結(jié)束也意味著部分生命周期的結(jié)束
體現(xiàn)在代碼層面與關(guān)聯(lián)時一致的,只能從語義來區(qū)分。
它表示部分對象被嵌入到整體對象中。
比如:引擎是飛機(jī)的一部分;大腦和人類
在面向?qū)ο笾幸话惴Q為繼承關(guān)系,存在于父類與子類、父接口與子接口之間
關(guān)系時指一個類(子類、子接口)繼承另外一個類(稱為父類、父接口)的功能,并可以增加它自己新功能的能力,繼承是類與類或者接口與接口最常見的關(guān)系,在Java中通過關(guān)鍵字extends來表示
對應(yīng)于類和接口之間的關(guān)系
是指一個class實(shí)現(xiàn)interface接口(一個或者多個),表示類具備了某種能力,實(shí)現(xiàn)是類與接口中最常見的關(guān)系,在Java中通過implements關(guān)鍵字來表示。
表示類與類之間的連接,表示一個類依賴于另外一個類的定義,依賴關(guān)系時是單向的。簡單理解就是類A使用到了類B,這種依賴具有偶然性、臨時性,是非常弱的關(guān)系。但是類B的變化會影響到類A。
舉個例子,如某人要過河,則人與船的關(guān)系就是依賴,人過河之后,與船的關(guān)系就解除了,
因此是一種弱的連接。在代碼層面,為類B作為參數(shù)被類A在某個方法中使用。
在java中,依賴表現(xiàn)為:局部變量,方法中的參數(shù)和對靜態(tài)方法的調(diào)用。
泛化 = 實(shí)現(xiàn) > 組合 > 聚合 > 關(guān)聯(lián) > 依賴
對象圖是系統(tǒng)在某一時刻的快照。
部署圖描述系統(tǒng)資源運(yùn)行時的物理分布,系統(tǒng)資源成為結(jié)點(diǎn)
部署圖用于靜態(tài)建模,是表示運(yùn)行時過程節(jié)點(diǎn)結(jié)構(gòu)、構(gòu)件實(shí)例及其對象結(jié)構(gòu)的圖。
如果含有依賴關(guān)系的構(gòu)件實(shí)例放置在不同節(jié)點(diǎn)上,部署視圖可以展示出執(zhí)行過程中的瓶頸。
部署圖的兩種表現(xiàn)形式:實(shí)例層部署圖和描述層部署圖
部署圖與構(gòu)件圖相同的構(gòu)成元素:
構(gòu)件、接口、構(gòu)件實(shí)例、構(gòu)件向外提供服務(wù)、構(gòu)件要求外部提供的服務(wù)。
部署圖與構(gòu)件圖的關(guān)系:
部署圖表現(xiàn)構(gòu)件實(shí)例;
構(gòu)件圖表現(xiàn)構(gòu)件類型的定義。
部署圖偏向于描述構(gòu)件在節(jié)點(diǎn)中運(yùn)行時的狀態(tài),描述了構(gòu)件運(yùn)行的環(huán)境;
構(gòu)件圖偏向于描述構(gòu)件之間相互依賴支持的基本關(guān)系。
組件圖描述可重用的系統(tǒng)組件及組件間的依賴
構(gòu)件圖用于靜態(tài)建模,是表示構(gòu)件類型的組織以及各種構(gòu)件之間依賴關(guān)系的圖。
構(gòu)件圖通過對構(gòu)件間依賴關(guān)系的描述來估計(jì)對系統(tǒng)構(gòu)件的修改給系統(tǒng)可能帶來的影響。
用例圖描述執(zhí)行者在各個用例中的參與情況
用例圖的功能:
捕獲系統(tǒng)用戶需求
描述系統(tǒng)邊界
指明系統(tǒng)外部行為
指導(dǎo)系統(tǒng)開發(fā)者的功能開發(fā)
系統(tǒng)建模的起點(diǎn),指導(dǎo)所有的類圖和交互圖的設(shè)計(jì)
產(chǎn)生測試用例,用戶文檔
估計(jì)項(xiàng)目大小和進(jìn)度
狀態(tài)機(jī)圖是對單個類的對象的生命周期進(jìn)行建模,描述了對象時間上的動態(tài)行為,每個對象被認(rèn)為是事件驅(qū)動的孤立實(shí)體
事件表達(dá)對象間的調(diào)用、顯式信號、值的改變或時間的推移
調(diào)用事件、變更事件、信號事件、時間事件
狀態(tài)描述對象生命周期的一段時間,可以是等待其它事件時所處的時間,或是執(zhí)行某一活動時所處的時間,狀態(tài)分為簡單狀態(tài)和復(fù)合狀態(tài)
狀態(tài)圖用于揭示Actor、類、子系統(tǒng)和組件的復(fù)雜特性。 為實(shí)時系統(tǒng)建模。
狀態(tài)
對象的狀態(tài)是指在這個對象的生命期中的一個條件或狀況,在此期間對象將
滿足某些條件、執(zhí)行某些活動,或等待某些事件。
轉(zhuǎn)移
轉(zhuǎn)移是由一種狀態(tài)到另一種狀態(tài)的遷移。這種轉(zhuǎn)移由被建模實(shí)體內(nèi)部或外部事件觸發(fā)。
對一個類來說,轉(zhuǎn)移通常是調(diào)用了一個可以引起狀態(tài)發(fā)生重要變化的操作的結(jié)果。
活動圖是用狀態(tài)機(jī)對工作流進(jìn)行建模的特殊形式,它和流程圖很類似,不過它支持并發(fā)控制
活動圖一般不描述所有的運(yùn)算細(xì)節(jié),它顯示活動的流,但不顯示執(zhí)行活動的對象
活動圖處于系統(tǒng)的外部和內(nèi)部視圖之間,所以它可以作為設(shè)計(jì)的起點(diǎn),為了完成設(shè)計(jì),每個活動必須擴(kuò)展成一個和多個操作,每個操作被指派給特定的對象來實(shí)現(xiàn)
帶有生命線的活動圖和無生命線的活動圖
對象行為是通過交互來實(shí)現(xiàn)的,交互是對象間為完成某一目的而進(jìn)行的一系列消息交換
消息是對象間的單向通信,從發(fā)送者到接受者的攜帶信息的控制流消息可能帶有值參
消息序列可用兩種圖表示:序列圖(重點(diǎn)在消息的時間順序)和協(xié)作圖(重點(diǎn)在交換消息的對象間的關(guān)系)對協(xié)作圖來說,時間順序可以從順序號獲得
協(xié)作圖包含分類角色和關(guān)聯(lián)角色,當(dāng)它實(shí)例化時,對象被綁定到分類角色,鏈被綁定到關(guān)聯(lián)角色。
協(xié)作圖對實(shí)現(xiàn)協(xié)作的對象和鏈進(jìn)行建模,而忽略其他對象
協(xié)作圖是一種交互圖,強(qiáng)調(diào)的是發(fā)送和接收消息的對象之間的組織結(jié)構(gòu),使用協(xié)作圖來說明系統(tǒng)的動態(tài)情況。
協(xié)作圖主要描述協(xié)作對象間的交互和鏈接,顯示對象、對象間的鏈接以及對象間如何發(fā)送消息。
協(xié)作圖可以表示類操作的實(shí)現(xiàn)。
打開時序圖,Ctrl+A選中圖中的所有的元素,然后菜單上找到DESIGNE | Model Transformation (MDA) | Transform Selected Elements,在彈出的界面中右邊的Transformations 中選Communication, 再點(diǎn)擊 Do Transform 即可。
注釋用于解釋設(shè)計(jì)的思路,便于理解
一個好的模型應(yīng)該有詳盡的注釋
軟件模型必須是完整的,以便于軟件系統(tǒng)的建造。此模型必須具備足夠的詳細(xì)信息以供軟件建造使用。
構(gòu)成完整模型的詳細(xì)信息就是模型的規(guī)范說明(簡稱規(guī)范)
規(guī)范說明的內(nèi)容一般用屬性名和屬性值的形式來表達(dá)。UML中有許多預(yù)定義的屬性
如:文檔(documentation)、持續(xù)性(persistence)和并發(fā)性(Concurrency)等
屬性一般作為模型成分附加說明
比如,用一些文字逐條列舉類的功能,這種規(guī)范說明方式是非形式化的
修飾描述UML模型成分最主要的特征
UML模型中類:
“-”表示私有的(Private),
“+”表示公開的(Public),其他類可訪問,
“#” 表示受保護(hù)的(Protected)
UML擴(kuò)充機(jī)制(extensibility mechanisms):
版型(stereotype)、標(biāo)記值(tagged value)和約束(constraint)
UML是一種建模語言而不是方法,這是因?yàn)閁ML中沒有過程的概念,而過程正是方法的一個重要組成部分UML本身獨(dú)立于過程,這意味著用戶在使用UML進(jìn)行建模時,可以選用任何適合的過程
基于UML的系統(tǒng)開發(fā)采取增量迭代開發(fā)模型
需求
最初需求規(guī)格說明應(yīng)當(dāng)由代表系統(tǒng)最終用戶的人員提供,內(nèi)容包括系統(tǒng)基本功能需求和對計(jì)算機(jī)系統(tǒng)的要求
分析
分析的任務(wù)是找出系統(tǒng)的所有需求并加以描述,同時建立模型,以定義系統(tǒng)中的關(guān)鍵領(lǐng)域類,應(yīng)由系統(tǒng)用戶和開發(fā)人員合作完成
分析的第一步是定義用例,以描述所開發(fā)系統(tǒng)的外部功能需求用例分析包括閱讀和分析需求說明,此時需要與系統(tǒng)的潛在用戶進(jìn)行討論
設(shè)計(jì)
設(shè)計(jì)階段的任務(wù)是通過綜合考慮所有的技術(shù)限制,以擴(kuò)展和細(xì)化分析階段的模型
設(shè)計(jì)階段可以分為兩個部分:
1. 結(jié)構(gòu)設(shè)計(jì):是高層設(shè)計(jì),其任務(wù)是定義包(子系統(tǒng)),
包括包間的依賴性和主要通信機(jī)制我們希望得到盡可能簡單和清晰的結(jié)構(gòu),
各部分之間的依賴盡可能的少,并盡可能的減少雙向的依賴關(guān)系
2. 詳細(xì)設(shè)計(jì):細(xì)化包的內(nèi)容,使編程人員得到所有類的一個足夠清晰的描述
實(shí)現(xiàn)
構(gòu)造或?qū)崿F(xiàn)階段是對類進(jìn)行編程的過程可以選擇某種面向?qū)ο髮ο缶幊陶Z言(如Java)作為實(shí)現(xiàn)系統(tǒng)的軟件環(huán)境Java很容易實(shí)現(xiàn)從邏輯視圖到代碼部件的映射,因?yàn)轭惖絁ava代碼文件之間是一一映射關(guān)系
在實(shí)現(xiàn)階段中,可以選取各種圖的說明來輔助編程,比如:類圖,狀態(tài)圖和動態(tài)圖等
測試和配置
完成系統(tǒng)編碼后,需要對系統(tǒng)進(jìn)行測試,它通常包括:單元測試、集成測試、系統(tǒng)測試和驗(yàn)收測試
如果把軟件開發(fā)比作學(xué)校建一座高樓,那么軟件工程就是指導(dǎo)我們怎么蓋,不至于在構(gòu)建一座大樓的時候,最后不知不覺變成四不像。而UML圖正是對大樓主體架構(gòu)的設(shè)計(jì)。軟件工程是軟件開發(fā)設(shè)計(jì)的靈魂,是我們前進(jìn)的思想性指導(dǎo)。它使我們的設(shè)計(jì)有法可依,有章可循。比如我們學(xué)?,F(xiàn)在蓋的大樓,必須要有藍(lán)圖來規(guī)劃哪塊哪塊蓋什么樓,什么類別的都是前期需要用例建模來具體協(xié)商的。
具體步驟:
1.前期的需求分析描述需要用例圖,用例圖的使用者是學(xué)校,了解這棟大樓的主體結(jié)構(gòu),功能是什么,教學(xué)樓還是宿舍。學(xué)校最關(guān)心的是樓質(zhì)量問題和安全性,是否能夠滿足學(xué)生的基本使用。
2.進(jìn)一步需要設(shè)計(jì)樓內(nèi)部的具體結(jié)構(gòu),此時就需要類圖,對象圖,組件圖和部署圖來制定標(biāo)準(zhǔn)化的結(jié)構(gòu),詳細(xì)的描述內(nèi)部需求和具體設(shè)施的安排,為具體施工指明工作點(diǎn)。
3.接下來就需要安排具體的人員開工,活動圖安排各個工種在自己的崗位工作;狀態(tài)圖安排施工設(shè)備的使用情況,表明設(shè)備的忙碌和空閑狀態(tài);而具體施工步驟需要工程安排每一塊的開始,不能先上后下,從基地開始。
此外還需要各個施工隊(duì)的協(xié)作,連接性是這個工程的最后標(biāo)志,各個團(tuán)隊(duì)之間必須密切協(xié)作才能完成整體的。
用例圖用來建??蛻舻男枨蟆=巧约跋到y(tǒng)功能建模是用例建模來畫的。它們之間的關(guān)系建模被用于角色和用例。每個用例都代表了客戶的需求。需求分析不僅適用于軟件系統(tǒng)進(jìn)行而且適用于建筑工程行業(yè)。
此階段是尋找問題 -就是找刺的,需要考慮系統(tǒng)可能遇到的問題是主要的工作。借助于邏輯視圖和動態(tài)視圖實(shí)現(xiàn)。系統(tǒng)的靜態(tài)由類圖來建模,系統(tǒng)的動態(tài)則是協(xié)作圖、序列圖、活動圖和狀態(tài)圖建模。只是列出系列的問題和稍微一點(diǎn)解決思路,不作出詳細(xì)的解決方案。只是大方向上的做出引導(dǎo),提綱,具體細(xì)節(jié)需要下一階段結(jié)合實(shí)際分析。
將分析階段列出的問題進(jìn)行匯總,根據(jù)提綱作出具體、細(xì)節(jié)辦法。進(jìn)而把分析結(jié)果擴(kuò)展為技術(shù)層次的解決依據(jù),不在停留在文字方面,需要依靠用戶接口提供技術(shù)基礎(chǔ)結(jié)構(gòu)。數(shù)據(jù)庫在這個技術(shù)基礎(chǔ)結(jié)構(gòu)中,分析階段的領(lǐng)域問題類被嵌入在其中。構(gòu)造階段的詳細(xì)的規(guī)格說明是設(shè)計(jì)階段的結(jié)果。
把設(shè)計(jì)階段的類轉(zhuǎn)換成某種面向?qū)ο蟪绦蛟O(shè)計(jì)語言的代碼。只能在構(gòu)造階段實(shí)現(xiàn)代碼的轉(zhuǎn)變,其他階段不能!在對UML表述的分析和設(shè)計(jì)模型進(jìn)行轉(zhuǎn)換時,最好不要直接把模型轉(zhuǎn)化成代碼。在早期階段,模型是理解系統(tǒng)并對系統(tǒng)進(jìn)行結(jié)構(gòu)化的手段。
根據(jù)測試的先后順序排序:單元測試、集成測試、系統(tǒng)測試和接受測試。不同的測試采用不同的UML圖作為工作的基礎(chǔ)。類圖和類的規(guī)格說明是單元測試;組件圖和協(xié)作圖的是集成測試;系統(tǒng)測試實(shí)現(xiàn)用例圖來確認(rèn)系統(tǒng)的行為符合這些圖中的定義。
在系統(tǒng)測試階段,UML模型還可以作為測試階段的依據(jù)。如單元測試使用類圖和類規(guī)格說明;集成測試使用組件圖和協(xié)作圖;系統(tǒng)測試用例圖來驗(yàn)證系統(tǒng)的行為;驗(yàn)收測試由用戶進(jìn)行,以驗(yàn)證系統(tǒng)測試的結(jié)果是否滿足在分析階段確定的需求。