面向對象的哲學思考
01-30
題記:實際上在我想寫這篇文章之前,特意搜索了一下「面向對象 哲學」這倆關鍵詞,竟然發現有幾百篇論文、十數篇博文都在探討這個問題。好吧,我是在讀馮友蘭的《中國哲學簡史》一書中關於「名家」的章節時,大腦中浮現出了面向對象思想,於是就有了這篇文章。---「名家」,以辯論「名」和「實」的問題為中心,而形成學說,代表人物公孫龍的《白馬論》就是一個著名的哲學命題。n
《白馬論》反映的不僅僅是邏輯思辨,更是「名」與「實」的哲學思考,這和柏拉圖的唯實論(Realism)有共同的地方,柏拉圖認為,這個世界是兩部分存在的,一種是完美概念世界;一種是現實世界,其中萬事萬物都是對完美事物的不完美再現。所以他說,世界上無法找出兩片相同的葉子。n而公孫龍認為:
推薦閱讀:
「白馬非馬」,這個命題很有意思:n
問:可以說白馬與馬不同嗎?n
答:可以。n問:為什麼?n
答:「馬」是對物「形」方面的規定,「白馬」則是對馬「色」方面的 規定,對「色」方面的規定與對「形」方面的規定性,自然是不同的。「所以說,對不同的概念加以不同規定的結果」白馬與馬也是不同的。n此處省略幾百字,感興趣的朋友自行搜索「白馬非馬」
當然,公孫龍生活的先秦時代比柏拉圖早幾百年,但是我們如果按唯實論的觀點來看的話,「馬」就是「共相」,是綜合了所有馬的相似之處,不管是白馬還是黃馬還是黑馬,它是存在於柏拉圖完美世界中的那個完美概念,也就是「名」。「白馬」,就是「殊相」,就是「馬」這個完美概念在現實世界的不完美再現。n而柏拉圖的學生亞里士多德認為,並不存在完美和不完美這兩個世界,我們之所以能區分不同的事物而且分類,是因為事物之間存在的共性,所謂的「共相」並不能獨立存在於「實體」之外,「共相」只是存在於我們頭腦中的概念而已,真正存在的只是實體。亞里士多德的這種學說,叫做「唯名論」。n當然,除了柏拉圖的唯實論,後續還有其他唯實論學說,比如極端唯實論:斷言共相具有客觀實在性,共相是獨立於個別事物的第一實體,共相是個別事物的本質或原始形式。n唯名論和唯實論之爭在歐洲中世紀持續了幾百年,但是我們這篇文章,並非要深入的探討這個,感興趣的同學,可以進一步了解相關的哲學內容。這些哲學思考,是哲學家們對我們生活世界的偉大思考,他們作為人類本身,在無知(人類並不認識這個世界的本源)的情況下,對這個真實世界(我也不知道是否真實,誰知道人類是不是也活在矩陣中,連馬斯克都這麼想)做出這樣的思辨,但是世界還是照常運轉,不會受這些哲學家的影響。而我們程序員就不同了,程序員面對的是虛擬世界,我們可以根據我們的思想來對這個世界的運轉方式做出影響。那麼我們來看看,唯名論和唯實論對應到虛擬世界是怎麼樣的。n
- 馬,是一種共相,它是獨立存在的,因為它和白馬進行比較。
- 白馬,是一種殊相,雖然也是獨立存在,但除了白馬,還有黑馬、黃馬等其他殊相存在。
我們知道,編程語言有很多範式:面向過程、面向對象和函數式。面向過程看待世界的方式,是這個世界只存在數據和邏輯,數據只需要根據邏輯進行修改就可以了。而面向對象,則是對現實世界的一種映射。函數式,基本是以數學方式來看待這個世界。n
開篇已經說過,在看「名家」相關哲學命題的時候,我自然的就聯想到了「面向對象」。什麼是面向對象呢?面向對象包含兩個重要的概念:n
- 類:具有相同或相似性質的對象的抽象就是類。
- 對象:對象是人們要進行研究的任何事物。對象的抽象是類,類的具體化就是對象,也可以說類的實例是對象。
類,其實就是上面哲學論題中所說的「共相」。而對象,就是上面所說的「殊相」。類和對象的關係,實際上就是「名」和「實」的關係。我並非要強行的把面向對象和上面的哲學思想進行融合,我只是在思考過程中感覺到奇妙,更奇妙的一點是,如果把面向對象中「名」和「實」的關係,按「唯名論」和「唯實論」來區分的話,我們能看到就是兩種不同的面向對象實現:Java/Ruby 和 Javascript。
這樣來看面向對象,還是挺有意思的。註: 本文只是一些隨想,如讀者認為哪有錯漏,請幫忙指出,多謝!Java中,你可以直接創建類,也可以創建抽象類。但是Java里類不是對象,類只是一種概念,是一種類型。按柏拉圖的唯實論來看,類和對象,是分別處於兩個世界中的存在。類作為那個完美的概念存在,而對象則是由這個完美概念對應的不完美實現。
對於Ruby,你也能創建類,但是不可以創建抽象類,沒有這種東西的存在。Ruby中,一切皆對象,當然,類也是對象。按「極端唯實論」來看,類本身是第一個存在的共相實體,先有這個「共相」才有實體對象的存在。
其實再看看Javascript實現的基於原型的面向對象,按唯名論來看,沒有類,只有對象實體,類只是作為一種「概念」,並不真實存在,實際上你創建對象都是從原型對象拷貝的「殊相」。
推薦閱讀:
※沒有基礎的人可能在三天內用 C++ 編出一個簡易的軟體嗎?
※怎樣才能讓c#寫的程序不被反編譯?
※Python GUI教程(二):添加窗口小部件到圖形用戶界面GUI中