2015-01-10

物件導向基本觀念

什麼是物件導向(Object-Oriented, OO)? 為什麼要OO?
簡單來講,OO就是能夠把真實世界的每個物件、對應到軟體之中的物件概念,
可以讓我們更容易實作與解決一些生活上的問題。
而物件導向程式語言則是以「每個物件」為主,
每個物件負責自己的功能,最後由一堆物件(一堆子系統)組合成完整的系統。

本篇文章將介紹一些OO的基本特色,
因為有這些特色,使得開發軟體時能夠有更高的維護性,
以及更有能力開發超大型軟體系統。
本篇文章介紹的內容只是個大略,詳細的OO特性請去參考專門書籍。


一、OO的六大主要特色

1. Classfication

擁有相同或類似屬性的物件會被包裝成一個類別,
一個類別定義了物件的行為,
包括物件包含的資料內容、(data members)
可以有哪些操作、(operations)
以及可以用哪些方式存取到這些內容或操作。
而物件就是類別的實例 (instance)。

如右圖,一個腳踏車有輪子大小、輪框大小等類似的屬性,
因此可以被包裝成腳踏車這個類別,
而由這個類別new出來的物件都是一台腳踏車,擁有這些屬性。

(之後有空再補:class diagram的觀念、operation vs method)


2. Identity

identity稱為物件的識別,
每個物件都是獨立的個體,擁有自己內在的特性,
因此儘管兩個物件的屬性內容完全相同,他們還是不同的物件。
如右上圖,儘管兩個Bicycle物件的屬性完全相同,
他們還是屬於不同的兩個物件。

(之後有空再補程式語言的例子)


3. Inheritance

類別之間可以有繼承的關係,
所有的子類別都可以繼承父類別的所有特性,
以達到程式碼重複利用的功能。
子類別也可以加入屬於自己的特性,用來擴充父類別的功能。

(之後有空再補程式語言的例子)


4. Polymorphism

多型的概念主要是應用在類別的operation上,
意思是指一個相同(名稱)的operation,在不同狀況下可以有不同的行為。
多型又分為靜態多型(compile-time)與動態多型(run-time):

(1) Static Polymorphism

類別裡的函式可以有相同的名稱,但參數的型態或數量不同。
物件在呼叫這些同名函式時,會依照參數來呼叫正確的函式。
這種行為又稱作「Overloading (重載)」。
class Clock {
    void setTime(int, int, int) { }
    void setTime(String) { }
}

Clock clock= new Clock();
clock.setTime(1, 2, 3);     // 呼叫setTime(int, int, int)
clock.setTime("01:02:03");  // 呼叫setTime(String)

(2) Dynamic Polymorphism

動態多型代表相同的operation,在不同的類別會有不同的行為。
子類別可以Override (覆寫) 從父類別繼承下來的operations,
而在執行期才去動態的決定該呼叫誰的operation。
interface Shape {
    double computeArea();
}
class Rectangle implements Shape {
    double computeArea() { return width*height; }
}
class Circle implements Shape {
    double computeArea() { return radius*radius*PI; }
}

Shape shape;
shape = new Rectangle();
shape.computeArea(); // run-time時呼叫的是Rectangle的method
shape = new Circle();
shape.computeArea(); // run-time時呼叫的是Circle的method


5. Abstraction

抽象化是指定義出一些物件共同擁有的屬性或行為,
用比較高階抽象的方式描述一些較為核心的概念。
例如,一個Stack可能會有push、pop的操作,
這時我們只需定義出這兩個操作的抽象方法,
而把其他細節性的實作留到之後。

(之後有空再補程式語言的例子)


6. Encapsulation

物件導向程式語言有「封裝」的特性,
可以將物件的一些特性隱藏起來,例如資料成員、演算法等等,
而由對外公開的函式去存取內部的資料,
使得內部資料不會被不恰當的方式存取,以確保程式的安全,
也能夠增加物件的可使用性。(Usability,代表此物件使用起來簡不簡單)
(此行為又稱為 Information Hiding)

(之後有空再補程式語言的例子,再稍微修正一下這段的敘述)



二、OO的六大關係

期末考要炸了,之後有空再來補...

1. Dependency


2. Association


3. Aggregation


4. Delegation


5. Composition


6. Generalization



沒有留言:

張貼留言