物件導向程式設計的一些思考

God Is Coder發表於2013-11-15

這段時間一直都在學習python,主要目的還是打算學習一門網際網路的程式語言,為後續的職業生涯做一些規劃,畢竟java在網際網路除了電商領域有叫廣泛的使用場景之外,在網際網路其他領域還不是很普及,並且java太重量級了。而python在相對來說輕量級並且易於使用,很適合網際網路產品快速迭代開發方式。

個人之前接觸的唯一一個純物件導向程式語言就是java,以至於很長一段時間內,我都以為物件導向程式設計的模型應該都是以java這樣為基礎的,直到看了javasript和python等以函數語言程式設計為主,支援物件導向程式設計的語言,才更深的瞭解物件導向的程式設計本質。

什麼是物件,對於物件的理解,我感覺就是具有某些特性的物質,比如說狗。而物件導向程式設計最大的特點就是 把 物件的屬性和它相關的行為進行封裝,比如狗的品種就是狗的屬性,但是狗叫就是狗的行為。我們把這兩個特性封裝到一個具體的物件裡面,就構成了物件導向的程式設計的基礎。如果把物件的屬性稱作資料,物件的行為成為函式,那麼資料就構成了物件的狀態,同一個物件中的資料可以有很多不同的版本,資料是變化的,函式是不變的,只不過這個函式就是屬於這個物件的。

但是物件的行為一定非要和物件繫結嗎?是不是可以脫離物件而獨立存在了。比如我們說狗叫,那麼叫這個動作,一定非要和狗繫結嗎,是不是也可以和人繫結的?還有就是比較兩個數的大小,這個行為的物件是誰 ? 通過這些思考我們發現,很多時候行為和可以獨立物件獨立存在的,這些獨立存在的行為不屬於任何物件,或者我們並不需要關心他屬於誰,只需要關注他的目的是什麼即可。

以上兩個問題在java裡面都反映的比較明顯,static關鍵字用來表明這個行為不和任何物件繫結,比如public static void main ,這個main方法就不屬於定義它的class所對應的物件。還有java裡面的Math類,這個類裡面的方法都是public static的,說明這些方法都不屬於任何物件。而java是純物件導向的,只能把這些不屬於任何具體物件的定義為static,而其對應的class類,感覺給他定義了一個名稱空間而已。

python中的物件導向的設計感覺比java要複雜,但是通過和java物件導向的設計相比,能夠讓你更深入的瞭解物件導向程式設計的核心。python中 class如果定義對物件的行為,第一個引數比如為self。當初自己對這個設計理解很不理解,為什麼弄的這麼複雜,後來想想物件導向思想是什麼,突然就明白了,這個self就是資料,方法就是行為,這個行為要和某個物件繫結,只不過java裡面幫助我們省去了這個過程,通過建立物件的語法new XXXClass 自動進行繫結。java是靜態的,一旦方法和資料進行繫結,這個繫結關係就不會發生改變,但是python繫結關係就可以進行改變。如果方法引數中沒有self,那麼這個方法就和java裡面的static方法類似,表示這個方法屬於某一個類,不屬於某個物件。

而javascript物件導向設計就是更有意思了,建構函式本身就是一個function,通過function.apply方法和具體的物件進行繫結,在javascript中用this來表示function所繫結的物件。

而在scala中,物件的方法和class 對應的static方法就完全分開了。更確切的說,class對應的static方法,就不屬於這個class,所以scala定義了object 這個概念。所有class中定義的方法都屬於物件的行為,而之前java中所有class static方法,都屬於object。兩者在語法上都已經明確區分了。個人感覺這個明顯比java,python,javascript  對static方法的支援簡潔明瞭的多。

對於物件導向的設計,不同的語言雖然不同,但是其核心思想還是相似的。但是由於程式語言所支援的程式設計正規化不一樣,實現方式差別還是比較大的。通過學習多正規化程式語言,能夠加深對這種程式設計正規化的理解。

 

相關文章