系統分析與設計 楊子青 H-1 H 、物件導向技術 n 物件導向的基本概念 – 物件、類別 – 封裝、繼承 – 同名異式 ( 多型 ) 、超荷 ( 過載 ) n 物件導向分析與設計及塑模工具 n UML 塑模工具
系統分析與設計 楊子青 H-2 物件導向? 不使用物件導向描述一件事 青椒炒牛肉 取出青椒 500 g ,用刀切成細絲,過油 取出牛肉 300 g ,切丁,用醬油、酒、 黑醋醃製 起油鍋、放入牛肉炒及青椒大火快炒 1 分半 拿出太白粉、水調在一起,這個稱為 芡汁。 將芡汁倒入鍋中攪拌,會產生黏稠現象 這叫芶芡 完成。 使用物件導向描述一件事 青椒炒牛肉 青椒 數量: 500 g 處理:用刀切成細絲,過油 牛肉 數量: 300 g 處理:切丁,用醬油、酒、黑醋醃製 芡汁 製作:太白粉調上適量的水 芶芡:將芡汁倒入鍋中 青椒處理好、牛肉處理好、芡汁製作好, 青椒、牛肉放入鍋中快炒 1 分半後,用 芡汁芶芡即可。
系統分析與設計 楊子青 H-3 物件、屬性、方法 青椒炒牛肉 青椒 數量: 500 g 處理:用刀切成細絲,過油 牛肉 數量: 300 g 處理:切丁,用醬油、酒、黑醋醃製 芡汁 製作:太白粉調上適量的水 芶芡:將芡汁倒入鍋中 青椒處理好、牛肉處理好、芡汁製作好, 放入鍋中快炒 1 分半後用芡汁芶芡即可。 先定義好參與這件事的物品有哪些 ( 這些物品叫做 “ 物件 ” ) 再定義這些物品所需的數量及行為 ( 這些數量及行為叫做 “ 屬性 ” 與 “ 方法 ” ) 接下來就可用物品間的互動行為 來描述整件事情是如何發生的。 ( 這部份的描述稱為 “ 主程式 ” ) n 物件導向優點:程式碼再用
系統分析與設計 楊子青 H-4 1. 物件導向的基本概念 n 物件導向技術 (Object-Oriented Technique) – 是繼結構化技術之後,系統開發上的新典範 (Paradigm) – 以物件模式來描述真實系統,並將資料抽象 化 (Data Abstraction) 、封裝、繼承、同名異 式、超荷的觀念融入物件導向的系統開發中
系統分析與設計 楊子青 H 物件 (Object) n 物件是一種可認知的東西,是物件導向 的基本思維單位 – 我們認知下圖是一輛車,是因為聯想到: 車子是紅色。 車子有四個門。 車子有四個輪胎。
系統分析與設計 楊子青 H-6 物件的範例 n 例如: Car1 物件模擬一輛 1800cc 紅色四 門的 Sentra 車子。 Car1 是物件的識別字, 使用 Car1 識別字,可以在眾多模擬其他 車輛的 Car2 、 Car3 、 Car4…. 等物件中, 識別出是哪一輛車輛物件。
系統分析與設計 楊子青 H-7 物件的三種特性 n 狀態( State ):物件所有「屬性」 (Attributes) 目前的狀態值 – 例如:車子的車型、排氣量、色彩等屬性 – 以程式來說,也就是資料部分的變數,可以簡單到 只是一個布林值變數,也可能是另一個物件。 n 行為( Behavior ):物件提供的服務,稱操作 (Operations) 或方法 (Methods) – 例如:車子可以發動、停車、加速和換擋等 – 程式語言是使用程序或函數來實作行為 n 識別字( Identity ):每一個物件都擁有獨一無 二的識別字來識別它是不同的物件 – 例如使用物件實際儲存的記憶體位址 (Reference) , 作為物件的識別字
系統分析與設計 楊子青 H 類別 (Class) n 具有相同結構及行為的物件所組成之集合 – 類別是物件經分類 (Classification) 或抽象化 (Abstraction) 所得的結果 – 也就是將物件抽象化,僅考慮相同性質特徵, 排除其差異部分,將這些物件組成一個群體, 稱為類別。
系統分析與設計 楊子青 H-9 類別之範例
系統分析與設計 楊子青 H-10 類別 n 以詹姆士、愛德華物件 為例,他們有相似的行 為與資訊結構,可表示 成一個「人」的類別。
系統分析與設計 楊子青 H-11 物件與類別 n 物件導向程式,都是以類別為基本單位所 組成;在執行時的主體是物件,而非類別 class C { int i; // 類別 C 宣告了一整數變數 i } class D { public static void main(String[] args) { // 程式開始的起點 C c1; // 根據類別 C ,宣告一個物件,名稱為 c1 c1 = new C(); // 以類別 C 為範本,產生一個物件 c1 // 兩者可和寫為 C c1 = new C(); c1.i = 10; System.out.println("c1.i = "+c1.i); } 輸出結果: c1.i = 10
系統分析與設計 楊子青 H-12 物件與類別之 Java 程式實例 class Account { private int balance;// 宣告一帳戶餘額 void clearAccount() { balance = 0; }// 清空帳戶餘額的 " 方法 " void deposit(int m) { balance = balance + m; } // 存錢的 " 方法 " int getBalance() { return balance; } // 顯示目前餘額的 " 方法 " } class E { public static void main(String[] args) { Account joe = new Account(); // 產生一個帳戶: joe Account wason = new Account(); // 產生一個帳戶: wason joe.clearAccount(); // 將 Joe 的帳戶餘額清空 wason.clearAccount(); // 將 Wason 的帳戶餘額清空 joe.deposit(300); // Joe 存了 300 元 wason.deposit(500); // Wason 存了 500 元 // 顯示 Joe, Wason 目前的帳戶餘額 System.out.println("Joe has " + joe.getBalance() + "dollars."); System.out.println("Wason has " + wason.getBalance() + "dollars."); } 輸出結果: Joe has 300 dollars. Wason has 500 dollars.
系統分析與設計 楊子青 H 封裝 (Encapsulation) n 物件導向技術,將資訊 ( 屬性 ) 與操作此資訊 的函數 ( 方法 ) 包裝成一個物件,稱為封裝。 – 將物件的實作細節隱藏,使其與外界環境隔離 ,而只允許該物件所包含之操作修改其資訊, 稱為資訊隱藏 (Information Hiding) 。 使用物件時,僅需知道物件提供何種操作,而不需 知其內部之資訊或行為是如何表達或執行。 封裝之特性使物件導向的系統較容易維護。
系統分析與設計 楊子青 H-14 Java 的封裝 n 將物件中資源 ( 資料或方法 ) 的存取分為幾個等級, 以管理某些資源隱藏在物件中,某些資源開放給 外界使用。 –Public ( 公開 ) : 將物件內部的資源開放給外界使用。 –Private ( 私有 ) :資源的所有權完全屬於該類別,只有在 物件內部才可對其作存取動作。任何外部的存取均會導 致錯誤發生。 –Protected ( 保護 ) :在所屬的 package 中是被視為 public 資源;但是在其他的 package 中,則只被繼承的子類別 使用。 –Default Access ( 預設存取 ) 或 Package( 類別庫 ) :在所屬的 package 中是被視為 public 資源;但是在其他的 package 中,則會被視為是 private 資源而無法被使用。
系統分析與設計 楊子青 H-15 封裝資料之 Java 程式實例 class C { private int i; // 私有資料 public int j; // 公開資料 int k;// 預設存取資料 } class D { public static void main(String[] args) { C c = new C(); c.i = 5; // Error! c.i 是 private 資料,禁止存取! c.j = 10; // OK! c.k = 15; // OK! }
系統分析與設計 楊子青 H-16 封裝方法之 Java 程式實例 class Account { private int balance;// 私有資料 void public clearAccount() { balance = 0; }// 公開方法 void deposit(int m) { balance = balance + m; } // 預設存取方法 private int getBalance() { return balance; } // 私有方法 } class D { public static void main(String[] args) { Account joe = new Account(); joe.clearAccount(); // OK! joe.deposit(300); // OK! System.out.println(“Joe has ” + joe.getBalance() + “dollars.”); // ERROR! 使用私有方法 }
系統分析與設計 楊子青 H 繼承 (Inheritance) n 承接所有父類別 (Parent Class) 所有屬性及方法,並可加以改造 的特性。 – 以男人和女人物件為例,將相同的 部分抽出,一般化成一個更上層的 類別 ( 父類別 ) ,稱為「人」類別。 – 物件導向技術中,繼承概念對軟體 工程有革命性的影響,如達成程式 碼再用 (Reuse) 與減少重複描述、 產生可靠度較高的軟體等。
系統分析與設計 楊子青 H-18 繼承之實例 n 學生和老師都是人 ,可先定義 Person 類別來模擬人類, 然後擴充 Person 類 別建立 Student 和 Teacher 類別,模擬 學生和老師
系統分析與設計 楊子青 H-19 繼承之 Java 程式實例 class C { private int i; public void setInfo(int x) { i = x; } public int getInfo() { return i; } } class D extends C {} // 類別 D 繼承類別 C class E extends C {} // 類別 E 繼承類別 C class F { public static void main(String[] args) { D d = new D(); E e = new E(); d.setInfo(5); e.setInfo(7); System.out.println("The value of d is "+d.getInfo()); System.out.println("The value of e is "+e.getInfo()); } 執行結果: The value of d is 5 The value of e is 7
系統分析與設計 楊子青 H-20 覆寫 (overriding) n 子類別將繼承自父類別來的屬性或方法, 重新定義的動作 – 變數覆寫 將繼承自父類別的變數遮蓋起來。 ( 在父類別中的 變數宣告並不會因此消失,它只是隱藏起來而已 ) – 方法覆寫 將繼承自父類別的方法遮蓋起來。 這種設計讓我們在繼承類別時,可將不符合需求 的方法加以改寫,如此一來,子類別的使用者就 不會也不能看到及使用父類別中的方法,以達到 重新設計的目的。
系統分析與設計 楊子青 H-21 變數覆寫之 Java 程式實例 class C { int i = 10; } class D extends C { int i = 5; } class E { public static void main(String[] args) { D d = new D(); System.out.println("d = "+d.i); } 執行結果: d = 5
系統分析與設計 楊子青 H-22 方法覆寫之 Java 程式實例 class C { void f(String s) { System.out.println("f in class C: "+s); } class D extends C { void f(String s) { System.out.println("f in class D: "+s); // 父類別的方法被覆寫! } class E { public static void main(String[] args) { D d = new D(); d.f("hello"); } 執行結果: f in class D: hello
系統分析與設計 楊子青 H 同名異式 (Polymorphism) n 又稱「多型」 – 相同的方法名稱, 卻定義不同的實作 (implementation) – 目的:希望簡化系 統發展的複雜性, 並增加其彈性。 – 在人類的思維中, 對於同一種工作, 就算對象不同,也 會使用相同名稱的 操作,例如:
系統分析與設計 楊子青 H-24 同名異式又稱為動態多型 n 多型在程式呼叫一方法時,以動態連結 (Dynamic Binding) 的方式,來判斷當時被呼叫物件所屬的 類別,以決定執行哪一實作 動態多型是建立在繼承的架構上:
系統分析與設計 楊子青 H-25 同名異式之 Java 程式實例 abstract class Shape { public abstract void f(); } class Triangle extends Shape { public void f() { System.out.println("Triangle!"); } class Rectangle extends Shape { public void f() { System.out.println("Rectangle!"); } class Circle extends Shape { public void f() { System.out.println("Circle!"); } 執行結果: Triangle! Rectangle! Circle! class E { public static void main (String[] args) { Shape[] s = new Shape[] { new Triangle(), new Rectangle(), new Circle() }; for (int i=0; i<s.length; i++) { s[i].f(); }
系統分析與設計 楊子青 H 超荷 ( 或稱過載, Overload) n 在同一類別中有相同名稱的操作,依參數個數 及參數資料型態來判斷要使用哪一個操作,又 稱靜態多型。 – 例如: class C { int add(int i, int j) { return i + j; } int add(int i, int j, int k) { return i + j + k; } String add(String i, String j) { return i + j; } } class D { public static void main(String[] args) { C c1 = new C(); System.out.println(“ = "+c1.add(3,10)); System.out.println(" = "+c1.add(1,2,5)); System.out.println("'abc' + 'xyz' = "+c1.add("abc","xyz")); } 執行結果: = = 8 'abc' + 'xyz' = abcxyz
系統分析與設計 楊子青 H 物件導向分析與設計及塑模工具 n 統一塑模語言 (Unified Modeling Language, UML) – 可以讓我們使用圖形描述系統來建立模型 – 是 Rational 公司整合 Booch 、 Rumbaugh 與 Jacobson 三種方法,提出的物件導向塑模工具
系統分析與設計 楊子青 H-28 UML 的 4+1 觀點 n 對於複雜的軟體系統,需要透過一組 UML 圖形才能完整描述系統的所有資訊 – 可以從不同觀點來檢視,每一個觀點使用 特定種類的 UML 圖形來呈現。 n Kruchten’s 的 4+1 觀點能夠幫助我們呈現 不同種類 UML 圖形在描述整個系統模型 時扮演的角色,稱為「觀點模型」 (View Model)
系統分析與設計 楊子青 H 觀點 設計觀點 處理流程觀點 實作觀點 部署觀點 使用個案 觀點
系統分析與設計 楊子青 H-30 使用個案觀點 (Use Case View) n 從系統外部的使用者角度,來表達系統 要做什麼,並不涉及系統的軟硬體架構 – 由描述系統行為的使用個案組成 – 與其他 4 個觀點都相關,所以稱為 +1 觀點 –UML :使用個案圖。 設計觀點 處理流程 觀點 實作觀點 部署觀點 使用個案 觀點
系統分析與設計 楊子青 H-31 設計觀點 (Design View) n 描繪系統的靜態結構以及動態行為,以 做為系統所應提供之功能的解答 n 重點在系統之類別、介面、物件的合作 等設計問題 –UML :類別圖、物件圖、狀態圖和互動圖 ( 循序圖、溝通圖、時序圖、互動概觀圖 ) 。 設計觀點 處理流程 觀點 實作觀點 部署觀點 使用個案 觀點
系統分析與設計 楊子青 H-32 處理流程觀點 (Process View) n 描繪系統非功能需求的的績效 (Performance) 、產出 (Throughput) 與可擴充性 (Scalability) – 著重表達系統內部的處理程序,如同步機制之 執行緒 (thread) –UML :活動圖。 設計觀點 處理流程 觀點 實作觀點 部署觀點 使用個案 觀點
系統分析與設計 楊子青 H-33 實作觀點 (Implementation View) n 以程式設計者角度的觀點 – 著重於程式碼管理的模組與元件 – 以模組或元件來顯示設計觀點的物件,是在 哪一個模組或元件中實作。 –UML :元件圖。 設計觀點 處理流程 觀點 實作觀點 部署觀點 使用個案 觀點
系統分析與設計 楊子青 H-34 部署觀點 (Deployment View) n 從系統工程師觀點呈現的系統 – 表達系統執行時,各個組成元件的實際佈置 與安裝,強調系統執行環境的硬體拓撲上各 節點 (Nodes) 之配置。 –UML :部署圖。 設計觀點 處理流程 觀點 實作觀點 部署觀點 使用個案 觀點
系統分析與設計 楊子青 H-35 物件導向分析與設計之塑模 n 上述五個觀點,配合物件導向分析與設計 ( 含需 求分析、系統分析與設計 ) ,可分為五種塑模: – 使用個案塑模(需求塑模):使用個案圖、 活動圖、藍圖與資料詞彙 – 物件結構塑模:類別圖與物件圖 – 物件互動行為塑模:循序圖與溝通圖 – 使用者介面塑模:介面結構圖、介面藍圖、 介面詞彙、循序圖與狀態圖 – 系統元件與結構塑模:元件圖與部署圖
系統分析與設計 楊子青 H-36 套件圖
系統分析與設計 楊子青 H-37 物件導向核心工作流程與塑模 工具
系統分析與設計 楊子青 H-38 系統 分析與設計和塑模工具: 結構化 vs. 物件導向
系統分析與設計 楊子青 H UML 塑模工具 n UML 塑模工具 (UML Modelling Tool) ,可幫助 系統開發者使用 UML 圖形進行物件導向分析與 設計,快速建立軟體系統所需的模型。 n 依使用者的授權方式,可分為商業和免費版本 UML 塑模工具。 n 簡介影片: 簡介影片 –UML Video 01: Choosing the right UML Package
系統分析與設計 楊子青 H-40 商業版本的 UML 塑模工具 n 提供較強大功能 – 很多都提供 Community 社群版,可以讓非商業用途 的使用者免費使用,不過,其功能會打一些折扣, 而且通常都需要線上註冊啟動後才能使用。 n 常見商業版本的 UML 塑模工具,如下: –IBM Rational Software Architect ( RSA ) –Microsoft Visio –Astah UML –Visual Paradigm for UML ( VP-UML ) –Enterprise Architect…
系統分析與設計 楊子青 H-41 免費版本的 UML 塑模工具 n Open Source( 開放原始碼 ) 的免費塑模工 具,和一些非商業用途使用者可全功能 免費使用的 UML 塑模工具,例如: –StarUML –ArgoUML –Umbrello –BOUML –Software Ideas Modeler…
系統分析與設計 楊子青 H-42 Software Ideas Modeler n 官方網站: n 下載: n 安裝: UMLVideo02: Install and Run Software Ideas Modeler UMLVideo02