類是一種對本質相同事物的抽象,人類軟體開發技術的發展曆史,就是還事物以本源的曆史,開發技術、名詞越來越接近世界的真實,“物件導向”、“類”就是這樣的產物。
1類圖
在UML中,類圖顯示了一組類、介面、協作以及它們之間的關係。在UML的靜態機制中類圖是一個重點,它不但為設計人員所關心,更為實現人員所關注,建模工具也主要依據類圖來產生代碼(正向)工程。因此,類圖在UML的各種圖中佔據了相當重要的地位。
類
在類圖中類用矩形框來表示,它的屬性和操作分別列在分格中,若不需要表達詳細資料時,分格可以省略。一個類可能出現在好幾個圖中。同一個類的屬性和操作只在一種圖中列出,在其他圖中可省略。圖1給出Student類。
圖1類的表示
類間關係
在類圖中,除了需要描述單獨的類的名稱、屬性和操作外,我們還需要描述類之間的聯絡,因為沒有類是單獨存在的,它們通常需要和別的類協作,創造比單獨工作更大的語義。在UML類圖中,關係用類框之間的連線來表示,連線上和連線端頭處的不同修飾符表示不同的關係。類之間的關係有繼承(泛化)、關聯、彙總和組合。
(1)繼承:指的是一個類(稱為子類)繼承另外的一個類(稱為基類)的功能,並增加它自己的新功能的能力,繼承是類與類之間最常見的關係。類圖中繼承的表示方法是從子類拉出一條閉合的、單鍵頭(或三角形)的實線指向基類。例如,圖2給出了students類和學校中某團社成員a_member的繼承關係。
圖2 類的繼承
類的繼承在C++中呈現為:
class B { }
class A : public B{ }
(2)關聯:指的是模型元素之間的一種語義聯絡,是類之間的一種很弱的聯絡。關聯可以有方向,可以是單向關聯,也可以是雙向關聯。可以給關聯加上關聯名來描述關聯的作用。關聯兩端的類也可以以某種角色參與關聯,角色可以具有多重性,表示可以有多少個對象參與關聯。可以通過關聯類別進一步描述關聯的屬性、操作以及其他資訊。關聯類別通過一條虛線與關聯串連。對於關聯可以加上一些約束,以加強關聯的含義。
關聯在C++中呈現為:
class A{...}
class B{ ...}
A::Function1(B &b) //或A::Function1(B b) //或A::Function1(B *b)
即一個類作為另一個類方法的參數。
(3)彙總:指的是整體與部分的關係。通常在定義一個整體類後,再去分析這個整體類的組成結構。從而找出一些組成類,該整體類和組成類之間就形成了彙總關係。例如一個汽車包括輪胎和發動機等。需求描述中“包含”、“組成”、“分為…部分”等詞常意味著彙總關係。
圖3 類的彙總
(4)組合:也表示類之間整體和部分的關係,但是組合關係中部分和整體具有統一的生存期。一旦整體對象不存在,部分對象也將不存在。部分對象與整體對象之間具有共生死的關係。
彙總和組合的區別在於:彙總關係是“has-a”關係,組合關係是“contains-a”關係;彙總關係表示整體與部分的關係比較弱,而組合比較強;彙總關係中代表部分事物的對象與代表彙總事物的對象的生存期無關,一旦刪除了彙總對象不一定就刪除了代表部分事物的對象。組合中一旦刪除了組合對象,同時也就刪除了代表部分事物的對象。
我們用淺顯的例子來說明彙總和組合的區別。“國破家亡”,國滅了,家自然也沒有了,“國”和“家”顯然也是組合關係。而相反的,電腦和它的外設之間就是彙總關係,因為它們之間的關係相對鬆散,電腦沒了,外設還可以獨立存在,還可以接在別的電腦上。在彙總關係中,部分可以獨立於彙總而存在,部分的所有權也可以由幾個彙總來共用,比如印表機就可以在辦公室內被廣大同事共用。
在C++語言中,從實現的角度講,彙總可以表示為:
class A {...}
class B { A* a; .....}
即類B包含類A的指標;
而組合可表示為:
class A{...}
class B{ A a; ...}
即類B包含類A的對象。
準確的UML類圖中用空心和實心菱形對彙總和組合進行了區分。
圖4組合
圖5 銀行管理系統類圖
圖3.5給出了一個銀行管理系統的類圖,基本上一看就懂:
銀行類彙總了帳號庫(AccountSet)、客戶庫(CustomerSet)和員工庫(EmployeeSet);
帳號庫中包含了n個帳號(account)、客戶庫中包含了n個客戶(customer),員工庫包含了n個員工(employee);
員工類和客戶類都繼承自人(person)類,而員工類中又有一種特殊的員工,即員工管理者類(employeeAdmin);
帳號類和客戶類之間體現出一種關聯關係;
接下來,我們給出建立類圖的步驟:
(1)研究分析問題領域確定系統需求;
類的識別是一個需要大量技巧的工作,尋找類的一些技巧包括:名詞識別法;根據用例描述確定類;使用CRC分析法;根據邊界類、控制類、實體類的劃分來協助分析系統中的類;參考設計模式確定類;對領域進行分析或利用已有領域分析結果得到類;利用RUP中如何在分析和設計中尋找類的步驟。
(2)確定類,明確類的含義和職責、確定屬性和操作;
(3)確定類之間的關係。
2對象圖
對象圖顯示某時刻對象和對象之間的關係,是類圖的變化,一個對象圖可看成一個類圖的樣本(example),對象圖表示的是類的對象執行個體而不是真實的類。由於對象存在生命週期,因此對象圖只能在系統某一時間段存在。
對象圖中並無新的標記法(除了對象名下要加底線以外),與類圖中的標記法一樣,可以認為,只有對象而無類的類圖就是一個“對象圖”。
圖6 對象圖
在對象圖中,對象名可以有三種表示形式:
(1)對象名:類名
(2):類名
(3)對象名
圖6中的是第1種,即“對象名:類名”格式。
實質上,對象圖幾乎很少被用到(它包含的資訊量太小,僅僅用於呈現某一時刻對象的值,對軟體的設計幾乎沒有太大的協助),使用遠沒有類圖廣泛。我們可以這樣類比類圖和對象圖之間的關係:
“動詞+名詞”構成“動名詞”,例如動詞“愛”+名詞“國”構成動名詞“愛國”。
我們可以看到,“動名詞”的資訊量很大,很抽象,而作為動名詞的例子的“愛國”資訊量很小,具體程度很高。
動名詞 ―――――> 類圖
愛國 ―――――> 對象圖
把“動名詞”看作類圖,把“愛國”看作對象圖,很明顯,對象圖就是類圖的一個example而已。