1 / 42

H 、 物件導向技術

H 、 物件導向技術. 物件導向的基本概念 物件、類別 封裝、繼承 同名異式 ( 多型 ) 、超荷 ( 過載 ) 物件導向分析與設計及塑模工具 UML 塑模工具. 物件導向?. 不使用物件導向描述一件事. 使用物件導向描述一件事. 青椒炒牛肉. 青椒炒牛肉. 取出青椒 500 g ,用刀切成細絲,過油 取出牛肉 300 g ,切丁,用醬油、酒、 黑醋醃製 起油鍋、放入牛肉炒及青椒大火快炒 1 分半 拿出太白粉、水調在一起,這個稱為 芡汁。 將芡汁倒入鍋中攪拌,會產生黏稠現象 這叫芶芡 完成。.

eshana
Download Presentation

H 、 物件導向技術

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. H、物件導向技術 • 物件導向的基本概念 • 物件、類別 • 封裝、繼承 • 同名異式(多型) 、超荷(過載) • 物件導向分析與設計及塑模工具 • UML塑模工具

  2. 物件導向? 不使用物件導向描述一件事 使用物件導向描述一件事 青椒炒牛肉 青椒炒牛肉 • 取出青椒 500 g,用刀切成細絲,過油 • 取出牛肉 300 g,切丁,用醬油、酒、 黑醋醃製 • 起油鍋、放入牛肉炒及青椒大火快炒1 分半 • 拿出太白粉、水調在一起,這個稱為 芡汁。 • 將芡汁倒入鍋中攪拌,會產生黏稠現象 這叫芶芡 • 完成。 • 青椒數量:500 g處理:用刀切成細絲,過油 • 牛肉數量:300 g處理:切丁,用醬油、酒、黑醋醃製 • 芡汁製作:太白粉調上適量的水芶芡:將芡汁倒入鍋中 • 青椒處理好、牛肉處理好、芡汁製作好,青椒、牛肉放入鍋中快炒 1 分半後,用 • 芡汁芶芡即可。

  3. 青椒炒牛肉 • 青椒數量:500 g處理:用刀切成細絲,過油 • 牛肉數量:300 g處理:切丁,用醬油、酒、黑醋醃製 • 芡汁製作:太白粉調上適量的水芶芡:將芡汁倒入鍋中 • 青椒處理好、牛肉處理好、芡汁製作好, 放入鍋中快炒 1 分半後用芡汁芶芡即可。 物件、屬性、方法 先定義好參與這件事的物品有哪些 (這些物品叫做 “物件”) • 物件導向優點:程式碼再用 再定義這些物品所需的數量及行為 (這些數量及行為叫做“屬性”與“方法”) 接下來就可用物品間的互動行為 來描述整件事情是如何發生的。(這部份的描述稱為“主程式”)

  4. 1. 物件導向的基本概念 • 物件導向技術(Object-Oriented Technique) • 是繼結構化技術之後,系統開發上的新典範(Paradigm) • 以物件模式來描述真實系統,並將資料抽象化(Data Abstraction)、封裝、繼承、同名異式、超荷的觀念融入物件導向的系統開發中

  5. 1.1 物件 (Object) • 物件是一種可認知的東西,是物件導向的基本思維單位 • 我們認知下圖是一輛車,是因為聯想到: • 車子是紅色。 • 車子有四個門。 • 車子有四個輪胎。

  6. 物件的範例 • 例如:Car1物件模擬一輛1800cc紅色四門的Sentra車子。Car1是物件的識別字,使用Car1識別字,可以在眾多模擬其他車輛的Car2、Car3、Car4….等物件中,識別出是哪一輛車輛物件。

  7. 物件的三種特性 • 狀態(State):物件所有「屬性」(Attributes)目前的狀態值 • 例如:車子的車型、排氣量、色彩等屬性 • 以程式來說,也就是資料部分的變數,可以簡單到只是一個布林值變數,也可能是另一個物件。 • 行為(Behavior):物件提供的服務,稱操作(Operations)或方法(Methods) • 例如:車子可以發動、停車、加速和換擋等 • 程式語言是使用程序或函數來實作行為 • 識別字(Identity):每一個物件都擁有獨一無二的識別字來識別它是不同的物件 • 例如使用物件實際儲存的記憶體位址 (Reference),作為物件的識別字

  8. 1.2 類別 (Class) • 具有相同結構及行為的物件所組成之集合 • 類別是物件經分類(Classification)或抽象化(Abstraction)所得的結果 • 也就是將物件抽象化,僅考慮相同性質特徵,排除其差異部分,將這些物件組成一個群體,稱為類別。

  9. 類別之範例

  10. 類別 • 以詹姆士、愛德華物件為例,他們有相似的行為與資訊結構,可表示成一個「人」的類別。

  11. 物件與類別 • 物件導向程式,都是以類別為基本單位所組成;在執行時的主體是物件,而非類別 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

  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.

  13. 1.3 封裝 (Encapsulation) • 物件導向技術,將資訊(屬性)與操作此資訊的函數(方法)包裝成一個物件,稱為封裝。 • 將物件的實作細節隱藏,使其與外界環境隔離,而只允許該物件所包含之操作修改其資訊,稱為資訊隱藏(Information Hiding)。 • 使用物件時,僅需知道物件提供何種操作,而不需知其內部之資訊或行為是如何表達或執行。 • 封裝之特性使物件導向的系統較容易維護。

  14. Java的封裝 • 將物件中資源(資料或方法)的存取分為幾個等級,以管理某些資源隱藏在物件中,某些資源開放給外界使用。 • Public (公開): 將物件內部的資源開放給外界使用。 • Private (私有):資源的所有權完全屬於該類別,只有在物件內部才可對其作存取動作。任何外部的存取均會導致錯誤發生。 • Protected (保護):在所屬的 package 中是被視為 public 資源;但是在其他的 package 中,則只被繼承的子類別使用。 • Default Access (預設存取)或Package(類別庫):在所屬的 package 中是被視為 public 資源;但是在其他的 package 中,則會被視為是 private 資源而無法被使用。

  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! } }

  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! 使用私有方法 } }

  17. 1.4 繼承(Inheritance) • 承接所有父類別 (Parent Class) 所有屬性及方法,並可加以改造的特性。 • 以男人和女人物件為例,將相同的部分抽出,一般化成一個更上層的類別(父類別),稱為「人」類別。 • 物件導向技術中,繼承概念對軟體工程有革命性的影響,如達成程式碼再用(Reuse)與減少重複描述、產生可靠度較高的軟體等。

  18. 繼承之實例 • 學生和老師都是人,可先定義Person類別來模擬人類,然後擴充Person類別建立Student和Teacher類別,模擬學生和老師

  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

  20. 覆寫(overriding) • 子類別將繼承自父類別來的屬性或方法,重新定義的動作 • 變數覆寫 • 將繼承自父類別的變數遮蓋起來。(在父類別中的變數宣告並不會因此消失,它只是隱藏起來而已) • 方法覆寫 • 將繼承自父類別的方法遮蓋起來。 • 這種設計讓我們在繼承類別時,可將不符合需求的方法加以改寫,如此一來,子類別的使用者就不會也不能看到及使用父類別中的方法,以達到重新設計的目的。

  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

  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

  23. 1.5 同名異式(Polymorphism) • 又稱「多型」 • 相同的方法名稱,卻定義不同的實作(implementation) • 目的:希望簡化系統發展的複雜性,並增加其彈性。 • 在人類的思維中,對於同一種工作,就算對象不同,也會使用相同名稱的操作,例如:

  24. 同名異式又稱為動態多型 • 多型在程式呼叫一方法時,以動態連結(Dynamic Binding)的方式,來判斷當時被呼叫物件所屬的類別,以決定執行哪一實作 • 動態多型是建立在繼承的架構上:

  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!"); } } 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(); } } } 執行結果: Triangle! Rectangle! Circle!

  26. 1.6超荷(或稱過載,Overload) • 在同一類別中有相同名稱的操作,依參數個數及參數資料型態來判斷要使用哪一個操作,又稱靜態多型。 • 例如: 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(“3 + 10 = "+c1.add(3,10)); System.out.println("1 + 2 + 5 = "+c1.add(1,2,5)); System.out.println("'abc' + 'xyz' = "+c1.add("abc","xyz")); } } 執行結果: 3 + 10 = 13 1 + 2 + 5 = 8 'abc' + 'xyz' = abcxyz

  27. 2. 物件導向分析與設計及塑模工具 • 統一塑模語言(Unified Modeling Language, UML) • 可以讓我們使用圖形描述系統來建立模型 • 是Rational 公司整合Booch、Rumbaugh 與Jacobson 三種方法,提出的物件導向塑模工具

  28. UML的4+1觀點 • 對於複雜的軟體系統,需要透過一組UML圖形才能完整描述系統的所有資訊 • 可以從不同觀點來檢視,每一個觀點使用特定種類的UML圖形來呈現。 • Kruchten’s的4+1觀點能夠幫助我們呈現不同種類UML圖形在描述整個系統模型時扮演的角色,稱為「觀點模型」(View Model)

  29. 4+1觀點 設計觀點 實作觀點 使用個案 觀點 處理流程觀點 部署觀點

  30. 使用個案觀點(Use Case View) 設計觀點 實作觀點 • 從系統外部的使用者角度,來表達系統要做什麼,並不涉及系統的軟硬體架構 • 由描述系統行為的使用個案組成 • 與其他4個觀點都相關,所以稱為+1觀點 • UML:使用個案圖。 使用個案 觀點 處理流程 觀點 部署觀點

  31. 設計觀點(Design View) 設計觀點 實作觀點 • 描繪系統的靜態結構以及動態行為,以做為系統所應提供之功能的解答 • 重點在系統之類別、介面、物件的合作等設計問題 • UML:類別圖、物件圖、狀態圖和互動圖 (循序圖、溝通圖、時序圖、互動概觀圖)。 使用個案 觀點 處理流程 觀點 部署觀點

  32. 處理流程觀點(Process View) 設計觀點 實作觀點 • 描繪系統非功能需求的的績效(Performance)、產出(Throughput)與可擴充性(Scalability) • 著重表達系統內部的處理程序,如同步機制之執行緒(thread) • UML:活動圖。 使用個案 觀點 處理流程 觀點 部署觀點

  33. 實作觀點(Implementation View) 設計觀點 實作觀點 • 以程式設計者角度的觀點 • 著重於程式碼管理的模組與元件 • 以模組或元件來顯示設計觀點的物件,是在哪一個模組或元件中實作。 • UML:元件圖。 使用個案 觀點 處理流程 觀點 部署觀點

  34. 部署觀點(Deployment View) 設計觀點 實作觀點 • 從系統工程師觀點呈現的系統 • 表達系統執行時,各個組成元件的實際佈置與安裝,強調系統執行環境的硬體拓撲上各節點(Nodes)之配置。 • UML:部署圖。 使用個案 觀點 處理流程 觀點 部署觀點

  35. 物件導向分析與設計之塑模 • 上述五個觀點,配合物件導向分析與設計(含需求分析、系統分析與設計),可分為五種塑模: • 使用個案塑模(需求塑模):使用個案圖、活動圖、藍圖與資料詞彙 • 物件結構塑模:類別圖與物件圖 • 物件互動行為塑模:循序圖與溝通圖 • 使用者介面塑模:介面結構圖、介面藍圖、介面詞彙、循序圖與狀態圖 • 系統元件與結構塑模:元件圖與部署圖

  36. 圖9-7物件導向塑模活動及塑模工具 套件圖

  37. 物件導向核心工作流程與塑模工具

  38. 系統 分析與設計和塑模工具:結構化vs.物件導向

  39. 3. UML塑模工具 • UML塑模工具(UML Modelling Tool),可幫助系統開發者使用UML圖形進行物件導向分析與設計,快速建立軟體系統所需的模型。 • 依使用者的授權方式,可分為商業和免費版本UML塑模工具。 • 簡介影片: • UML Video 01: Choosing the right UML Package

  40. 商業版本的UML塑模工具 • 提供較強大功能 • 很多都提供Community社群版,可以讓非商業用途的使用者免費使用,不過,其功能會打一些折扣,而且通常都需要線上註冊啟動後才能使用。 • 常見商業版本的UML塑模工具,如下: • IBM Rational Software Architect(RSA) • Microsoft Visio • Astah UML • Visual Paradigm for UML(VP-UML) • Enterprise Architect…

  41. 免費版本的UML塑模工具 • Open Source(開放原始碼) 的免費塑模工具,和一些非商業用途使用者可全功能免費使用的UML塑模工具,例如: • StarUML • ArgoUML • Umbrello • BOUML • Software Ideas Modeler…

  42. Software Ideas Modeler • 官方網站: http://www.softwareideas.net/ • 下載:http://www.softwareideas.net/en/download • 安裝: UMLVideo02: Install and Run Software Ideas Modeler

More Related