《松本行弘的程序世界》淺讀筆記

雖然目前對ruby不感興趣,但這本書還是相當值得一讀的。裏面很多編程思想,和語言本身沒太大的關係,但讀來收穫頗豐。衆多面嚮對象語言的編程思想雖不盡一致,但是無論那種面向對象編程語言都具有以下的共同功能:

  • 不需要知道內部的詳細處理就可以進行操作(封裝,數據抽象)
  • 根據不同的數據類型自動選擇適當的方法(多態性)

對象是現實世界中具體物體的反應是一個很大的誤解。如果把面向對象編程當作是對結構化編程的擴展,那麼對象是否是顯示世界中具體物體的反應就不重要了。結構化編程通過整理數據流,提高了程序的生產效率和可維護性。同樣,面向對象編程通過對數據結構的整理,提高了程序的生產效率和可維護性。

編程語言的數據類型分爲兩類,一類是起源於FORTRAN的指定了變量或算式數據類型的靜態類型,另一類是起源於Lisp的動態類型。 靜態類型最大的優點是在編譯時能夠發現類型不匹配的錯誤。另外,程序中如果明確指定了數據類型,那麼編譯時可以用到的信息就很多。利用這種信息可以在編譯時對程序做優化,提高程序執行速度。 動態類型很簡潔,得益於簡潔,我們在編寫程序的時候就不用考慮數據類型這些無關本質的部分了,而是可以集中於程序處理的本質部分。(從硬件角度,計算機可以處理的類型只有二進制。在彙編中,數據類型都是整數。而高級語言,是在此基礎上的一層層抽象而已。備註:只處理二進制的說法只是一個概念。實際上CPU可以直接處理浮點小數等整數以外的類型)

動態類型程序執行時要做類型檢查,而且動態類型的編程語言大多是邊解釋源代碼(轉換成內部形式)邊執行;靜態類型的編程語言大都通過編譯把程序源代碼轉換成可以直接執行的形式。這種編譯型處理和解釋型處理的區別也是影響程序執行速度的原因之一。

表達動態類型靈活性的概念是Duck Typing,源自西方格言: If it walks like a duck and quacks like a duck, it must be a duck(走起路來像鴨子,叫起來像鴨子,那麼它就是鴨子)。從這裏可以導出這樣的規則:如果行爲像鴨子,那麼不管它是什麼,都把它看作鴨子。根本不考慮一個對象屬於什麼類,只關心它有什麼樣的行爲(它有哪些方法),這就是Duck Typing。

過程化編程方式編寫的程序是在改變變量值的同時進行計算的,因此需要一直注意這個變量的值現在是什麼,並據此來預想計算過程;函數式編程方式並不改變變量的值,不包含狀態或者動作信息,僅僅是對想做什麼加以描述。這種不是描述動作,而是描述性質的編程方法稱爲聲明式編程。聲明式編程是函數式編程的一大優點。如果看不懂上面的話,可以結合下面求階乘的兩種方式,再品讀一下:

{%highlight ruby%} def fact(n) fct = 1 while n > 1 fct = fct * n n = n - 1 end fct end

def fact(n) if n == 1 1 else n * fact(n - 1) end end {%endhighlight%}

可以看到,其實第二種方式就是在描述階乘的定義。

Lisp的很大特徵在於其S式記法。S式無與倫比的優點是它的徹底統一性。也就是說,對Lisp而言,不管什麼都可以統一成 (函數 參數)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章