面向對象編程──走錯了路?
“如果我們現在回頭看一下面向對象這個思想是從哪來的,如果以基于消息傳遞機制的Smalltalk-80的特性來衡量現在的狀態繼承和面向對象的使用方式,我們不禁要問,我們是不是已經走錯路了?”這是在2010倫敦QCon大會采訪中提給Joe Armstrong和Ralph Johnson的一個公開問題。Joe Armstrong是Erlang語言的早期開發人員,而Ralph Johnson則長期從事Smalltalk、面向對象編程和模式等領域的研究。受訪者都表明目前我們都已經在這條“錯路”上了,但這是由于實現上的缺陷導致的,并不是面向對象的思想本身有問題。Ralph Johnson的原話是這樣的:
事實上這樣的事情總在發生,你有了一個好的想法,并把它公布了出去,但對于大多數人來說,它總是顯得很激進。很多人不愿意全盤接受這套理論,他們總是采用其中的一部分,這樣,你就會看到很多相似的東西出來。
甚至是Smalltalk,被很多人奉為面向對象語言的典范,也只是在向面向對象這個理念無限逼近。Johnson博士為Smalltalk提了兩個具體的問題:
... 我想Smalltalk犯了一個根本性的錯誤。我覺得讓那些不用Smalltalk編程的人去理解Smalltalk是非常困難的,但是如果你在使用Samlltalk進行編程和調試,你會發現你是在調試整個系統。
而且
在Smalltalk中你可以從映像中得到任何你想要的對象。但你沒法對新舊對象的版本進行跟蹤 ... 還有,復雜度總是一個問題。你構建了一個系統,只有少數人能夠維護它,而且Smalltalk并不是總能工作的很好。
事實上,把所有的東西(你的應用類,開發和調試工具和庫)都放在“映像”中一直是Smalltalk的問題,即使是對這門語言的崇拜者來講也是一樣。但是,這并不妨礙人們去構建大型的關鍵任務的系統,例如Cargill Lynx項目。Lynx是全球的糧食貿易系統,該系統支持的用戶超過1500,在全美有150多個站點,而且已經運行了十多年了。在Lynx項目的生命周期內,有超過一百名程序員對其進行開發維護,全版本控制,健壯性測試和調試。類似Lynx這樣的巨型項目,并不能消除Ralph Johnson的質疑,當然他們也沒有否認Smalltalk是一個有缺陷的面向對象的實現。他們只是從不同視角提出了自己的觀點。
什么樣的特征能夠讓一門語言具備面向對象的特性,這個問題在90年代進行了廣泛和激烈的辯論。在倫敦QCon大會的采訪中,Joe Armstrong's的論文導師的話被引述之后,同樣引發了爭論:
我開始想知道面向對象編程到底是什么,而且我認為Erlang不是面向對象的,它是函數式編程語言。那我的論文導師就說了:“你是錯的,Erlang是完全面向對象的”。他說面向對象的語言其實不是去面向對象。我在想,雖然我不能確信是不是能相信這句話,但Erlang可能是唯一的面向對象語言,這時因為Erlang具備面向對象編程的三原則:基于消息傳遞機制,對象分離和多態。
Armstrong博士表示,他并沒有被他的導師的論點說服,但似乎認為Erlang“可能是唯一的面向對象語言。” 除了之前提到的三個特征,單繼承和動態類型也被引用為面向對象語言的“絕對需求”。
在這次采訪中,Johnson博士和Armstrong博士都表示,面向對象的思想在過去和現在都是非常重要的。Armstrong博士花時間分析了Erlang是如何試圖實現面向對象的思想和語言的特性。Johnson博士則花了更多的時間批判以前的試圖實現面向對象思想的實踐,特別是Smalltalk。這有點奇怪,因為長期以來他一直是Smalltalk和面向對象思想(Johnson博士合著的設計模式的書的標題包含了面向對象)的倡導者,但是Ralph Johnson的論點并不孤立。
Dave Thomas是另一個對面向對象和Smalltalk有相近觀點的人。他的團隊為Digitalk's Method(第一個PC上的Smalltalk應用)創建了第一個“Goodies Packs”,他是該公司的創始人和CEO,他們的成果最終成為了IBM的VisualAge Smalltalk,而且他的團隊開發了非常流行的工具Eclipse(本來是為Smalltalk寫的)。Thomas博士被引用的話包括“面向對象是個錯誤”和“我是國家罪人。” 這些描述當然是為了增加戲劇效果,但同樣也指出了Smalltalk在實現對象思想時的“錯誤”──例如,只關注狀態,在類和基于映像的語言里缺乏良好的并發模型和消息機制。
Alan Kay最先提出了“面向對象”詞條,他和Dan Ingalls以及其他在Xerox PARC共事的人發明了重要的Smalltalk語言。在最近的澳大利亞計算機世界的采訪中,他談到:
我確實創造了這個詞條(而且現在看來這是個糟糕的選擇,因為它并沒有強調消息傳遞的重要性)。現在其中一部分思想仍然存在(在幾個系統中)。考慮到所有的有效虛擬機的通訊都能通過消息進行交互,我們其實可以建立一個更為全面的理論基礎。這樣的基礎可以提供更好的伸縮性,是我的研究社區的虛擬版本,ARPA-IPTO(美國國防部研究機構的信息處理技術辦公室)已經開始構建大規模網絡,同時具備強大的“代數”屬性(類似多態性)...... 然而,我并不是Smalltalk的粉絲,雖然至今Smalltalk仍然比其他大多數編程系統更好用(我不喜歡其中任何一種,而且至今我也不認為它們適合解決真正的編程問題,無論是對系統還是對終端用戶)。
最近對Smalltalk的批評使我想起了在舊杯墊歌曲中重復的那句歌詞,Charlie Brown唱到:“(為什么每個人都針對我)。” 當然,Johnson、Armstrong、Kay和Thomas都沒有“針對我(Smalltalk)” 。在倫敦QCon大會采訪中,其他相對低調一點的批評者提出,正如Johnson博士所言,好的思想總是“對大多數人顯得很激進”,那么什么程度的思想才能夠被任何程序語言實現呢?
這很可能是因為編程語言無法直接通過定義和結構去描述面向對象的思想。在澳大利亞計算機世界的采訪中,Kay博士指出:
對我來說,采用真實對象語義的好處之一就是它們是“real computers all the way down (RCATWD)”──這意味著真實對象保留了全部的能力,可以描述任何事物。用舊的方式雖然可以快速獲取數據和過程,但它們不是電腦,延遲優化和分析某些行為是否合理的能力會突然丟失。換句話說,總有真實對象保留著能力去模擬你想要的東西,并把它發送到周圍環境中...... 而且RCATWD還提供了兩個方向上的完美保護。我們能夠從網絡(可能是工作中唯一真正面向對象的系統)的硬件模型中了解這種思想。你只需要簡單的接受消息格式的約定,就可以免費獲得語言的擴展性。我在70年代的想法是,我們一起在互聯網上工作并進行個人計算,這是一個非常好的可擴展的設計,而且我們還可以通過虛擬機構建虛擬網絡,通過硬件機器進行緩存等。非常糟糕的是這些想法并沒有得以實現。
如果‘真實對象’是RCATWD,那么就可以使用編程語言以最恰當的方式實現每個對象的內在特性,這將為‘多語言編程’賦予新的含義。