閉包是‘窮人’的對象
盡管很多人認為,對象是‘窮人’的閉包,但實際上,閉包是‘窮人’的對象。
從一種角度來看,這是事實,當在一種沒有閉包功能的語言里使用特殊處理的對象來達到閉包效果時,我就會想到這些。 我們可以把閉包簡單的看成一種這樣的資源:通過某種方式把自己的各種功能簡單參數化的對象或接口。 想在Java或C++里嘗試函數式編程的人都會遇到這種情況 – 這樣可以實現其功能,但很別扭。 如果你確實要實現一個這樣的功能(例如Scheme語言里的map somefun mylist功能),那么,語言里能夠用簡單的幾句話定義出可執行的“對象”(閉包)的特性是十分讓人省心的。
但是從另外的一種觀點來看,就像Scheme語言里的閉包能夠 apply “函數方法” 一樣,可以被當作一種低級底層的方法調度機制,因此,閉包可以、而且肯定能夠用來實現非常有實際作用的具有多個方法的對象語義。 Oleg Kiselyov 曾發表過一個簡短的文章論述這個問題: http://okmij.org/ftp/Scheme/oop-in-fp.txt 。通過這種方式,我們可以認為閉包比對象更富有能力,因為它比那些僅單純依靠語言提供的方法調度機制語法支持更多的功能。 閉包,看上去就像是一個代碼塊,但可以用來實現對象,很明顯可以得出,對象是窮人的閉包。
但一個Smalltalk語言開發者會說:稍等,既然你不惜麻煩的在你的語言里用閉包實現這個玩意,而這個玩意也很像對象,那為什么不再花點功夫、用點力 去讓它們成為能夠擁有任意數量的方法的“真正的”對象呢? 由此可以看出閉包只是一種特殊情況下的對象。如果你的語言里只是擁有這些功能有限的閉包,而你又要強制使用其來實現一個對象系統,那很明顯,閉包是窮人的 對象了。
正因為這兩種對立的關系, 我感覺閉包和對象之爭真有點禪的意思。我想借取禪心,將 Norman Adams (“對象是窮人的閉包”這個論斷的發明者)和 Christian Queinnec (“閉包是窮人的對象“說法的發明人) 合并成一個叫 Qc Na 的禪宗身上,編出一段故事。而將我自己以一個謙虛的學生的身份插到故事里。 這樣做是因為,我在這里 http://www.ai.mit.edu/~gregs/ll1-discuss-archive-html/msg01488.html 最后一段也說過這些 …我覺得在考慮這兩個顯然完全對立的說法時,受到了很多的啟發,就像下面說的:
* * *
受人尊敬的大師 Qc Na 和他的學生 Anton 走在一起。為了能和大師發起一次討論, Anton 說道:”大師,我聽說對象是個非常奇妙的東西 – 是真的嗎?“ 大師不屑的看了他的學生一眼,回答道:”蠢孩子 – 對象僅僅是窮人的閉包。“
被責罵后,Anton 辭別了大師,回到了自己的小房間里,熱情的學起閉包知識。 他認真的閱讀了所有的”Lambda: … 權威大全”系列文章以及相關資料,而且用Scheme編譯器實現了一個小的以閉包為基礎的面向對象的語言系統。 他明白了很多事情,急切的想告訴他的老師自己取得的進步。
就在之后的一次跟大師的走路時,Anton 期望讓大師對自己留下深刻印象,說到:”大師,我已經認真的學習了那個東西,現在我知道了對象真的是窮人的閉包。“ 大師用手杖打了一頓 Anton, 說道:”你什么時候明白了?閉包是窮人的對象。“
這回,Anton 終于開竅了。
來自:http://www.vaikan.com/re-whats-so-cool-about-scheme/