本來想象著寫一整篇「面向?qū)ο缶幊趟枷氲恼軐W(xué)起源」這樣的題目,筆走紙上,方才發(fā)現(xiàn)這樣的題目足夠出本書,知識(shí)不夠,寫不動(dòng)。但心里還是想寫點(diǎn)自己的所思所想。
全篇就拿JAVA來舉例了。眾所周知,面向?qū)ο蟮乃拇蠡疽兀撼橄螅ˋbstract)、封裝(Encapsulation)、繼承(Inheritance)、多態(tài)(Polymorphism)。
很多人堅(jiān)持《邏輯學(xué)》是唯物哲學(xué)的基礎(chǔ),不懂,姑且不論。哲學(xué)就是對(duì)自然學(xué)科的抽象,看柏拉圖,更感覺哲學(xué)是在關(guān)心自然與人類的一種思辨;邏輯是一種工具,可直接參與到現(xiàn)實(shí),指導(dǎo)人們的生產(chǎn)生活。關(guān)于邏輯的詳細(xì),可以去讀一讀殷海光(〈殷海光哲學(xué)與文化思想論集〉南大出版社,推薦一下)。按照我的理解,哲學(xué)就是把人類的各種經(jīng)驗(yàn)總結(jié)起來,經(jīng)高度提煉與縝密辯證之后,寫成定義之類的文字,編纂成典,供查看,可使后來的人少走些彎路。
不知道說亞里士多德是邏輯學(xué)的開山鼻祖正確與否,古希臘的智慧真是百花齊放。廢話少說,先看看一些定義——手上的書是三聯(lián)書店在1951年出版的,維諾ge拉多夫,庫茲明合著,劉執(zhí)之譯,滿篇繁體——「人類對(duì)自然和社會(huì)的認(rèn)識(shí)是從物質(zhì)世界的對(duì)象對(duì)感官直接作用的結(jié)果所發(fā)生的感覺(Sensation)開始的。感覺是我們的意識(shí)對(duì)物質(zhì)對(duì)象的這種或那種性質(zhì)例如硬度、顏色等的反映?!?/p>
感覺很重要,是我們認(rèn)識(shí)事物的第一步。人類可以發(fā)展「第六感」,可見,人類認(rèn)識(shí)世界的潛力有多大。我們的感覺,是來自對(duì)「對(duì)象」的反應(yīng)。對(duì)象很重要,我們從世界的千萬對(duì)象中,通過比較,認(rèn)識(shí)總結(jié)了事物,并分成類別,打個(gè)比方,生物學(xué)上的門綱目科屬種,就是對(duì)自然界生物(對(duì)象)經(jīng)過長期的認(rèn)識(shí)總結(jié)之后,逐漸對(duì)它們產(chǎn)生了認(rèn)識(shí),這個(gè)認(rèn)識(shí)的層次,就是抽象的層次,就對(duì)應(yīng)產(chǎn)生了不同層次的概念,最終出現(xiàn)了上面的分類,越上層,抽象層次越高,概括越強(qiáng),概念的內(nèi)涵越廣,在面向?qū)ο蟮脑O(shè)計(jì)中,就體現(xiàn)為接口。
門綱目科屬種,是分類出來的,是概念的范疇,隨著人們對(duì)客觀世界生物認(rèn)識(shí),從種的概念一直抽象到門的概念,門便是此類概念的最高抽象,「門」便可以對(duì)應(yīng)于OOP中的接口。類和概念,某種程度上是同義詞。
Bruce Eckel在其經(jīng)典著作 Thinking in Java中講:Everything is an object(萬事萬物皆對(duì)象)。大家將此話視為「毛主席語錄」,久誦成典。在邏輯學(xué)中早有此解釋:「我們周圍現(xiàn)實(shí)環(huán)境中的事物和現(xiàn)象,在邏輯中叫做對(duì)象(Object)」?,F(xiàn)在,我們可以大致從邏輯學(xué)中看出面向?qū)ο笏枷氲恼軐W(xué)脈絡(luò)了。Bruce把哲學(xué)的語言文學(xué)化,兼具感染力。
對(duì)象之所以有意義,是因?yàn)榭梢员桓杏X,因?yàn)樗摹复嬖凇?。一個(gè)物體占有空間和時(shí)間,才能在宇宙中確立它的坐標(biāo),表示它的存在。這個(gè)不消多說。在計(jì)算機(jī)世界,各種軟件硬件環(huán)境組成了一個(gè)虛擬世界。一個(gè)程序,只以概念(類的源碼)形式存儲(chǔ)在硬盤上,有什么意義呢?我們要讓這個(gè)程序運(yùn)行起來,執(zhí)行他的工作,才算是賦于它以意義,寫這段代碼的人,也算是血汗沒白流。所以,我們要讓這些源碼中的類(概念),對(duì)象化,讓其存在,運(yùn)行,才有其意義。我們常用new關(guān)鍵字來對(duì)象化一個(gè)類,對(duì)象化,就是初始其占有空間,當(dāng)其某個(gè)方法被調(diào)用時(shí),產(chǎn)生了「行為」,占用了CPU的時(shí)間,很好,占有內(nèi)存空間和CPU時(shí)間,確立了它在內(nèi)存中的坐標(biāo),表示它存在,自此始,它有了意義。
同理,若一個(gè)對(duì)象在內(nèi)存中失去了意義,便可以調(diào)用析構(gòu)(destructor)方法(注:JAVA中的垃圾收集機(jī)制,可以自動(dòng)回收無意義的對(duì)象),釋放空間與時(shí)間的占用,讓給其它的有意義的對(duì)象。人類亦是如此,每個(gè)活人皆是對(duì)象,死掉了,要注銷戶口,釋放其占用的空間與時(shí)間,讓給八零后的新一輩。
我這樣理解,概念就是對(duì)客觀世界中具體對(duì)象(Objects)的抽象,概念也是一組數(shù)據(jù)而已,概念可用數(shù)字來表達(dá),概念闡述了地球上的人類對(duì)其周遭世界的看法,概念就是歸納,概念就是類(OOP中的概念,類class更準(zhǔn)確理解為類型type),概念可以回歸世界的對(duì)象中,概念是人們?cè)谶壿嬌险J(rèn)識(shí)事物的第一步,是最小「單位」。書中這樣定義:
「概念就是反映對(duì)象之一般的和本質(zhì)的屬性的思考(對(duì)象的本質(zhì)屬性就是表現(xiàn)對(duì)象的根本性質(zhì)的那種屬性)?!?/p>
亞里士多德最早闡述了類的概念,例如「鳥類」、「魚類」??吹揭蝗壶B,就有了感覺去比較,區(qū)分,最終認(rèn)識(shí)他們。比較非常重要——「事物首先是靠比較法來認(rèn)識(shí)的。」
所以在JAVA的宇宙類Object(對(duì)象,物質(zhì)的意思)類中,有equals的方法。所有的類都要繼承Object類,equals的意思,就是用來實(shí)現(xiàn)程序中兩個(gè)對(duì)象的比較。順便再闡述一下比較(Comparison)的定義:
「這是用以確定客觀世界的對(duì)象、現(xiàn)象的類似之點(diǎn)和差異之點(diǎn)的一種邏輯方法?!?/p>
簡(jiǎn)單地說,概念是怎么得到的呢?通過抽象。
「抽象(Abstraction)——這是我們用以思維地分出對(duì)象,現(xiàn)象的本質(zhì)性質(zhì),而抽去對(duì)象和現(xiàn)象的非本質(zhì)的,副次的性質(zhì)的一種邏輯方法?!?/p>
和概念的定義大體上一個(gè)意思。在任何一個(gè)思考過程中,不使用抽象,是不可能的。當(dāng)我們寫程序的時(shí)候,寫一個(gè)「飛機(jī)」的類(也就是寫一個(gè)「飛機(jī)」的概念出來,只不過概念的書寫語言不是英語或漢語,是一門程序語言如C或JAVA罷了),首先就要「抽象」了,看我們面向?qū)ο蟮乃拇筇攸c(diǎn)之第一,便是這個(gè)抽象。
當(dāng)我們寫一個(gè)「飛機(jī)」的類,我們就會(huì)去觀察盡可能多的飛機(jī)(對(duì)象),因?yàn)橛^察的數(shù)量與程度,與對(duì)飛機(jī)這個(gè)概念的認(rèn)識(shí)深度有直接關(guān)系,對(duì)后來的總結(jié)抽象,至最終的概念,都將起重大作用。像我們只觀察了飛機(jī)的外表,若觀察過內(nèi)在的機(jī)理(如發(fā)動(dòng)機(jī)),這個(gè)概念可能就要有些變化。我們研究抽象出了第一步——飛機(jī)有機(jī)翼、機(jī)身、起落架等等,隨著觀察數(shù)量的增多和觀察程度的深入,我們又對(duì)飛機(jī)的抽象加深一步,增加了發(fā)動(dòng)機(jī)、駕駛艙等屬性。
概念與語詞,需要說一下,我們對(duì)概念的語詞,像上面我們定義「飛機(jī)」的概念,飛機(jī)就是語詞。概念的語詞,多為名詞,思維自然而然會(huì)做好這些事情。屬性也皆為名詞,方法是動(dòng)詞。一個(gè)類中,屬性的作用就是存儲(chǔ)數(shù)據(jù),方法(或函數(shù))的作用便是操作這些數(shù)據(jù),退一步講,就是動(dòng)詞對(duì)名詞的修飾。類名作主語,名詞謂語,組成一個(gè)完整的語句,同時(shí)也是一個(gè)完整的概念。以動(dòng)詞為名的方法的意義,是當(dāng)概念回歸時(shí),具體對(duì)象所表達(dá)的行為模式。如我們抽象了飛機(jī)的概念,我們可憑此概念去判別客觀世界中的某一物體是否為飛機(jī),但是飛機(jī)本身客觀存在的意義又是這個(gè)具體對(duì)象的意義——它可以運(yùn)輸貨物,或執(zhí)行戰(zhàn)斗任務(wù)。起飛時(shí)收起起落架,降落時(shí)打開起落架,其中「收起」、「打開」便是一種行為,是這個(gè)「飛機(jī)」類的方法。方法是動(dòng)詞命名,代表一種行為,修飾限制其屬性,屬性為名詞,構(gòu)成動(dòng)賓結(jié)構(gòu)。
言歸正傳,對(duì)于屬性,如果大家對(duì)面向?qū)ο蟮木幊搪晕⑹煜?,便知它的意義了。
「對(duì)象的品質(zhì)和特性在邏輯上叫做屬性?!?/p>
上面我們?cè)凇革w機(jī)」的抽象中,列舉了諸如機(jī)翼、起落架,發(fā)動(dòng)機(jī)等屬性,這都毫無疑問的是飛機(jī)的「品質(zhì)和特性」了。
看來面向?qū)ο蟮木幊趟季S確實(shí)有清晰的哲學(xué)源頭的。我們?cè)趯憽革w機(jī)」這個(gè)類時(shí),寫了上述的屬性,然后非常自然的封裝起來。就是我們?cè)诙x屬性時(shí)寫的private(私有的)、public(公有的)、protected(受保護(hù)的)等修飾符(modifier),這些修飾符,只是為了限定類的屬性的開放程度。例如private的屬性,在繼承的類(概念)中是不能夠被直接使用的,這個(gè)封裝的哲學(xué),與邏輯學(xué)本身不好說有直接關(guān)系。但是卻有著來自對(duì)生物學(xué)的深刻模仿。
繼承,是模仿了生物學(xué)上的繼承。后代繼承父輩基因,具有父輩的某些生物學(xué)特征。例如,我們抽象了飛機(jī)出來,飛機(jī)的祖宗是萊特兄弟的那一架,后來生產(chǎn)出來的,就是對(duì)萊特兄弟的飛機(jī)的概念的不斷豐富。假設(shè)我們寫了一個(gè)萊特兄弟的「飛機(jī)」類(概念),后來我們目睹了飛機(jī)的發(fā)展,我們就要不斷的寫新的類,繼承自這最初的「飛機(jī)」。這些繼承的類(概念)出現(xiàn)了更多的特點(diǎn)和品質(zhì),所以,我們要加。例如出現(xiàn)了噴氣式飛機(jī),就要增加渦輪發(fā)動(dòng)機(jī),出現(xiàn)了隱形戰(zhàn)斗機(jī),我們要加涂裝材料這個(gè)屬性,出現(xiàn)了水上飛機(jī),就要繼承或添加一些關(guān)于船的屬性——雜交也是可以的,像騾子。
當(dāng)我們?cè)诟割悾ǜ赣H)的屬性上用了private的修飾符,就是說,這個(gè)屬性,是個(gè)隱性基因,隱性遺傳到下一代。下一代不能直接表現(xiàn)出來這些屬性(品質(zhì)、特點(diǎn)),當(dāng)然也不能使用。雖然如此,這些基因(屬性)到底還是被繼承了。只要不實(shí)行如此嚴(yán)ge「封裝」,子類(兒子)便擁有從父類(父親)繼承來的一切特點(diǎn),父親能做什么,兒子也同樣可以(沒有基因突變一說,畢竟CPU要嚴(yán)ge行事,否則,真成了智能計(jì)算機(jī)了,人類到這一步,恐怕還有一段路要走)。
父親有十個(gè)兒子,十個(gè)兒子各自繼承了父親的品質(zhì)(類的屬性)和行為(類的方法),又各自有自己的特點(diǎn),例如,都有胳膊腿兒,父親會(huì)用它們來耕作勞動(dòng),兒子們可能各異稟賦,或棍棒武術(shù),或翻書寫字,或雕刻打磨,或裁補(bǔ)設(shè)計(jì)——總會(huì)產(chǎn)生新的特點(diǎn),就需要在方法中重新來寫這個(gè)邏輯(行為邏輯),于是,在定義了新的行為之后,區(qū)別于父親。當(dāng)父親ming令兒子們:都給老子去活動(dòng)活動(dòng)手腳——便有的裁剪衣飾去了,有的舞槍弄棒去了,有的則搖頭晃腦之乎者也去了。這就是多態(tài)(Polymorphism),就是一個(gè)屬性本來所表現(xiàn)的狀態(tài),由于繼承,由于概念被豐富了,產(chǎn)生了不同的行為狀態(tài)。多態(tài)是由于繼承的發(fā)生,繼承本身,就是對(duì)概念的豐富和完善——新的飛機(jī)出來了,有了新的屬性和功能,那么舊的飛機(jī)類型派生出來新的飛機(jī)類型,來解釋當(dāng)下飛機(jī)的新的概念。多態(tài)是繼承的結(jié)果,是一個(gè)進(jìn)化的過程。因?yàn)椋澜缈偛荒軌蚯宦?。靠近海灘的螞蟻,生出翅膀來,?duì)生物存亡有重大意義,這個(gè)螞蟻的概念,就要拓展。
于是整個(gè)面向?qū)ο笏拇笠氐恼軐W(xué)脈絡(luò),便可觸可摸了。實(shí)用哲學(xué),有其現(xiàn)實(shí)意義,作為一種科學(xué)的工具,當(dāng)仔細(xì)研究。至于其它,看不懂;看懂的,十之八九不是瘋子,就是真正的哲學(xué)家。只總結(jié)最近的一些思考,雜亂,不堪再寫,到此為止。
新聞熱點(diǎn)
疑難解答