物件導向技術
內容大綱 導論 物件導向的基本概念 物件 類別 封裝 繼承 同名異式 物件導向的系統開發 結論
導論 物件導向技術(Object-Oriented Technique) 是繼結構化技術之後,系統開發上另一新的典範(Paradigm) 。 資料抽象化(Data Abstraction)、 封裝(Encapsulation)、 繼承(Inheritance)、 同名異式(Polymorphism) 的觀念融入於物件系統開發中。
導論(c.2) 軟體業界希望像硬體開發時,有積體電路(IC) 可以直接使用,所以有做出軟體IC的構想。 因為,如此可以促進軟體業界的分工,降低系統開發的複雜度和困難度。 物件導向技術可以達到這個目標。然而,傳統的結構化技術不能。
導論(c.3) 積體電路(IC) Software IC
導論(c.4) 物件導向的優點 更接近人類思維方式 程式的重複使用 程式易維護 程式易擴展 等等…
物件導向的基本觀念 物件導向的重要基本觀念包括: 物件 類別 封裝 繼承 同名異式
物件導向的基本觀念(c.2) 物件(Object) 物件是物件導向的基本思維單位,物件是一個具有識別(Identity)、狀態(State)與行為(Behavior) 的實體(Entity)或抽象化概念(Abstract Concept),物件的行為會影響其狀態。 物件包括: 名稱(Name)─識別 屬性(Attributes)─資料,其內容代表物件的狀態 操作 (Operations)或稱方法(Methods)─行為 例如物件名稱李四,有生日、年齡、住址、身高、體重與性別等為其屬性,而跳躍與走路為其操作。
物件導向的基本觀念(c.3) 類別(Class) 類別是具有相同資料結構及行為的物件所組成的集合。一個類別是一種定義(Definition)、樣板(Template)或模子(Mold),它是許多物件共同特徵的一種描述。
物件導向的基本觀念(c.4) 類別是物件經分類與抽象化後所得的結果。 將物件抽象化,就是剔除物件間的差異,而只考慮其相同的性質,然後組成一個群體,稱為類別。
物件導向的基本觀念(c.5) 類別包括: 例如:人類是一類別名稱,有生日、年齡、住址、身高、體重與性別等為其屬性,而跳躍與走路為其操作。 名稱(Name) 屬性(Attributes) 操作 (Operations)或稱方法(Methods) 例如:人類是一類別名稱,有生日、年齡、住址、身高、體重與性別等為其屬性,而跳躍與走路為其操作。 class name attributes: operations: 類別的表示法
物件導向的基本觀念(c.6) 類別有時亦稱為物件類型(Object Type)。 類別中的任一物件稱為該類別之案例(Instance), 因此物件與案例常被互用(視為同義詞)。
物件導向的基本觀念(c.7) 封裝(Encapsulation) 將資料及使用此資料的所有方法包裝成一個物件,謂之。 也就是,物件是資料與方法『封裝』的結果。 資料與方法被 封裝在一起
物件導向的基本觀念(c.8) 物件之方法定義了物件的行為,可修改物件之資料(也就是說,影響其狀態)。 封裝所形成的物件,其結構可分為兩部分: 介面(Interface):定義與物件互動的方式。 實作(Implementation):定義物件行為。 實作 介面 介面
物件導向的基本觀念(c.9) 封裝將物件的實作細節隱藏,使其與外界環境隔離,而只允許該物件之方法修改其資料,稱為資訊隱藏(Information Hiding)。 物件中的資料必須透過物件的方法取用,只要物件的方法對存取作控制,外界的物件便無法取用內部的資料,而達成物件保護的目的。 封裝之特性使物件導向的系統較容易維護。
物件導向的基本觀念(c.9)
物件導向的基本觀念(c.10) method # 1 data # 2 # 4 # 5 # 6 # 3 修改存取內部的資料
物件導向的基本觀念(c.11) 物件間的聯繫是鬆散的,靠著訊息傳遞互通有無,彼此合作。所以,物件可接收訊息也可發送訊息。 外界之物件使用某一物件時, 僅需知道該物件提供何種方法,而不需知道其內部之資料或行為是如何表達或執行。 僅透過訊息傳遞要求該物件提供服務,而無法逕自改變該物件之資料內容。
物件導向的基本觀念(c.12) 訊息 嘴巴 訊息 耳朵
物件導向的基本觀念(c.13) 為了反應訊息,物件內部應該準備好相對應方法來因應。 方法往往會改變物件自己的狀態,也會送出訊息給其他物件。 準備好的 各種方法 用來反應訊息 送出訊息 改變自己 的狀態 接收訊息
物件導向的基本觀念(c.14) message: [sender, return value(s)] sender object attributes: receiver object attributes: operations: operations: message: [sender, return value(s)] message: [receiver, operation, parameters]
物件導向的基本觀念(c.16) 物件活動的平台是支持物件導向、物件生存的環境,能夠讓訊息自由的傳導,而且能讓物件存在於記憶體中,還要能讓物件的方法使用處理器來執行。 平台好比海洋 提供生物生存的環境
物件導向的基本觀念(c.17) 繼承(Inheritance) 繼承是類別間之關係,在此關係中某類別之資料結構與行為可供其關係中之類別分享。 繼承者稱為子類別(Subclass),被繼承者稱為父類別(Superclass)。 子類別將由父類別繼承來的屬性(變數、資料結構)或方法(行為)重新定義的動作稱為覆寫(overriding)。
物件導向的基本觀念(c.18) 男人 女人 人類
物件導向的基本觀念(c.19) Furniture (superclass) subclasses of furniture Chair Table Desk sofa Furniture (superclass) subclasses of furniture
物件導向的基本觀念(c.20) 繼承之特性可利用一般化(Generalization) 的原則,萃取相關子類別的相同屬性和操作,並將之歸類為一個父類別來達成。 相反的,利用特殊化(Specialization)的原則,可以找出一個父類別的相關子類別。
物件導向的基本觀念(c.21) 類別階層組織的建構:物件經過抽象化找出的類別,可以再經由一般化的過程找出其父類別,並由特殊化的過程找出子類別。上下重複檢查類別階層組織,直到沒有新的類別出現為止。 一般化 特殊化 類別階層組織
物件導向的基本觀念(c.22) 多重繼承:子類別同時繼承一個以上的父類別的情形。
物件導向的基本觀念(c.23) 類別的方法供本身及其所有子類別共用,因而達到程式的重用效果。 在物件導向技術中,繼承概念之運用對軟體工程有革命性之影響,如達成程式碼重用(Reuse),及產生可靠度較高的軟體等。
物件導向的基本觀念(c.24) 類別階層組織
物件導向的基本觀念(c.25) 同名異式(Polymorphism) 多型的目的是希望簡化系統發展的複雜性並增加其彈性。 Polymorphism意指多種型式,簡稱多型,指的是一個方法可以有許多型式,也就是,相同的方法名稱,定義以不同的實作(implementation)。 多型的目的是希望簡化系統發展的複雜性並增加其彈性。
物件導向的基本觀念(c.26) 多型在程式執行時(run-time) ,呼叫一方法是以動態連結(Dynamic Binding)的方式,判斷當時被呼叫物件所屬的類別來決定執行那一實作,所以又稱為動態多型(Dynamic Polymorphism) 或 執行時多型(Run-time Polymorphism) 。
物件導向的基本觀念--範例 (c.27) abstract class Shape { public abstract void f(); } class Triangle extends Shape { public void f() { System.out.println("Triangle!"); class Rectangle extends Shape { System.out.println("Rectangle!"); class Circle extends Shape { System.out.println("Circle!"); class poly { 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();
物件導向的基本觀念(c.28) 當呼叫一方法時,決定執行那個實作,是依參數的數目與類型來做決定,此稱為多重定義、過荷或超載(Overloading)。 雖然過荷符合多型的定義,但事實上,過荷並非多型。 為了區別,過荷又稱為靜態多型(Static Polymorphism),這是因為早在程式使用編譯器(compiler)編譯時,就已經依參數的數目與類型,決定執行那個實作。
物件導向的基本觀念(c.29) 物件導向程式語言 如Java、C++、Small Talk、Object Pascal等。 慎選『類別庫』相當重要,不同的類別階層組織往往並不相容。 熟悉類別階層組織的建構法則,建構好的類別階層組織,才可增加程式的『重複使用率』,並真正得到物件導向的好處。
物件導向的基本觀念(c.30) C++與傳統的C語言的主要不同在於增加類別、封裝、繼承、多形性的語法,與類別庫的結構。 class stack { private: int Array[100]; int Top; public: void Push(int data); int Pop(); }; void stack::Push(int data) { ....... }; int stack::Pop() C++與傳統的C語言的主要不同在於增加類別、封裝、繼承、多形性的語法,與類別庫的結構。
物件導向的系統開發 Grady Booch於1986年率先發表物件導向的系統開發方法,以開啟物件導向在軟體工程(Software Engineering)上應用的新頁。接著,又有許多物件導向系統分析與設計方法論陸續的被發表,使物件導向的觀念在軟體工程上的應用更臻完整,其中較著名的如: Rambaugh, James 的物件塑模技術(Object Modeling Technique, OMT) Jacobson, Ivar 的物件導向軟體工程(Object-Oriented Software Engineering, OOSE) 三人的研究成果整合為統一塑模語言(Unified Modeling Language, UML):一種物件導向塑模工具。
物件導向的系統開發(c.2) 統一塑模語言(Unified Modeling Language, UML)是一種規格化(Specifying) 、視覺化(Visualizing)及文件化(Documenting)的軟體塑模語言,共使用以下九種圖形進行塑模: 使用個案圖 類別圖 物件圖 循序圖 合作圖 狀態圖 活動圖 元件圖 佈署圖
物件導向的系統開發(c.3) 1. 使用個案圖 2. 類別圖 UML引用Jacobson 的使用個案模式,表示系統的使用個案和行為者之間互動的關係。從外部觀點來看,使用者介面及使用個案的範圍與限制,決定什麼是使用個案(What)?從內部觀點來看,它可描述使用個案是如何運作的(How)? 2. 類別圖 UML引用Booch 與Rumbaugh方法論的類別圖,表示系統存在之類別以及類別間的邏輯關係,該圖是UML模式圖的核心。
物件導向的系統開發(c.4) 3. 物件圖 UML之物件圖(Object Diagram)是用予描述一系統於某一時間點的靜態結構,該圖由一群相關之物件及其連結所組成,以表示系統在某一時間點之一例子。 4. 循序圖 UML之循序圖(Sequence Diagram)是結合Booch的互動圖與Rumbaugh的訊息追蹤圖而成,用以描述系統運作時,物件間的互動行為且著重以時間為主軸的處理程序。
物件導向的系統開發(c.5) 5. 合作圖 UML之合作圖(Collaboration Diagram)是從Booch的物件互動圖與Rumbaugh的物件導向資料流程圖改進而來,該圖能同時展現物件間的資料流程、控制流程與訊息傳遞的活動。因此,合作圖是一個宏觀的總流程,能同步表達資料的產生與資料轉變的過程,以改進傳統資料流程圖中只著重資料流的缺點。
物件導向的系統開發(c.6) 6. 狀態圖 UML之狀態圖(State Diagram)是結合Booch 的狀態轉移圖與Rumbaugh的動態模式而成,用以表達物件在其生命週期中的狀態變化。狀態圖是以微觀物件為主,細分物件所發生的各項事件,並表達物件生命週期之狀態轉變及活動結果。 7. 活動圖 UML之活動圖(Activity Diagram)是狀態圖的一種變異,該圖表達涉及於執行某一作業行為中之活動。一個活動圖描述一群循序與同步的活動,一個活動狀態表示一個工作流程步驟或一個運算的執行活動。
物件導向的系統開發(c.7) 8.元件圖 UML之元件圖(Component Diagram) 起源於Booch的模組圖,用以說明系統設計過程各類別與物件的配置及敘述軟體元件間的組織架構和相依關係。元件是開發和執行過程之實際物件類別,將可拆散的實際基本單位模組化,這些基本單位包括模型(Module)元素並擁有特性和明確定義的介面 9. 佈署圖 UML之佈署圖(Deployment Diagram) 起源於Booch的處理圖,它用來說明系統各處理器、處理元件的配置、關聯,以及同一處理器內執行處理的時程安排等。
物件導向的系統開發(c.8) 物件導向的系統開發是一個反覆的過程,包括需求分析、分析、設計、實施與測試等階段,但分析與設計之工作其實很難分得清楚,因此建議將之合併成分析與設計,如下圖所示。
結論 物件導向應用一些重要的觀念包括物件、類別、封裝、繼承與同名異式等,使物件導向系統有別於結構化之系統。由於物件導向技術之引進,使軟體之開發與維護更有效率,亦提升了程式的再用性與可維護性。 物件導向之系統開發過程是一種反覆的程序,主要包括需求分析、系統分析與設計、測試與維護等階段。 需求分析主要以使用個案圖作為表達工具,而系統分析與設計主要以類別圖、物件圖、循序圖、、狀態圖、合作圖、元件圖與佈署圖表達。