|
最近常有一種說法,就是我們如今面臨著另外一場編程模型的變革,面向對象技術已經處在被淘汰的邊緣,函數式語言會取代面向對象技術成為主流方式,甚至出現了面向對象已死的言論。作為一個硬核函數語言的狂熱者,我個人當然希望函數式語言可以一統天下,成為主流之選。但是不是應該把對象技術和函數技術對立起來,說式后者取前者而代之,我個人認為,這和如何看待面向對象技術有關。
做為工程實踐的對象技術
在這個年代,大家有一種神圣化面向對象技術的傾向,很多人都把對象技術奉為高深的思想和理論。但實際上,面向對象技術僅僅一種工程實踐而已,它是依托于其他技術而存在的一種實踐,本身并不是一種完備的計算模型。
在計算機科學發展的早期,對于計算機的非數值計算應用的討論,以及對于可計算性問題的研究和發展,大抵確立了幾種的計算模型:遞歸函數類、圖靈機、Lambda演算、Horn子句、Post系統等等。其中遞歸函數類是可計算性問題的數學解釋;Horn子句是prolog這類邏輯語言的理論基礎;lambda演算成為了函數式語言的理論基礎;圖靈機是圖靈解決可計算問題的時候所設計的裝置,其后成為計算機的裝置模型,與圖靈機相關的自動機以及馮諾依曼結構,成為了命令式語言的理論基礎。
因此當我們談及函數語言和命令式語言優劣的時候,我們實際上是在討論其背后的計算模型——也就是lambda演算和馮結構裝置操作——在執行效率和抽象層次上的優劣。
而面向對象技術則比較尷尬了,其背后沒有一個對應的計算模型(80年代的時候曾有人研究過,Pi演算是個備選,但是這個模型更多的是在并發對象領域的語義,而不是通常意義上的計算模型)。它有點類似于“最佳實踐”,在不同的計算模型上有著完全不同實現方式和含義。因此對比對象技術和其他技術的時候,搞清楚到底是哪一種面向對象就變得格外重要起來。
兩種不同的面向對象
目前流行的對象技術,實際上有兩個截然不同的源頭。它們分別在兩個完全不同的計算模型上發展起來,但是都頂著“面向對象”這個帽子。
第一種對象技術出現的較晚,在1979年以后。它是以抽象數據類型(ADT,Abstract Data Type)為源起,發展出來的面向對象技術。也就是首先被C++所采用的面向對象技術。
C++作為“更好的C”,繼承了C語言對于程序的看法,也就是數據抽象(Data Abstraction)和過程。面向對象技術在C++中,是作為一種更好的數據抽象的方式而存在的。
數據抽象在這類面向對象語言中是一種關鍵的抽象方式。所謂數據抽象,在計算機發展的早期是一種非常關鍵的技術。眾所周知,計算機在裝置模型上是一個存儲和一組指令集,而二進制的存儲實際上是沒有任何類型表示的。整數,浮點這些操作必須通過相應的約定,再以指令集的形式進行支持。而隨著計算機的發展,簡單的數據類型顯然已經不能滿足應用的需要。這時候一種靈活且有效的類型系統,就成了一種自然的追求(直到80年代初,類型系統都是計算機科學研究的重要方向之一)。
在C++中(以及后來的Java和C#),對象是一種構造數據類型的方式,把每個“類”看作一段存儲(狀態)和操作(方法)的集合。“類”作為已經存在的類型系統的一種擴展(這一點在C++中體現得尤其強烈)。在這類語言中,“類”(class)實際上代替了“對象”(object)成為了頭等公民。構造一個更好的類型系統,是這種面向對象技術所要解決的問題。與其說是面向對象,不如說是面向類或面向類型的。
從計算語義上說,這類對象技術仍然是裝置的操作語義,和面向過程的沒有實質上的區別。唯一的不同是,被這種對象語言操作的機器,可以借由對象技術擴展機器所支持的類型。這種面向對象技術是過程技術的一種發展,雖然在抽象層次上沒有什么太大的提高,但在實踐上已經是巨大的進步。
另一種對象技術出現的很早,大概在60年代末就出現了,直到80年代初還有發展。但是很長一段時間內并不是太主流的做法,反而并不太為人所知。
在函數式語言里,因為高階函數(High Order Function)的存在,數據可由函數來表達。這就是函數語言里一個非常重要的觀點:Data as Procedure。在函數語言中,可以構造一種非常類似于對象的高階函數:
(define (make-user name age sex)
(define (dispatch message)
(cond ((eq? message 'getName) name)
((eq? message 'getAge) age)
((eq? message 'getSex) sex))
(else (error 'messageNotUnderstand))))
dispatch)
(define vincent (make-user 'Vincent 30 'Male))
(vincent 'getName)
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。