轉載時請注明出處和作者聯系方式
作者聯系方式:會飛的魚 <parker30_liu at hotmail dot com>
面向對象的程式設計技術自60年代誕生以來,從剛開始的前衛而又昂貴(指實作和運作的代價)的技術到現在的遍地開花,已經過去了40來年了。現在,面向對象技術已經滲透到程式設計的各個角落,從大型服務應用架構到GUI架構,到桌面應用程式,到作業系統核心和驅動程式,無處不在。那面向對象究竟是什麼呢,設計模式又是什麼呢,我們該如何面對呢,無需太過嚴肅,讓我們随意的遊曆一下吧。
面向對象技術是将資料和行為封裝到一個獨立的對象,以對象為基本元素的一種程式設計方法。對象隐藏了實作,每個對象是獨立的實體,對象之間通過消息傳遞(方法調用也是一種消息傳遞方式)來進行互動。類是同一個類型的對象的描述,是所有該類型的對象的模闆,可以由類生成對象,類可以繼承自其他類。面向對象是一種程式設計思想,其在一定的抽象層次上将程式實體封裝成獨立的對象,達到解除程式各部分之間的耦合,理清各部分之間的關系的目的。
設計模式是在軟體開發的長期過程中形成的解決特定場合下的特定問題的一個經過實踐檢驗的可重複使用的高效的解決方案。設計模式是程式設計方法,是以面向對象為基礎的。
每一種面向對象技術的實作都有一個對象系統,一個完備的對象系統背後還有一個類型系統,如C++的類型系統,java的類型系統,用C實作的gobject的GTYPE類型系統。實際上,類型系統是面向對象技術的根本,有了類型,我們才有對象類型、類類型、接口類型、基本資料類型,在這之上才有對象和類、接口等。Linux核心也實作了一個較為簡單的對象系統kobject,不過沒有對應的類型系統。
面向對象技術根據是否支援動态類型分為靜态型和動态型。如smalltalk就是動态型的,C++則是靜态型的。而用C語言實作的gobject也支援動态類型,甚至還實作了一般是動态語言才有的閉包(closure),C還是很強大的。現在新出現的python和ruby等動态語言都是支援動态型的面向對象系統。
面向對象技術最主要的就是封裝、繼承、多态、接口,通過多層次、多角度的抽象來達到。封裝就是将資料和方法、行為放到一個對象實體中。繼承是類與類之間的關系,子類繼承了父類的方法和部分資料。多态是調用不同對象的同一個方法,會有不同的行為,至于通過函數重載實作的多态并不是面向對象技術中的多态,可以看作是C++的文法糖。接口是子產品和類提供給客戶對象的操作界面,其定義了一套操作規範,但并沒有實作,由聲明具有該接口的具體子產品和類實作。
面向對象技術已經有多種實作。有的實作是完整的,如C++和JAVA等。有的實作具有動态特性,如smalltalk、python、ruby等。有的實作是簡單的,如很多用C寫的開源軟體中的面向對象實作,好像directFB中也有。Linux核心也有一個簡單的面向對象實作,就是kset和kobject,實作了一個簡單的裝置類層次。
使用面向對象技術編寫程式時,不要忘了面向過程的程式設計方法,很多時候需要将面向過程和面向對象相融合才能寫出好的程式。我們需要靈活的使用面向對象技術才能得到最好的效果。
設計模式不僅可以在面向對象的程式設計語言中使用,也可以在C語言,甚至是在彙編語言中使用。這同樣可以在用C寫的開源軟體中看到,linux核心也使用了一些設計模式,如上面說的kset和kobject,使用的是composite模式,核心的動态電源管理,使用了觀察者模式,其實作是注冊-通知機制。
設計模式如同國術中的招式,圍棋中的定式,需要在特定的場合下使用,不能生搬硬套,需要根據實際情況變招。設計模式提供了系統的隐喻,提供了多種情況下可用的解決方案,讓我們可以更快速的思考設計,減少了交流時的障礙。但我們不能局限于這些設計模式中,正如李小龍所言:“以無法為有法,以無限為有限”。