1. 前言
半個月之前買了這本書,還是經園子裡的一位網友推薦的。到現在看了一半多,基礎的都看完了,剩下的幾章可做高階部分來看。這本書看到現在,可以說感觸很深,必須做一次讀書筆記!
關於這本書,不瞭解的可以去網上查查。作者是Ruby語言的創始人,可謂是程式世界中的高手,開卷有益,不管你是哪個層次的程式設計人員,相信都能或多或少的汲取到你想要的營養。
下面將總結一下看完本書我記錄下的一些知識點。有的是書中的原話,有的是我個人的理解,供參考。
2. 物件導向
2.1 多型性
物件導向三大原則:繼承、封裝和多型,其中最重要的技術是“多型性”,多型往往會用繼承來表現,而封裝又保證多型的獨立性。多型性可以讓程式只關注做什麼,而不是關注怎麼做。根據情況的不同,自動選擇最合適的方法來處理。多型也是程式擴充套件性的基礎。
2.2 歷史
面嚮物件語言從60年代的Simula,到70、80年代的SmallTalk,直到後來的C++和java,java是最成功、應用最普遍的面嚮物件語言。本人用C#,和java差不多。UML是描述物件導向方法設計模型的圖示方法(不會UML的抓緊補補吧,這也算是基礎了)。
2.3 結構化程式設計
在很久很久以前,一些比較低階語言,是通過goto語句來執行程式碼的。C語言中有goto語句,一開始學的時候老師就不讓用。goto語句是在出現if...else...(條件判斷)和for、while等迴圈結構之前,人們用來控制程式的方法。大家試想,如果不讓你用if..else..和for迴圈,通篇都是goto,那將會是什麼結果??所以,用【順序】、【條件】和【迭代】來代替goto語句,是程式開發的一大變革。
另外提一句,如果你從事.net開發,你可能有幸解除到goto語句——IL中間語言,IL相當於.net中的彙編預研。將一個簡單的 if..else...編譯成IL之後,結果如下:
2.4 資料抽象化
前面講到程式結構從goto語句中解放出來,那麼程式所操作的資料結構呢?也需要有一種抽象的表達方式,而不是計算式世界所能理解的二進位制程式碼。最常見是我們常用的陣列、連結串列、字典等結構。其實,嚴格來說,程式中的整數、浮點數、各國的語言文字,都是資料抽象的結果。因為計算機只認識二進位制字串。
2.5 多重繼承
如果你是一名java、C#開發人員,你用不到多繼承,因為他們根本就不提供。但是有些語言是支援多繼承的,C++、python。現實世界中需要多繼承,例如以為程式設計師同時也可能是一位作家,一個部門經理同事也可能是一位父親。但是多繼承如果開放到程式中,就會帶來許多問題。允許一個類有多個父類,複雜度可想而知,因此java禁止使用。但是它用什麼來彌補這一缺失——介面interface。
至此,大家要了解介面是因為什麼才來到這個世界——因為彌補進位制使用多繼承而帶來的問題。但是介面真的能很好的解決這個問題嗎?不見得。因為介面畢竟不能像父類那樣使用。
Ruby中沒有介面(不是所有物件導向語言都有介面的),它通過引用程式塊的方式來實現多繼承。我沒有深入瞭解Ruby的這塊功能,有興趣的朋友可以研究。
2.6 物件導向是現實世界中具體事物的反映嗎?
作者認為,對“物件導向”最好的解釋是“對資料的結構化”。前文講到結構化程式設計是將程式流程分為順序、條件和迴圈三種結構,而物件導向則是在此基礎上的延伸,它將程式處理的資料進行了結構化。通過物件來組織資料,資料就成為一個整體,而不再鬆散。
這是物件導向最根本的意義,如果理解這一點,那麼是否反映現實世界就不重要了。其實像陣列、字串,你也找不出現實世界的什麼東西與之對應。
程式是處理抽象資料的。無論以後學習什麼技術,都不要滿足於小貓小狗之類的例子。
另外,關於“繼承”,也不要看成是現實世界的真實反映,它就是一些抽象、公用功能的重用方法,這樣反而更好理解。
2.7 靜態語言 VS 動態語言
這裡所謂的靜態和動態,指的是資料型別的強弱。例如C#、java就是強型別,js、Ruby就是弱型別。強型別中,每個變數都有明確的資料型別,不能更改,也不能賦其他型別的值,要不然會報錯。而在若型別中,變數的型別是隨著其儲存值動態改變的。
兩者各有好壞。強型別可以在編譯時識別型別錯誤,程式執行的速度會更快,但是不靈活。弱型別靈活,但是有些潛在的錯誤不容易發現。
我恰巧C#和js都用,在我看來,這兩種方式都可以,只要你認真對待,哪個都不會出現大問題。所以瞭解即可,不必太糾結到底哪個好。
3. 程式塊
3.1 閉包
“閉包”這個詞,我是在js中第一次接觸的。不過看來業界通用這個詞彙,大體意思就是應用外部的變數和環境,和js中一樣。作者提到Ruby中可以通過傳遞程式塊的方式實現閉包,我沒有仔細去看細節。不過讀到這裡,我想起了以下幾點:
01. jQuery原始碼中用到了大量的閉包,瞭解到js中的閉包會影響到效能和記憶體。所以,我以後將會非常注意jQuery中閉包的使用,真正深入瞭解閉包;
02. C語言的函式指標是閉包嗎?
03. C#和java中,哪些用到了閉包?
以後再遇到這種問題、知識點,將關注以下。
3.2 for迴圈
Ruby中實現for迴圈的方式是 obj.each(....) 這種方式,和jquery的each迴圈類似。作者在本章節的後面提到“不用for語句”,因為for語句會破壞物件的封裝性。其實這一點在設計模式中也有專門的解決方案——迭代器模式。
4. 設計模式
首先,書中沒有一個一個挨著講每個設計模式。有興趣可以看看我寫的關於設計模式的部落格:
大家最好要知道,“設計模式”一詞來源於建築業(曾經是我比較嚮往的專業,呵呵)。大家常說的設計模式,一般是指《設計模式.可複用軟體的基礎》一書中提到的二十三中設計模式,作者們是GoF。其實這些設計模式並不是作者們創新出來的,而是他們總結當時日常設計工作中,最常用的23中模式,給他們分組、取名,最後成就了一部偉大的作品。所以,GoF做出的貢獻就是將原本沒有名字的東西,給他們起名字,並讓他們成為結構化的知識。這是件很了不起的事,例如美國PMI將日常專案管理工作總結為10大知識領域5大過程組一樣。
4.1 設計模式和類庫
類庫是把常用的演算法、介面封裝起來,供系統其他模組使用,或者供其他系統使用,它可以“0成本”重用的。但設計模式的重用,卻不是“0成本”,它是一個很抽象的東西,你要根據實際情況來具體確定。
4.2 開放-封閉 原則(簡稱:OCP)
業界有5大設計原則,其中最重要的就是“開放-封閉原則”——即對擴充套件開放、對修改封閉。瞭解設計原則可以查閱:換種思路去理解設計模式(上)
這裡所謂的“對擴充套件開放”,在物件導向程式設計中是通過繼承和多型來實現的,繼承允許功能的新增,多型保證介面的穩定性。從實用主義的觀點來看,物件導向的精髓就在於對OCP的實踐。至於把物件看做物體理解起來比較容易,能夠建立現實世界的模型等,只不過是一些錦上添花的東西。
一個優秀的設計模式,肯定能經得住OCP的考驗!
5. Ajax
ajax是web開發中比較基礎的東西,基本概念此處不再贅述。
5.1 Ajax中的“x”
“x”指的是“XML”。因為在ajax剛開始用的時候,都是用xml格式來傳遞資料,因此xml也被說成是ajax的基本部分之一。但是現在隨著json越來越流行,xml的用武之地越來越少,高版本的瀏覽器直接支援JSON轉換介面。
所以,此處瞭解即可。開發時該用什麼用什麼。
5.2 javascript——基於物件的語言
可能你會經常聽到:js是以物件為基礎的語言,所有的資料都是物件,js是基於原型的語言。對,js中沒有“類”的概念,除了基本的值型別之外,其他的資料都以物件來處理,都可以自定義新增屬性,包括函式。js是通過原型來實現所謂的繼承的。
另外,js中的閉包是比較出名的,閉包在js中的應用很多,jQuery原始碼中大量使用閉包就是個例證。
這兩個問題,不是一兩句話能說明白的,說實話我現在感覺自己知道一些,但是瞭解的不是很透徹。不過正在努力的補充。要想把js的“物件”和“閉包”講明白,我想還需要從其他方面下手,將會是一個比較系統的工程。後期我定會搞定它們,並以某種方式講出來。此處點到為止。
6 MVC和“猴子補丁”
6.1 MVC
感覺作者本文中只是講述了MVC這個理念,並用小例子解釋。由於我沒有真正參與過MVC的專案,也只是日常的瞭解,所以對這塊感觸不是很深。
6.2 猴子補丁
所謂的“猴子補丁”,其實就是C#中的部分類和擴充套件方法。在不改變原來程式碼結構的基礎上,新增新程式碼。個人不建議這種做法,如果重複這樣做,將會導致程式碼鬆散難以維護。
-----------------------------------------------------------------------------
推薦一下我錄製的《asp.net petshop4.0原始碼解讀》教程,免費學習!
-----------------------------------------------------------------------------
今晚先到這裡,明天繼續寫:
7. 文字編碼
8. 正規表示式
9. 整數與小數
(個人感覺“文字編碼”和“整數與小數”兩章,作者介紹的很好)
《松本行弘的程式世界》讀書筆記(下)——文字編碼、整數、浮點小數