讀《松本行弘的程式世界》啟發頗多

劉曉日發表於2011-09-08

早上不到10點就收到圖靈的贈書《松本行弘的程式世界》,抑制不住的得意就展現在臉上,翻開書當然就是一陣書香,又一次抑制不住笑容。非常的開心。

由於昨天去北醫三院拔牙,就背上了它,地鐵上就開始讀,當然醫院候診、公交回家也一直在看松本,看完了前兩章。用一句話形容看完的感受:激情澎湃。終於發現CSDN蔣濤為什麼推薦把前兩章公佈電子版,因為真的是極具價值。忍不住將我在拜讀時的啟發與不解與大家分享。

我將圍繞下面幾點講述:

  • code for fun
  • 物件導向的起源
  • 物件導向的三大特徵
  • 多繼承
  • 物件的模板=類
  • 動態語言與靜態語言的區別

code for fun

在松本的書出來之前,就總聽說ruby是為開發人員開發的語言,序中範凱也再次確認了這一點。“code for fun”給我的印象頗深,俗話說“工欲善其事必先利其器”,我們是不是正需要這樣一個“利器”呢。不管你們需不需要,反正我是喜歡這個初衷。我們不能再為計算機做“看門狗”,我們要翻身做主人。

物件導向的起源

自認為是物件導向粉絲的人,卻一直使用面嚮物件語言寫著程式導向化程式,更可笑的是都不知道物件導向設計方法何時被提出來的,書中提到物件導向設計方法是20世紀60年代後期,在瑞典的Simula程式語言中最早開始使用的。以前只是對Smalltalk有點點印象,卻不知道它也是在Simula啟發下的早期物件導向程式語言。物件導向博大精深啊,繼續修煉。

物件導向的三大特徵

在此之前也知道物件導向的三大特徵:封裝、繼承、多型。卻不知道抽象與封裝是一回事兒(這句可能是我的誤解,如果是,請指出)。

書中說物件導向的三大特徵是:繼承、多型、資料抽象,所以我將這裡的“資料抽象”就理解成抽象,後文中也解釋其實這裡的“資料抽象”其實就是封裝。最終我就得出結論:資料抽象與封裝是一回事兒。只是叫法不同罷了。

之前有人和我說,物件導向的特徵為:繼承、多型、封裝和抽象。一直沒搞清楚為何要將抽象放到這裡面,如今恍然大悟,很可能是他理解錯了。應該這樣描述:物件導向的特徵為繼承、多型、封裝,有時封裝也叫抽象。

當然,我在李鬆峰老師發關於松本精彩評論裡面也說了是四個。現在我正式收回那個錯誤的言論。

多繼承

多繼承是個讓人又愛又恨的東西,物件導向中比不可少的概念,卻又會帶來令人困擾的東西。

在大學裡面就灌輸了一種多繼承眾多不利的思想,比如:造成父類順序無法確定,同名方法等問題。讀松本中,有一句話將我點醒,大意是這樣:如果使用得當,多繼承不會造成關係混亂。大家不妨仔細回味一下,身邊類似的事情是不是很多!比如好多人說Hibernate的效率很低,那是不是也可以說因為使用方法不得當才造成了它的效率問題。當然這種相對於底層的東西處理、轉化過程頗多,自然會影響效率,要看它本身要解決的是什麼問題。

由於多繼承有其存在的價值,就避免不了的要去通過各種策略去實現多繼承。然後提到Java中的介面的引入就是為了解決多繼承的問題。這個我不否認,介面的確解決了Java中的多繼承問題,但是介面引入的初衷是不是要解決多繼承的問題呢?現在看來介面的作用遠遠超出瞭解決多繼承問題,比如:將宣告與實現解耦等。同樣,我在李鬆峰的關於松本精彩評論中也提到這個問題。至今我都不確定Java中引入介面的初衷到底是什麼,也請權威人士予以解答。

物件的模板=類

對於“物件的模板=類”這個觀點,我非常支援,形容的恰到好處。以前的理解是:Class是型別,物件是型別的一個例項。不是說理解錯誤,而是顯得很生硬。喜歡這個。

類就好像是做果凍的模子,而物件就是不同口味的果凍。

動態語言與靜態語言的區別

大家也總會聽到動態語言和靜態語言吧,動態語言比如:Ruby、Python等,靜態語言比如:Java、C#等。但是你知道他們之間的區別嗎?反正我現在才知道。

  • 動態型別語言:動態型別語言是指在執行期間才去做資料型別檢查的語言。

  • 靜態型別語言:靜態型別語言與動態型別語言剛好相反,它的資料型別是在編譯其間檢查的。

以上就是我讀《松本行弘的程式世界》前2章的一點感悟,如果你也有感悟何不記錄在這裡呢!

相關文章