第4章 物件導向分析與設計簡介 4-1 物件導向的軟體系統開發 4-2 物件導向分析與設計 4-3 UML的物件導向分析與設計 4-4 使用SIM執行UML塑模
4-1 物件導向的軟體系統開發 4-1-1 傳統的軟體系統開發 4-1-2 物件導向的軟體系統開發 4-1-3 為什麼使用物件導向的軟體系統開發
4-1-1 傳統的軟體系統開發-說明 傳統的軟體系統開發是將資料和操作分開來思考,著重於如何找出解決問題的程序或函數,即演算法。例如:一家銀行的客戶甲擁有帳戶A和B兩個帳戶,客戶甲在查詢帳戶A的餘額後,從帳戶A提出1000元,然後將1000元存入帳戶B。傳統應用程式開發建立的模型,如下圖所示:
4-1-1 傳統的軟體系統開發-函數呼叫 在主程式main()是一序列的函數呼叫,首先呼叫getBalance()函數查詢帳戶A的餘額,參數是帳戶名稱,然後呼叫withdraw()函數從帳戶A提出1000元後,呼叫deposit()函數將1000元存入帳戶B,如下所示: getBalance(A); withdraw(A, 1000); deposit(B, 1000);
4-1-2 物件導向的軟體系統開發-說明 物件導向的軟體系統開發是將資料和操作一起思考,其主要工作是找出參與物件和物件之間的關係,並且透過這些物件的通力合作來解決問題。 例如:針對上一節相同的銀行存提款問題,使用物件導向軟體系統開發建立的模型,如下圖所示:
4-1-2 物件導向的軟體系統開發-物件集合 物件導向軟體系統開發因為是將資料和操作一起思考,所以帳戶物件除了餘額資料外,還包含處理帳戶餘額的相關方法:getBalance()、withdraw()和deposit()方法,如下圖所示:
4-1-3 為什麼使用物件導向的軟體系統開發- 說明 物件導向的軟體系統開發可以輕鬆擴充現有系統來建立出大型的軟體系統,不同於傳統軟體系統開發建立的系統,當成長到一定尺寸後,就會快速增加系統的複雜度,讓開發者很難了解、撰寫、維護和擴充軟體系統。 換句話說,相同尺寸的大型軟體系統如果使用物件導向方法,將比傳統方法建立的軟體系統來的容易了解、撰寫、維護和擴充。
4-1-3 為什麼使用物件導向的軟體系統開發- 原因 對應真實世界的物件:物件導向軟體系統是模擬真實世界的物件,而不是內部的資料結構,開發者可以很容易了解和維護別人建立的軟體系統。 資訊隱藏(Information Hiding):物件導向軟體系統是一個物件集合,每一個物件包含資料和處理資料的函數,將實際處理的資料隱藏起來,稱為封裝(Encapsulation)。當我們升級或維護軟體系統時,更改的物件是獨立單位,並不會影響到軟體系統的其他部分。 軟體元件的模組(Modularity):每一個物件都是可重複使用的軟體元件,如同電腦硬體的隨插即用(Plug and Play),將物件一一插入,就可以組合成軟體系統。不只如此,我們還可以擴充軟體元件的物件,輕鬆使用在其他專案來快速開發軟體系統。
4-2 物件導向分析與設計 4-2-1 物件導向分析 4-2-2 物件導向設計 4-2-3 物件導向程式設計
4-2 物件導向分析與設計-說明 物件導向程式設計是一種更符合人性化的程式設計方法,它是使用物件來模擬現實生活的世界,因為我們本來就是生活在物件的世界,思考模式也是遵循著物件導向方式。 請注意!物件導向分析與設計的分野並不十分清楚,因為使用的方法論不同,系統開發者可以自行依需要或實際情況來決定其範圍,在這一節筆者區分物件導向分析和設計的目的只是為了教學上的考量。 筆者準備使用學生選課的一個簡單實例來說明物件導向分析、設計與程式設計的基本過程,在本書後各章節筆者會進一步說明物件導向分析、設計和搭配各種UML圖形建立的模型。
4-2 物件導向分析與設計-問題 學生選課問題的描述 學生在輸入學號進入系統後,顯示學生可選的課程清單,學生在選擇指定課程後,系統檢查該課程是否已滿,如果未滿,就註冊該課程,並且繼續選課,直到學生結束選課為止。
4-2-1 物件導向分析-說明 物件導向分析(Object-Oriented Analysis,OOA)強調如何從問題領域(Problem Domain)的描述建立使用案例模型(Use Case Model),然後識別出物件,在抽象化成類別後建立領域模型(Domain Model),最後指定類別責任來建立概念模型(Conceptual Model)。
4-2-1 物件導向分析-主要步驟 在物件導向分析階段並不用考量實作細節,我們主要是找出系統功能和服務,以便能夠作出對的事情。事實上,物件導向分析就是在回答下列問題,如下所示: 軟體系統能做什麼事? 在軟體系統中有哪些類別? 每一個類別負責什麼? 上述三個問題對應物件導向分析的三個主要步驟:建立使用案例模型(第1個問題)、建立類別(第2個問題)和指定責任(第3個問題)。
4-2-1 物件導向分析- 建立使用案例模型(使用案例圖) 在需求階段找出系統需求的功能與服務後,我們就可以建立使用案例模型(Use Case Model),包含使用案例圖(Use Case Diagram)和使用案例規格(Use Case Specification)。使用案例圖是使用圖形化表示從問題領域擷取的系統功能,例如:學生選課的使用案例圖,如下圖所示:
4-2-1 物件導向分析- 建立使用案例模型(使用案例規格) 例如:【選課】使用案例的使用案例規格,如右所示:
4-2-1 物件導向分析- 建立類別 在建立類別(Creating Classes)步驟是使用清單方式列出系統所有可能的物件,然後將它抽象化成類別,稱為候選類別(Candidate Classes)。在作法上,我們可以從使用案例規格描述中,一一識別出可能的物件後,再抽象化成類別,在第10章有進一步的說明。 從候選類別的清單中,我們可以選出系統真正需要的類別,刪除哪些不屬於系統的類別(可能只是屬性)。例如:從學生選課問題可以找出學生(Student)、課程(Course)、選課(Class)和註冊(Registration)4個類別來建立領域模型的類別圖。
4-2-1 物件導向分析- 指定責任(說明) 在指定責任(Assigning Responsibilities)步驟是指定類別的責任,即類別主要的功能與服務,並且列出需要哪些類別共同合作才能完成指定的責任,也就是類別之間的關係。 在作法上,我們可以使用CRC卡完成此步驟的工作,CRC卡是Kent Beck和Ward Cunningham發展的技術,CRC代表類別(Class)、責任(Responsibilities)和合作(Collaborators)。
4-2-1 物件導向分析- 指定責任(CRC卡) 例如:學生選課4個類別的CRC卡,如下圖所示:
4-2-1 物件導向分析- 指定責任(概念模型的類別圖)
4-2-2 物件導向設計-說明 物件導向設計(Object-Oriented Design,OOD)是進一步決定類別屬性、行為和類別關係的細部設計,以便在實作時能夠將事情做對,其最後建立的設計結果是設計模型(Design Model),設計模型是一個已經完成到足以實作成程式碼的模型。
4-2-2 物件導向設計-主要步驟 事實上,物件導向設計主要是在回答下列問題,如下所示: 如何保證類別已經知道它所需知道的所有資訊? 類別如何處理其指定的責任? 類別如何在系統之中進行溝通? 上述三個問題是物件導向設計的二個步驟:指定屬性與行為(前2個問題)和類別關係(最後1個問題)。
4-2-2 物件導向設計-指定屬性與行為 當進入此步驟時,相信每一個類別都已經指定責任和合作關係,所以指定屬性與行為(Assigning Attributes And Behaviors)步驟是將指定的責任與合作轉換成詳細類別屬性的變數和行為的方法,通常一個分析階段的功能可能轉換成1至多個設計行為,即設計方法。 在作法上,我們可以使用UML循序圖(Sequence Diagram)和通訊圖(Communication Diagrams)等互動圖來進一步分析責任與合作關係。
4-2-2 物件導向設計- 指定類別關係(說明) 在指定類別關係(Assigning Relationships)步驟的工作是指定類別之間更詳細的關係,包含:Is-a、Has-a或Part-Of關係,詳見第2-4-3節的說明。 最後,我們可以更新概念模型來建立設計模型(Design Model)的類別圖。
4-2-2 物件導向設計- 指定類別關係(設計模型的類別圖)
4-2-3 物件導向程式設計-說明 物件導向程式設計(Object-Oriented Programming,OOP)是使用物件導向程式語言C++、C#和Java 等,將設計模型的類別圖轉換成實作的程式碼,也就是建立實作模型(Implementation Model)。
4-2-3 物件導向程式設計-範例1 class Registration { private Courses[] courses; private Student student; public boolean checkId() { return false; } public Courses selectCourse() { return null; } } class Student { private int stdId; private Class class; public int getId() { return 0; } public Class getClass() { return null; }
4-2-3 物件導向程式設計-範例2 class Courses { private int c_no; private int c_name; private int c_credit; public boolean isAvailable() { return false; } } class Class { private Student student; public void registerCourse(Courses c_no) { } public int getNumOfClass() { return 0; }
4-3 UML的物件導向分析與設計 4-3-1 UML與物件導向分析與設計 4-3-2 UML塑模過程的範例
4-3-1 UML與物件導向分析與設計- UML塑模過程 Rational統一流程的主要特點是使用案例驅動(Use-Case Driven),以UML圖形來說,就是建立使用案例圖來啟動物件導向分析與設計過程,我們可以稱之為UML塑模過程,如下圖所示:
4-3-1 UML與物件導向分析與設計- UML塑模過程說明1 需求擷取:我們需要找出使用者的真正需求,也就是系統提供的功能與服務。 建立使用案例模型:以UML使用案例圖來描述從問題領域擷取的系統需求,然後寫出使用案例圖主要使用案例的描述和情節(Scenarios),也就是使用案例的詳細故事。我們可以使用UML活動圖描述流程來完成使用案例模型的建立。 定義概念模型:在此步驟定義概念模型的類別圖,這是一種簡化的類別圖。
4-3-1 UML與物件導向分析與設計- UML塑模過程說明2 定義設計模型:在此步驟是建立設計模型的類別圖,我們可以從循序圖和通訊圖找出類別關係、屬性和行為,然後更新概念模型建立設計模型的類別圖。
4-3-1 UML與物件導向分析與設計- UML塑模過程與物件導向分析與設計 UML塑模過程是一種使用UML圖形來執行物件導向分析與設計的過程。至於在UML塑模過程的哪些步驟是物件導向分析?哪些步驟屬於物件導向設計?如下圖所示:
4-3-2 UML塑模過程的範例-問題 在這一節筆者準備使用一個簡單實例來說明UML塑模過程。因為物件導向技術的精神是模擬真實世界的東西,所以,筆者準備建立一個模擬電子鬧鐘的軟體程式,如右圖所示:
4-3-2 UML塑模過程的範例-問題說明 電子鬧鐘擁有LCD螢幕顯示時間,提供鬧鈴功能和貪睡裝置,可以調整時間和設定鬧鈴時間。 電子鬧鐘擁有5個操作按鈕,【設定】鈕可以設定時間,按【設定鬧鈴】鈕2秒鐘調整鬧鈴時間,按一下切換是否啟用鬧鈴,加減號鈕調整時間。當鬧鈴響時,按上方【貪睡】鈕,可以貪睡5分鐘。
4-3-2 UML塑模過程的範例-需求擷取 從問題領域(Problem Domain)進行需求擷取,可以定義出系統提供的功能有: 1. 電子鬧鐘系統會讀取時間(Read Time)。 2. 電子鬧鐘系統會設定時間(Set Time)。 3. 電子鬧鐘系統會設定鬧鈴時間(Set Alarm Time)。 4. 電子鬧鐘系統會關閉鬧鈴聲(Cancel Alarm)。
4-3-2 UML塑模過程的範例- 建立使用案例模型(使用案例圖) 在此步驟是繪出使用案例圖來描述參與系統的動作者和系統功能的使用案例,這是以客戶與使用者角度來顯示系統功能,如右圖所示:
4-3-2 UML塑模過程的範例- 建立使用案例模型(使用案例規格) 然後我們可以寫出主要使用案例的詳細描述,稱為使用案例規格(Use Case Specifications)。筆者僅以設定時間(Set Time)使用案例為例,其使用案例規格如右所示:
4-3-2 UML塑模過程的範例- 建立使用案例模型(UML活動圖)
4-3-2 UML塑模過程的範例-定義概念模型 在這個步驟可以找出系統的類別,我們可以從使用案例規格的描述中找出系統的物件,然後抽象化成類別來建立概念模型,如下圖所示:
4-3-2 UML塑模過程的範例- 建立互動圖(說明)
4-3-2 UML塑模過程的範例- 建立互動圖(循序圖) 例如:設定電子鬧鐘時間的循序圖,如下圖所示:
4-3-2 UML塑模過程的範例- 建立互動圖(狀態機圖) UML狀態機圖可以顯示物件的狀態變化,我們可以透過狀態機圖來進一步分析物件的狀態轉變。例如:設定時間時,LCDDisplay螢幕類別的物件擁有多個閃爍狀態,此物件的狀態機圖,如右圖所示:
4-3-2 UML塑模過程的範例-定義設計模型 在建立概念模型和循序圖等互動圖後,我們就可以從循序圖找出類別屬性和行為的細節來更新概念模型,建立出最後設計模型的類別圖,如下圖所示:
4-4 使用SIM執行UML塑模 Software Ideas Modeler(SIM)塑模工具可以幫助我們執行UML塑模,因為在同一個SIM專案可以建立多個模型,以不同觀點來檢視系統,而且在每一個模型之下,可以包含多個描述此模型的UML圖形。 基本上,我們可以使用兩種方式來執行UML塑模,如下所示: 在SIM專案分別建立使用案例模型、概念模型(或分析模型)和設計模型。 在SIM專案使用UML的4+1觀點,替每一個觀點建立模型。
End