Download presentation
Presentation is loading. Please wait.
1
第2章 物件導向技術導論 2-1 程式設計方法 2-2 抽象資料型態 2-3 物件導向的思維 2-4 物件導向技術的三大觀念
2-5 物件導向程式語言
2
2-1 程式設計方法 2-1-1 非結構化程式設計 2-1-2 程序式與結構化程式設計 2-1-3 模組化程式設計
2-1-4 物件導向程式設計
3
2-1 程式設計方法-說明 一般來說,初學程式設計者在逐漸建立深厚的程式設計功力前,學習程式設計通常都會經歷數個學習過程,即四種「程式設計技術」(Programming Techniques),或稱為「程式設計風格」(Programming Styles),如下所示: 非結構化程式設計(Unstructured Programming)。 程序式程式設計(Procedural Programming)與結構化程式設計(Structured Programming)。 模組化程式設計(Modular Programming)。 物件導向程式設計(Object-Oriented Programming)。
4
2-1-1 非結構化程式設計 早期BASIC、機器語言或組合語言建立的程式,很多仍然是使用非結構化程式設計來建立程式碼。
對於C、C++或Java語言來說,所謂非結構化程式設計是指初學程式設計時,不論幾列的小程式或數百列程式碼的大程式,都只有一個main()主程式且不包含任何流程控制敘述的情況。非結構化程式設計的程式碼是使用線性方式來依序的執行,如右圖所示:
5
2-1-2 程序式與結構化程式設計 程序式程式設計是將程式中重複的程式片斷抽出成為程序(Procedures,或稱為Subroutine、Routine)或函數(Functions),也就是一段執行特定功能的程式區塊。 程式因為已經分割成程序,所以在main()主程式的程式碼只是依序呼叫不同程序或函數的程序呼叫(Procedure Call)。程式是使用流程控制連接程序,即目前程式設計最常使用的結構化程式設計,屬於程序式程式設計的子集,如右圖所示:
6
2-1-3 模組化程式設計 模組化程式設計是程序式程式設計的下一個階段,為了能夠重複使用程序式程式設計分割建立的程序,我們可以將相同功能的程序或函數結合在一起建立成獨立的「模組」(Modules),模組是處理指定功能的子程式,如下圖所示:
7
2-1-4 物件導向程式設計 模組化程式設計是物件導向程式設計的前身,只是沒有提供繼承和多形等物件導向觀念。物件導向程式設計是一種更符合人性化的程式設計方法,將原來專注於問題的分解,轉換成了解問題本質參與的東西,也就是「物件」(Object),如下圖所示:
8
2-2 抽象資料型態 2-2-1 程序或函數抽象化 2-2-2 資料抽象化 2-2-3 抽象資料型態 2-2-4 抽象資料型態與物件導向
9
2-2 抽象資料型態 物件導向程式設計的精神是資料抽象化,透過抽象資料型態建立電腦與真實世界之間的橋樑,描述和模擬真實世界的實體,即東西,簡單的說,物件導向程式設計就是一種抽象資料型態的程式設計。 「抽象化」(Abstraction)的主要目的是定義問題的二個屬性,如下所示: 資料(Data):問題影響的資料。 操作(Operators):問題產生的操作。
10
2-2-1 程序或函數抽象化-由上而下的設計方法
程序或函數抽象化(Procedure Abstraction or Function Abstraction)主要是針對傳統由上而下的設計方法,將問題分割成一個個子工作。 由上而下的設計方法(Top-down Design)是以程序為單位來切割工作,也就是所謂的「程序式程式設計」(Procedural Design)。 由上而下的設計方法是一種循序漸進了解問題的方法。筆者準備使用一個實例來說明分割工作的過程。
11
2-2-1 程序或函數抽象化-範例 例如:目前有一個工作是繪出房屋的圖形,房屋圖形的繪圖工作不是一筆畫就可以完成,所以,我們可以分割成多個小工作來分別處理,以由上而下的設計方法來了解整個繪圖工作的問題。
12
2-2-1 程序或函數抽象化-步驟一 從房屋繪圖工作可以粗分為三個小工作,如下所示:
繪出屋頂和外框。 繪出窗戶。 繪出門。 依據上述工作分割,可以建立各分割小工作之間的模組架構,如下圖所示: Call Draw Outline Call Draw Windows Call Draw Door
13
2-2-1 程序或函數抽象化-步驟二 將第一個小工作【繪出屋頂和外框】(Draw Outline)再次進行分割成二個小工作,如下所示:
繪出屋頂。 繪出房屋的外框。 Call Draw Roof Call Draw House Frame
14
2-2-1 程序或函數抽象化-其他步驟 現在,我們只需重複上述分析,一步一步向下進行分割工作,例如:因為窗戶有2個,所以【繪出窗戶】可以分為【繪出窗戶1】和【繪出窗戶2】;【繪出門】可以分為【繪出門框】和【繪出門把】。 最後,將問題分割成一個個小問題後,每一個小問題就是一個程序或函數,只需完成這些程序或函數就可以解決繪出房屋的問題。
15
2-2-1 程序或函數抽象化- 程序或函數抽象化(說明)
在由上而下設計方法分割的程序或函數之中,我們並不用考量實作的程式碼,只需定義好程序或函數使用介面的參數和傳回值,將它視為一個黑盒子,換句話說,程式可以使用任何符合介面的程序或函數來取代,稱為程序或函數抽象化。
16
2-2-1 程序或函數抽象化- 程序或函數抽象化(圖例)
例如:前述繪出房屋問題,我們可以將問題分解成一個個繪圖操作的程序,其最後結果如下圖所示:
17
2-2-2 資料抽象化 「資料抽象化」(Data Abstraction)是一種方法將基本資料型態的變數組合成複合資料(Compound Data),使用相關函數來處理複合資料,以便隱藏實際複合資料的儲存方式。 一般來說,程式語言如果沒有支援下一節的抽象資料型態,通常就是使用模組化程式設計來建立資料抽象化。例如:使用模組化程式設計建立「堆疊」(Stacks)資料結構,如下圖所示:
18
2-2-3 抽象資料型態-說明 「抽象資料型態」(Abstract Data Type,ADT)是使用資料抽象化的方法建立的自訂資料型態,抽象資料型態包含資料和相關操作,將資料和處理資料的操作一起思考,結合在一起,操作就是對外的使用介面,如下圖所示:
19
2-2-3 抽象資料型態-範例 我們可以將個人基本資料問題抽象化成Person模型,用來模擬真實世界的「人」實體,內含姓名name、地址address和電話號碼phone等資料,setPerson()指定個人資料,getName()、getAddress()和getPhone()取出個人資料的操作。Person抽象資料型態,如下圖所示:
20
2-2-4 抽象資料型態與物件導向-說明 物件導向程式設計的精神是資料抽象化的抽象資料型態,即類別,物件導向是將問題的資料屬性和資料本身的相關操作一起思考,不用考量其他資料或不相關操作,以便建立一個個完善定義的物件(Object)。 如果將第2-2-1節的繪出房屋範例看成堆積木遊戲,房屋可以使用一個個積木來堆出,著重於組成房屋元件的資料抽象化,即房屋是由房頂、窗戶、門和外框等物件組成。
21
2-2-4 抽象資料型態與物件導向-圖例
22
2-2-4 抽象資料型態與物件導向-模擬真實世界
簡單的說,物件導向程式設計就是在模擬真實世界,以便找出解決問題所需的物件集合和其關係,在物件之間是使用訊息建立互動,透過物件集合之間的合作來解決程式問題,如下所示: 程式 = 物件 + 訊息 如同車輛是由成千上萬個零件所組裝,物件導向程式設計可以視為是一種組裝工作,將眾多現成或擴充功能的物件結合起來。
23
2-3 物件導向的思維 2-3-1 物件 2-3-2 類別
24
2-3 物件導向的思維 物件導向技術源於1960年代的Simula程式語言,它是Simulation Language的簡稱,這是一種模擬語言,希望使用電腦程式來模擬真實世界的各種處理過程。 物件導向的思維就是我們現實生活的思維方式,人類自然的思考方式,其實各位讀者早已經知道,而且一直使用它來思考問題。
25
2-3-1 物件-說明 物件的英文是Object,在此筆者討論的是現實生活中的物件,並不是程式中的物件,物件的英文原意有物體、東西、對象和目的。 換句話說,物件不見的是一種看得到或摸得到的實體,它可能只是一個概念,一種我們可以認知的東西,如下圖所示:
26
2-3-1 物件-認知的東西 物件是一種可以認知的東西。例如:我們認知一輛車,是因為聯想到: 車子是紅色。 車子有四個門。 車子有四個輪胎。
27
2-3-2 類別-說明 當識別出物件後,物件導向技術的抽象化(Abstraction)就是從物件中抽出共通部分的特徵,排除其詳細部分,以物件導向技術來說,就是將物件抽象化成為類別(Class)。
28
2-3-2 類別-範例 例如:紅色汽車、白色貨車和銀色休旅車抽象化成陸上交通工具的車輛,然後進一步抽象化成交通工具,如下圖所示:
29
2-4 物件導向技術的三大觀念 2-4-1 物件觀念 2-4-2 訊息觀念 2-4-3 類別觀念
30
2-4 物件導向技術的三大觀念 物件導向技術有三大重要觀念:物件、訊息和類別,其簡單說明如下所示: 物件:提供資料和處理資料程序的封裝。
訊息:在物件之間的溝通方式,可以建立互動和支援多形。 類別:物件的分類,可以實作類別架構的繼承。
31
2-4-1 物件觀念-物件簡介 物件(Object)是物件導向技術的關鍵,以程式角度來說,它是電腦用來模擬現實生活的東西或事件,也是組成應用程式的元素。 物件是資料與相關處理資料的程序和函數結合在一起的組合體。資料是變數,程序和函數稱為方法(Methods),如下圖所示:
32
2-4-1 物件觀念-物件的三種特性 物件導向技術的物件是對應到現實生活的實體或事件,擁有三種特性,如下所示:
狀態(State):物件所有「屬性」(Attributes)目前的狀態值,屬性是儲存物件的狀態,可以簡單到只是一個布林值變數,也可能是另一個物件。例如:車子的車型、排氣量、色彩和自排或手排等屬性,以程式來說,也就是資料部分的變數。 行為(Behavior):行為是物件可見部分提供的服務,也就是塑模所抽象化的操作,可以做什麼事?程式語言是使用程序或函數來實作行為,稱為方法,例如:車子可以發動、停車、加速和換擋等。 識別字(Identity):每一個物件都擁有獨一無二的識別字來識別它是不同的物件。例如:使用物件參考(Reference)作為物件的識別字,即物件實際儲存的記憶體位址。
33
2-4-1 物件觀念-物件的範例 物件可以模擬真實生活的東西,例如:Car1物件模擬一輛1800cc紅色四門的Sentra車子。Car1是物件的識別字,使用Car1識別字就可以在眾多模擬其他車輛的Car2、Car3、Car4….物件中,識別出是哪一輛車輛物件。
34
2-4-1 物件觀念-組合物件 「組合物件」(Composite Object)是指物件的屬性是另一個物件,例如:上述Car1物件door是整數的車門數,如果是車門Door物件時,Car1物件就是組合物件。
35
2-4-2 訊息觀念-訊息簡介 物件可以模擬現實生活的東西,但是現實生活中的東西會彼此互動。例如:學生要求成績(學生與成績物件)、約同學看電影(同學與同學物件)和學生彈鋼琴(學生與鋼琴物件)等互動。所以,我們建立的物件之間也需要互動,使用的媒介就是訊息(Messages)。 物件是使用訊息來模擬彼此之間的互動,換句話說,訊息是物件之間的溝通橋樑,可以啟動另一個物件來執行指定的行為。
36
2-4-2 訊息觀念-訊息範例 例如:Student學生物件需要查詢成績,學生成績是儲存在StudentStatus物件,此時Student物件可以送一個訊息給StudentStatus物件,告訴它需要查詢學生的成績,如下圖所示:
37
2-4-2 訊息觀念-訊息傳回值 在接收物件接到訊息後,就會執行指定方法,然後將回應訊息送回給發送物件(也可能沒有回應),稱為「傳回值」(Return Value)或回傳值,即查詢結果的學生成績,如下圖所示:
38
2-4-2 訊息觀念-循序操作(說明) 物件送出的訊息,有可能在接收物件執行方法後就產生回應訊息,也有可能是觸發另一個訊息,操作會繼續送出一系列訊息給其他物件,以便依序執行各物件的指定方法來完成整個操作,稱為「循序操作」(Sequential Operation)。
39
2-4-2 訊息觀念-循序操作(範例) 例如:學生平均成績的查詢是送訊息到Teacher物件執行average()方法,Teacher物件再觸發另一個訊息到StudentStatus物件查詢學生的三科成績,如下圖所示:
40
2-4-2 訊息觀念-名稱再用:過載 在程序式程式設計的程序或函數名稱是識別字,如同變數一般,需要與其他程序或函數擁有不同的名稱。例如:分別取得2個和3個參數最大值的函數,我們需要建立2個不同名稱的maxTwo(a1, a2)和maxThree(a1, a2, a3)函數。 對於物件導向技術來說,物件是依接收的訊息來執行方法,訊息內容有三種資訊,只需有差異就足以讓物件辨識出是不同的方法,所以,方法同名也沒有關係。例如:執行Utility物件max()方法的訊息,如下所示: Utility.max(23, 45); Utility.max(23, 45, 87); Utility.max(‘a’, ‘z’);
41
2-4-2 訊息觀念-名稱再用:多形 「多形」(Polymorphism)屬於另一種名稱再用,針對同一個訊息,不同的物件擁有不同的反應,也就是同一個名稱擁有不同的操作。因為在人類的思維中,對於同一種工作,就算對象不同,也會使用相同名稱的操作,如右圖所示:
42
2-4-3 類別觀念-類別簡介 在第2-4-1節我們模擬不同車輛的Car1、Car2、Car3、Car4…物件,因為物件都擁有相同的屬性和行為,只是狀態不同。簡單的說,這些物件屬於同一類物件,所以可以建立名為Car的範本來建立這些物件,如同工廠依照藍圖製造車輛,此範本就是類別,屬於同一類別的物件即該類別的「實例」(Instance),也稱為副本。 類別也可以想像成扮演的角色。例如:模擬教室上課,在同一間教室共有30人,其中1位是老師,其他是學生。換句話說,如果每一個人是一個物件,30個物件可以進一步分類成屬於Teacher類別和Student類別的物件集合,也就是哪些物件扮演老師;哪些物件是學生。
43
2-4-3 類別觀念-類別是物件的藍圖 類別是一種抽象資料型態,其目的是建立物件,使用類別建立的物件稱為類別的實例(Instance)。例如:使用Student類別建立29位Student物件,這些物件和類別擁有相同的屬性和行為,只是狀態值不同,即物件的變數值不同。例如:一位學生的姓名name是【陳會安】,另一位是【江小魚】,如下圖所示:
44
2-4-3 類別觀念-類別架構:繼承 在前面的例子中,學生和老師都是人,換言之,我們可以先定義Person類別來模擬人類,然後擴充Person類別建立Student和Teacher類別模擬學生和老師,稱為「繼承」(Inheritance),如右圖所示:
45
2-4-3 類別觀念-多重繼承 如果父類別不只一個,即同時繼承多個父類別,稱為「多重繼承」(Multiple Inheritance),如下圖所示:
46
2-4-3 類別觀念-類別關係(說明) 類別關係(Relationships)是指不同類別之間的關係。例如:繼承是一種Is-a的類別關係,UML稱為「一般關係」(Gereralization)。 結合關係(Association)是在建立類別之間互通訊息的管道,一種類別真正擁有指標指向其他物件的類別關係,其他物件為其屬性。另外還有強度更強的結合關係,稱為「成品和零件」(Whole-Part),即Part-of和Has-a關係。
47
2-4-3 類別觀念-類別關係(圖例)
48
2-4-3 類別觀念-類別關係(圖例說明) Part-of和Has-a關係的說明,如下所示:
Part-of關係:指此類別是其他類別的零件,以上圖為例Wheel車輪和Driving Computer行車電腦是Car車類別的零件。 Has-a關係:相反於Part-of關係,Car類別Has-a擁有Wheel和Driving Computer類別。
49
2-4-3 類別觀念-抽象類別 「抽象類別」(Abstract Class)是一種不能完全代表物件的類別,抽象類別並不能建立實例,只是擁有眾多類別的共同部分,其主要目的是作為其他類別的父類別。例如:哺乳類動物的分類,如右圖所示:
50
2-5 物件導向程式語言 2-5-1 物件導向程式語言的特點 2-5-2 常用的物件導向程式語言
51
2-5-1 物件導向程式語言的特點-封裝 封裝 封裝(Encapsulation)是將資料和處理資料的程序與函數組合起來建立物件。在C++、C#和Java語言定義物件是使用「類別」(Class),內含屬性和方法,屬於一種抽象資料型態(Abstract Data Type),換句話說,就是替程式語言定義新的資料型態。
52
2-5-1 物件導向程式語言的特點-繼承 繼承 繼承(Inheritance)是物件的再利用,當定義一個類別後,其他類別可以繼承這個類別的資料和方法,並且新增或取代繼承物件的資料和方法。
53
2-5-1 物件導向程式語言的特點-多形 多形 多形(Polymorphism)屬於物件導向最複雜的特性,類別如果需要處理各種不同資料型態時,並不需要針對不同資料型態來建立不同的類別,可以直接繼承基礎類別,也就是繼承此類別建立同名方法來處理不同的資料型態,因為方法的名稱相同,只是程式碼不同,所以也稱為「同名異式」。
54
2-5-2 常用的物件導向程式語言 最早的物件導向程式語言是Simula,這是在1960年代末期Norweigian Computing Center開發的程式語言,接著是1970年代由Xerox Palo Alto研發中心開發的Smalltalk語言,目前比較重要的物件導向程式語言有: Java C++ .NET的C# .NET的Visual Basic
55
End
Similar presentations