淺談物件導向
物件導向是現代的顯學,相信任何程式設計師都聽過物件導向,而物件導向也
一直在持續進展中,從之前的原始碼的物件導向,到今日二進位層級的物件導向,
或許物件導向這個東西還會發燒好多年。
基本上,物件導向程式必須實作出幾個觀念:
- 1. 封裝 (Encapsulation)
- 將資料與其相關操作(method)包裝在類別中。外界只需叫物件做事,而不用
管物件是如何做到的。如此使得程式更為模組化,物件藉由其界面與外界溝通,
進而增進程式的可維護性,同時也將可能的 bug 關在一個有限的範圍。
- 2. 繼承 (Inheritance)
- 子類別可以繼承父類別,而不必重複撰寫與父類別相同的程式碼。
- 3. 多形 (Polymorphism)
- 子類別可以覆載(override)由父類別繼承而來的 method ,使得同樣的方法
呼叫,對子類別及父類別的實體(instance or object),會有不同的效果。子類別
雖然繼承父類別的程式,但亦可覆載掉不合用的部份,不會被父類別框住。
- 4. 抽象化 (Abstraction)
- 允許建立抽象類別(Abstract Class),定義出其子類別的共同特性。
事實上,物件導向是一個軟體向硬體學習的例子,如果我們觀察各種硬體設備,
我們會發現硬體設備早就是物件導向的系統,而物件導向中許多觀念也真的是向工程
學習而來。
然而我們該如何寫出物件導向風格的程式呢?簡單的說來,有幾個步驟要進行:
- 1. 辨認出問題中的概念(或物件)
- 這是物件導向的第一步,我們必須先找到問題領域(Problem Domain)中的相
關物件。早期是靠一些直覺與經驗,而現在物件導向分析的方法論,已提
供一些更可靠的方式,例如 UML 中的 Use Case、Conceptual Model ...等
皆是幫助我們找到物件的好方法。
- 2. 找出各概念(或物件)間的互動方式
- 在這裡我們必須決定出物件之間要如何互動,每個物件必須完成什麼任務,
UML 中提供一些圖示化的方法,而有豐富經驗的程式設計師亦歸納出一些設
計上的樣板(稱為 Design Pattern)供參考。事實上,這個步驟是最需要創
意,也會花費最多時間與心血的地方,因為這裡的成果很可能就是軟體開發
的成敗關鍵。而不幸的是,正如同世界上沒有一種解題方法可以解決所有的
問題,這裡也不會有(未來也可能沒有)一種萬靈丹式的解法。
- 3. 將各概念(或物件)化為實際的類別並實作之
- 選定特定的程式語言,將前面所作的分析與設計的成果,化為實際的程式碼
。這時我們要根據所選定語言的特性,寫出實際的程式碼,其成果的好壞端
賴我們對程式概念的了解以及對於電腦科學的相關知識而定。
所以只是使用 C++ 或 Java 並不表示就是在寫物件導向的程式,物件導向的程
式要求我們以物件導向的方式思考問題,將問題以物件來作為分割的單位,而不是以
功能來分割(以前程序導向的觀念)。如此才有可能在大型軟體中達到最高的穩定性,
可維護性,...之目標。同時這也是邁向分散式計算架構的基礎,因為現在 CORBA 與
COM/DCOM 標準都是物件導向型式的標準,如果不了解物件導向,那就更不可能了解
CORBA 與 COM 這些以 Binary 為基礎的物件導向標準。
物件導向的觀念正持續演進中,現在仍然有許多問題要克服,例如現在風行的關
聯式資料庫,如 Oracle 與 SQL Server 等,它們本身並無物件導向的觀念,所以對
於必須存取關聯式資料庫的軟體來說,就需要更多的設計技巧。所幸目前物件式資料
庫已開始商業化,未來這種問題必然可以獲得改善。
沒有留言:
張貼留言