K、物件資料結構塑模 ~類別圖與物件圖 類別 類別圖 物件圖 物件資料結構塑模 執行、實作觀點的類別種類 能見度(Visibility) 類別間之關係 相依 一般化 關聯 實現化 物件圖 物件資料結構塑模
1. 類別(Class) 一群相關物件的定義、描述或樣版 類別具有名稱、屬性與操作,同一類別之物件具有相同屬性與操作 類別封裝了屬性及操作
類別與物件的關係 類別(Class):物件的設計藍圖 物件(Object):根據類別所建造出來的實體 (Instance) class Customer { String User = “Robert”; String Pass = “1234”; function Login(User, Pass) …… } }; Robert = new Customer Peter = new Customer Lisa = new Customer
類別圖與物件圖 類別是物件導向軟體系統的核心 類別圖(Class Diagram) 物件圖(Object Diagram) 物件導向的資料結構塑模工具 類似傳統資料庫的ERD ,但是ERD是針對資料來做設計,並非以物件導向的觀點來設計 描述軟體系統靜態結構的類別和類別關係 物件圖(Object Diagram) 是類別圖的實例(Instances),用於描述一系統於某時間點的靜態結構 一棟房子的藍圖就好比是類別;而依據藍圖所蓋出的房子就是實例。 由類別所建構出來的實例稱為物件
2.類別圖 實例
實例:ATM自動櫃員機系統的 類別圖
2.1 執行觀點的類別種類 永存類別(Persistent Class)─當程式執行後,該物件之資料需被儲存在資料庫者 暫存類別(Transient Class)─ 當程式執行後,該物件之資料不需被儲存在資料庫且該物件會被刪除者
2.2 實作觀點的類別種類 實體類別(Entity Class) 介面類別(Boundary Class) 以企業的領域術語命名,通常表示使用個案完成後仍需儲存在資料庫中的資料(永存類別)。 介面類別(Boundary Class) 也稱邊界類別,包含表單、報表、硬體介面以及其他和系統溝通的介面。 程式執行完畢後,介面類別之物件都將被刪除(暫存類別)。 控制類別(Control Class) 屬於暫存類別,負責協調其他類別的工作,傳送訊息給其他類別,或是將工作指派給其他類別。 一個使用個案至少需搭配一個控制類別,藉由控制類別來控制使用個案中各項事件的發生順序。
2.3 能見度(Visibility) 物件導向所提供的封裝機制 公共的(Public):所有的物件都可以存取與設定它的值 保護的(Protected):只有子類別可以存取與設定它的值 類別庫(Package):只有相同類別庫之類別可以存取與設定它的值 私有的(Private):只屬於它自己,任何其他的類別都不可以存取它
2.4 類別間之關係 對於領域中的問題,會藉由許多的物件一起合作以提供解答。因此,塑模類別之間的關係是類別圖很重要的工作。
2.4.1 相依關係(Dependency) 是一種「使用」的關係 表示一個類別會用到其他類別,且被使用之類別的改變可能會影響使用它的類別,但反之則不必然。 以虛線箭頭由使用類別指向被使用類別,如下圖為Class A相依於Class B
相依關係 import B; public class A { public void method1(B b) { // . . . } // . . . } public void method2() { B tempB = new B(); }
相依關係實例 Window(視窗)類別使用Event(事件)類別 Event 類別的更改會影響Window 類別的操作,即Window 類別上的操作行為會依照Event 類別不同的行為而改變。 例如滑鼠在Window 類別開啟(Open)或移動(Move)等按鈕點選事件(Event),會使此Window 類別產生不同的操作行為。
2.4.2 一般化關係(Generalization) 父類別的所有特徵、性質及操作,都會自動被子類別所繼承。 子類別不需再去定義它們,就可以自動擁有 畫法:一條空心三角形的直線,從子類別連接到父類別 public class Parent{//} public class Child extends Parent{//}
一般化關係實例
2.4.3 關聯關係(Association) 代表建立類別之間彼此互通訊息的管道,物件與物件間才可以互相傳遞訊息,完成所需的工作。 聯關係之表達符號為實線。
關聯關係 意謂一類別之物件知道另一類別之物件的存在,或用到另一類別之物件的服務,但不是擁有此服務。 例如人扮演車子之駕駛者:一類別之物件(人)知道另一類別之物件(車子)的存在,且(人)使用到(車子)的服務,故人與車子間有關聯關係
程式碼看關聯關係 例如:航班跟飛機之間的關聯關係 一架飛機會有它所屬的指定航班,而一個航班也會指派某一架飛機來飛航。 它的對應程式碼則為: public class Flight {private AirPlane assignedPlane;} public class AirPlane {private Flight assignedFlight;}
關聯關係的互通性(Navigability) 關聯若沒有箭號,表示雙向關係 若在類別間之關聯加上箭頭便表示具有互通性,即可依箭頭方向找到另一端之資訊。 例如一個訂單可有許多訂購項目;給定一個訂單,可以找出訂購項目,但訂購項目不需要知道它是屬於哪個訂單。
關聯關係的名稱 關聯關係不一定要命名,但若語意不清,例如人跟車子可以有:人擁有車、人開車、人租車等關係,可加上名稱
關聯關係的命名 常用的命名方式有兩種: 描述關係的本質:可用動詞或動詞片語表達,如「人」駕駛「車子」 描述角色:可用名詞或名詞片語表達,例如 「人」是「車子」的駕駛人
關聯關係的多重性(Multiplicity) 在一個關聯關係中,常需表達有多少物件參與(參與此關係之物件的數量),此種資訊與ERD的基數(Cardinality)表達相同。 名稱 表法 例子 恰好一個 1 一個系有一個系主任 零個或是更多 0⋯* 教師有零個或是多個行政工作 一個或是更多 1⋯* 學生主修一個或是多個學位 零或是一個 0⋯1 教師有一個或是零個計畫補助 指定範圍 2⋯4 職員一年可以享有兩個到四個假期
關聯關係的多重性之實例 假設一個學生可以修1到5門課程;一門課程可能沒有人修(0)或是有很多人修(*);老師可教導一門以上的課 程;或是一門課程只有1位老師
關聯類別 若兩個類別有關聯關係且其基數為多對多,則該關係可能會有屬性,此屬性以關聯類別表示。
聚集(Aggregation) 與組合(Composition) 均是關聯關係的一種特定變異。 兩者之相同點: 描述整體與其組件之關係 is-part-of; has a; has parts… 均表達一個「較大」類別之物件(整體),是由另一些「較小」類別之物件(組件)所組成。
聚集與組合 組合有較強的限制 表示方式 例如組合之整體很強地擁有其組件,當整體之物件被複製或刪除,則其所有組件也會被複製或刪除。 亦即組合關聯的組件不能單獨存在,而聚集的組件可單獨存在。 表示方式 聚集:以一個空心的菱形表示整體的一方 組合:以一個實心的菱形表示整體的一方
聚集與組合實例 一部車子可以有多個輪胎,雖然輪胎屬於車子,但輪胎也可以單獨存在→聚集 一張發票擁有多個發票項目,但當該發票被刪除時,其所屬的所有發票項目也須一併刪除,因為若無該發票,則其發票項目就毫無意義→組合 車子 輪胎 有 * 1 (聚集) 發票 發票項目 (組合)
聚集與組合實例 一個球隊有許多球員構成,球隊如果解散,球員還可以到別的球隊打球→聚集 一本書包含有很多章節,如果書沒了,章節也就沒意義了→組合 public class Team {private Player[] players;} public class Player{// 屬性}
關係的強弱
2.4.4實現化關係(Realization) 表達某一類別的行為是由另一介面類別來描述定義。 「繼承」是應用在關係密切(is a)的類別中,例如「卡車」繼承「車子」(Truck is a car)。 「實現化」可用在毫無關係的類別中,例如「文書處理」及「資料備份」皆會用到「存檔」功能,只要將存檔的功能定義在「存檔介面」中,「文書處理」和「資料備份」皆遵循「存檔介面」的定義,即可避免不一致
實現化關係 在Java中,它是用implements來表示 public class ClassA implements interfaceA { // }
3.物件圖(Object Diagram) 以類別圖為基礎,表現系統在某一時間點上,各類別之物件靜態結構與內部資訊之案例(即各物件之合作關係),但不表達物件間之訊息傳遞等其他資訊。
物件圖實例
4.物件資料結構塑模 主要活動包括: 這些活動常以某順序反覆地執行。 原則上,一個使用個案須建立一個類別圖 找出類別(或物件)及其屬性與操作 確認類別間之關係 建構類別圖與物件圖 這些活動常以某順序反覆地執行。 原則上,一個使用個案須建立一個類別圖 可從使用個案來分析系統所包含之類別(包含名稱、屬性與操作)、類別間之關係等以建構類別圖。
4.1 找出類別及其屬性與操作 概念的擷取可以從以下幾個方向來尋找: 需求分析文件內容、詞彙表 使用個案文件內容、詞彙表 企業表單, 報表 領域相關知識 類似的系統 專家已建立之企業模型
名詞分析法 從相關需求文件中,找出名詞或名詞片語的概念(Concepts),這些都是可能的候選類別或屬性: Step 1:從事件表和使用個案的描述中,找出所有的名詞和名詞片語 Step 2:直接觀察、請教領域專家,或從現有系統、流程、表單等資料來源找出更多的名詞和名詞片語 Step 3:將名詞和名詞片語區分為概念或屬性,刪除不相關的概念,剩下的概念就是類別 Step 4:針對每一個概念找出重要的屬性
尋找類別實例 線上的電影院購票系統, 可能有的概念包含:
尋找類別實例 線上音樂CD購物系統, 可能的概念包含:
分辨類別與屬性的原則 如果可以使用單一值的字串或數值來表示,就表示它是屬性,否則可能是類別 例如【管理者】名詞代表姓名和薪水等多種資訊,不可能使用單一值來表示,所以它是概念;而管理者【姓名】是單一值的字串,所以是屬性。 如果找出的概念,可以儲存資訊或提供服務,它多半是類別,而不是屬性 例如【車輛】名詞可以提供開車服務,所以它是類別。 當無法明確區分概念或屬性,或仍有些疑慮時,先將它視為概念,建立成類別。
類別與屬性實例 ATM自動櫃員機系統【提款】使用案例, 可能的概念包含: 屬性
確認操作 操作是描述類別的主要行為或責任。 若使用個案之情節是以事件條列式描述,採用(主詞)+動詞+受詞的方式,且條列中之主詞或受詞是類別,則其中的動詞就可能是類別之操作。 原則上,類別圖之操作描述,主要描述系統之行為,盡量避免描述其細部之程式邏輯 因為這些程式邏輯在設計階段經常會再修改,因此類別圖之操作描述其實可以直接從使用個案之描述中摘錄過來。
4.2 確認類別間之關係
確認類別間之關係準則 某一類別會用到其他類別,且被使用類別的改變可能會影響使用它的類別,則這兩類別間可能有相依關係 某一類別(稱子類別)僅具有另一類別(稱父類別)之某些特定性質,例如屬性與操作,則兩類別間可能有一般化關係。 某一類別之物件知道另一類別之物件的存在,或一類別之物件使用到另一類別之物件的服務,但並未擁有此服務或訊息(或彼此間有訊息之溝通),則這兩類別間可能有關聯關係。
確認類別間之關係準則 關聯關係中,若某一方由另一方聚集而成,則兩者間可能為聚集或組合的關聯關係。 關聯關係中,若兩類別間的關係為多對多關係則需於關聯上建立關聯類別,由兩類別中找出需由兩類別之資料共同唯一決定的屬性作為關聯類別的屬性。 若某一類別之行為是由另一類別來描述,則這兩類別間可能建立實現化關係。
4.3 繪製類別圖 可分為繪製各使用個案之類別圖、總類別圖兩部分。 先以一個使用個案為單位,找出該使用個案之類別、屬性與操作後,建構各使用個案之類別圖 最後再整合各使用個案中類別、屬性和操作以及類別間關係之資訊,建構總類別圖。
繪製類別圖 然而一個類別可參與一至多個使用個案,且同一類別在不同使用個案可能有不同的特徵或行為。 可採用類別與使用個案對照表將該類別分散在不同使用個案的屬性與操作彙整在一起:
實例:新增訂購項目使用個案之類別圖
修改訂購項目使用個案之類別圖
刪除訂購項目使用個案之類別圖
取消訂購項目使用個案之類別圖
確認採購訂單使用個案之類別圖
便當王公司網路訂購系統之 彙總類別圖
物件圖繪製
結論 物件結構塑模是物件導向系統分析與設計過程中很重要的一環 主要應用類別圖與物件圖來表達一個系統類別間之靜態結構關係及類別內部之屬性與操作。 基本上,進行物件結構塑模時,每個使用個案須建立一個類別圖,當每個使用個案類別圖完成後,需將各類別圖整合成一個完整的彙總類別圖。