軟件工程項目這周要交一個設計文檔,其中涉及UML圖的畫法,根據上課給的ppt做一個記錄。
有關於UML的介紹在這里不再贅述,直接開整!
UML的基本模型
當然必要的介紹必不可少,這里先介紹UML的基本模型,之后的介紹將按照下圖的順序進行。
之后簡單介紹一下面向對象的程序設計原則。這部分是我對之前知識的一個復習,想看UML的朋友可以直接跳到下一章。
對象
對象的概述
對象是包含現實世界物體特征的抽象實體,它不僅表示具體的事物,還可以表示具體的規則或者事件。舉個例子,公費醫療報銷系統中的報銷用戶就是一個對象。
對象具有狀態,也就是對象還擁有屬性。舉例來說,報銷用戶有姓名、年齡、單位等等狀態。
對象中還包括操作,我們稱之為方法,操作用來改變對象的狀態。舉例來說,報銷用戶中的操作可能是對自己個人信息的修改。
對象的分類
對象大體可以分為5類:分別是物理對象,角色,事件,交互和規格說明。
-
物理對象
多表示現實生活中最容易被抽象的對象,比如報銷系統中的某個單位的學生或者老師就是物理對象; -
角色
舉例來說,報銷系統中,某個單位的學生老師的角色都是報銷用戶。 -
事件
這里的理解不太確定,個人理解是事件對象的作用是對出現的事件相關的狀態進行存儲,以便后續操作中讀取。 -
交互
交互表示兩個對象之間的關系。它的實際應用是在實體之間是多對多的關系時,使用交互對象可以簡化為兩個一對多的關系。個人理解,交互關系在Java中表現為interface,它可以防止在不同的類中多次實現相似的方法。 -
規格說明
表明組合某些實體時的要求,可以理解為config項。
封裝,繼承與多態
我們在面向對象中廣泛提到的類,其實可以理解為人為定義的、使計算機構造對象的規則。這里介紹的封裝,繼承與多態是比較籠統的,之后會專門寫一篇隨筆介紹(咕咕咕?)
封裝
使用抽象數據類型將數據和基於數據的操作封裝在一起。借用一個上課的例子,對於一個智能手機,大多數用戶只需要學習如何使用手機即可,不需要學習如何維修手機,所以有關手機維修的屬性和操作就不必對用戶公開。
Java提供了四種控制修飾符控制方法和屬性訪問的權限:
-
public:對外公開
-
protected:對子類課同一個包中的類公開
-
private:只有類本身可以訪問,不公開
-
沒有修飾符號:向同一個包的類公開
理論上一個優秀的面向對象設計,類屬性應均為private
繼承
最主要的是解決代碼復用問題,當多種對象有相似的屬性和方法時,要從這些類中盡可能的抽象出父類,父類中定義這些相同的屬性和方法,子類只需要定義自己獨有的屬性和方法即可。Java中使用extends語句實現繼承。
多態
多態的知識在這里不進行介紹,詳見另一個隨筆(咕咕咕?)
UML的事物
事物是模型中最具代表性的部分的抽象。
結構事物
結構事物是UML模型的靜態部分,包括類,主動類,接口,對象,用例,參與者,協作,構件,節點等等。
- 類:下圖表示了一個類。
-
主動類(活動類):實例應為一個或多個進程或線程,可以和其他類元素的行為並發工作。
-
接口:描述了類或組件對外的,可見的操作,是一組操作的描述,而不是具體實現。
-
對象:類的實例,其名字應加上下划線,對象的屬性需要明確給出。
-
用例:描述一組動作序列,表示系統想要實現的行為。
-
參與者:也叫角色,表示與系統有信息交互的部分,可以是人,軟件,硬件等等。
-
協作:描述一組角色實體和其他實體如何通過協同工作完成一個功能或行為。
-
構件(組件):描述一些邏輯元素的物理包。
-
節點:代表一種可計算的資源,通常具有記憶能力和處理能力。
行為事物
行為事物是UML模型的動態部分,包括交互和狀態機兩部分。
-
交互:交互由在特定的上下文環境中完成一定任務的一組對象之間傳遞的消息組成。
-
狀態機:描述一個交互或者一個對象在生存周期內響應事件所經歷的狀態序列以及記錄他們對事件的響應。說人話就是描述一組類之間的協作行為。
分組事物
分組事物是包,包把模型元素組織成組。
注釋事物
解釋UML模型的任何UML元素
UML的關系
總的關系表示如圖所示。接下來依次介紹:
泛化關系
泛化是一般類和特殊類之間的繼承關系。注意,泛化所針對的是類並不是類的實例。進一步的,泛化可進一步划分為普通泛化和受限泛化。
一個小技巧,泛化關系可以表示為is-a,即SUV is a car,那么car就是SUV的一個泛化。
-
普通泛化:允許單繼承和多重繼承。
-
受限泛化:一般存在四種約束,交叉(overlapping)、不相交(disjoint)、完全(complete)和不完全(imcomplete)。
實現關系
implement是泛化關系與依賴關系的結合,強調繼承一個抽象類(abstract或者interface),而泛化關系繼承一個具體類。
關聯關系
描述了兩個或者多個類的治理之間的連接關系。可以分為普通關聯,限定關聯,關聯類,聚合以及導航。
-
普通關聯:
是最常見的關聯關系。又可以分為二元關聯和多元關聯。二元關聯的多重性描述了一個關聯兩端的類實例個數的對應關系。關聯端點出還可以附加角色名,同時也允許類自身關聯。多元關聯指三個或者三個以上的類之間的關聯。
-
限定關聯:
限定關聯通常用在一對多或者多對多的關聯關系中,可以把多重性從一對多變成一對一,或把多對多簡化為多對一。具體實現方式就是把限定詞放在關聯關系末端。 -
關聯類:
需要對關聯關系進行詳細的定義,這時使用關聯類。 -
聚合:
聚合是一種特殊的關聯,描述了整體與部分之間的關系。大體可以分為共享聚合以及復合聚合。共享聚合:部分實例可以同時參與多個整體實例的構成。舉例來說,一個演員可以同時在多個劇組中。演員和劇組構成共享聚合。
復合聚合:部分實例完全依賴於整體實例,即部分實例與整體實力共存。舉例來說,一個窗體中的按鈕與窗體的關系就是復合聚合。
-
導航:
導航是關聯關系的一種特性,通過關聯的一個端點上加箭頭表示導航方向。通俗理解就是可以由一個類的對象得到另一個類的全部對象。
依賴關系
描述兩個事物之間的語義關系,其中一個事物發生變化會影響另一個事物的語義。通俗地講,一個類的實現需要另一個類的協助,舉例來說,現代人這個類依賴計算機這個類。
UML圖
啊累死了。。。雖然說不講理論,還是扯了這么多QAQ。現在正式開始!下圖清晰的展示了UML圖之間的關系。
用例圖
最基本,最好畫的圖!描述了執行者所理解的系統功能。多用於需求分析階段。在UML中,一個用例模型由若干個用例圖來描述,用例圖的主要元素是用例和執行者。
用例圖是包括執行者、由系統邊界(一個矩形)封閉的一組用例,執行者和用例之間的關聯、用例間關系以及執行者的泛化的圖。
用例(use case)是對系統如何反應外界請求的描述,是一種通過用戶的使用場景來獲取需求的技術。
用例之間可以有泛化、擴展、使用(包含)三種關系。
泛化關系可以理解為OO中的繼承,某些子用例與父用例大體上相似,只有一些地方有差異。
擴展關系其實是細化功能的一個表現,這里還是舉個例子,比如系統支持用戶導出或者打印查詢到的記錄,這里不管是導出還是打印,其查詢操作都是一樣的,因此這兩個用例就可以作為查詢這個用例的擴展用例。
包含關系是為了防止系統功能的過細設計。舉例來說,比如我們要維護一個數據庫,我們可以設計增刪查改四個用例,但是在一個大系統中這樣用例划分太細了,所以可以把維護數據庫作為一個用例,而增刪查改作為其中包含的四個用例。
其實我們可以看到,這三種關系之間的界定不是很清楚,有人從用例關系優化側重點這個角度進行了區分:
-
泛化側重子用例之間的互斥
-
包含側重表示被包含用例對Actor提供服務的間接性
-
擴展側重表示擴展用例的觸發不確定性(個人理解擴展關系不會影響系統的正常工作,屬於錦上添花的用例)
在拿到兩個用例時,用這三個問題去判斷即可。下面是根據本次軟工項目畫的UML用例圖。
類圖
類圖描述類和類與類之間的靜態關系,它是從靜態角度表示系統的,因此類圖屬於一種靜態模型。類圖是構建其他圖的基礎,沒有類圖就沒有狀態圖、協作圖等其他圖,也就無法表示系統其他方面的特性。
在類的建模中可以使用關聯、聚合和泛化(繼承)關系。
順序圖
順序圖描述對象之間的動態交互關系,着重表現對象間消息傳遞的時間順序。
狀態圖
狀態圖描述一個特定對象的所有可能的狀態以及引起狀態轉換的事件。大多數面向對象技術都用狀態圖表示單個對象在其生命期中的行為。一個狀態圖包括一系列狀態、事件以及狀態之間的轉移。
構件圖&部署圖
啊真的是被這個東西搞蒙了。。。我現在都不知道自己在畫啥了QAQ。
總結
理論果然還是看不懂,還是得上手實操才有效。。。文中的UML圖難免出錯,還請不吝賜教!
啊是真的難受,明天又要早起。。。