半個月以前買了這本書,仍是經園子裏的一位網友推薦的。到如今看了一半多,基礎的都看完了,剩下的幾章可作高級部分來看。這本書看到如今,能夠說感觸很深,必須作一次讀書筆記!javascript
關於這本書,不瞭解的能夠去網上查查。做者是Ruby語言的創始人,可謂是程序世界中的高手,開卷有益,無論你是哪一個層次的編程人員,相信都能或多或少的汲取到你想要的養分。html
下面將總結一下看完本書我記錄下的一些知識點。有的是書中的原話,有的是我我的的理解,供參考。java
2.1 多態性python
面向對象三大原則:繼承、封裝和多態,其中最重要的技術是「多態性」,多態每每會用繼承來表現,而封裝又保證多態的獨立性。多態性可讓程序只關注作什麼,而不是關注怎麼作。根據狀況的不一樣,自動選擇最合適的方法來處理。多態也是程序擴展性的基礎。jquery
2.2 歷史程序員
面嚮對象語言從60年代的Simula,到70、80年代的SmallTalk,直到後來的C++和java,java是最成功、應用最廣泛的面嚮對象語言。本人用C#,和java差很少。UML是描述面向對象方法設計模型的圖示方法(不會UML的抓緊補補吧,這也算是基礎了)。web
2.3 結構化編程ajax
在好久好久之前,一些比較低級語言,是經過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.1 閉包
「閉包」這個詞,我是在js中第一次接觸的。不過看來業界通用這個詞彙,大致意思就是應用外部的變量和環境,和js中同樣。做者提到Ruby中能夠經過傳遞程序塊的方式實現閉包,我沒有仔細去看細節。不過讀到這裏,我想起了如下幾點:
01. jQuery源碼中用到了大量的閉包,瞭解到js中的閉包會影響到性能和內存。因此,我之後將會很是注意jQuery中閉包的使用,真正深刻了解閉包;
02. C語言的函數指針是閉包嗎?
03. C#和java中,哪些用到了閉包?
之後再遇到這種問題、知識點,將關注如下。
3.2 for循環
Ruby中實現for循環的方式是 obj.each(....) 這種方式,和jquery的each循環相似。做者在本章節的後面提到「不用for語句」,由於for語句會破壞對象的封裝性。其實這一點在設計模式中也有專門的解決方案——迭代器模式。
首先,書中沒有一個一個挨着講每一個設計模式。有興趣能夠看看我寫的關於設計模式的博客:
你們最好要知道,「設計模式」一詞來源於建築業(曾經是我比較嚮往的專業,呵呵)。你們常說的設計模式,通常是指《設計模式.可複用軟件的基礎》一書中提到的二十三中設計模式,做者們是GoF。其實這些設計模式並非做者們創新出來的,而是他們總結當時平常設計工做中,最經常使用的23中模式,給他們分組、取名,最後成就了一部偉大的做品。因此,GoF作出的貢獻就是將本來沒有名字的東西,給他們起名字,並讓他們成爲結構化的知識。這是件很了不得的事,例如美國PMI將平常項目管理工做總結爲10大知識領域5大過程組同樣。
4.1 設計模式和類庫
類庫是把經常使用的算法、接口封裝起來,供系統其餘模塊使用,或者供其餘系統使用,它能夠「0成本」重用的。但設計模式的重用,卻不是「0成本」,它是一個很抽象的東西,你要根據實際狀況來具體肯定。
4.2 開放-封閉 原則(簡稱:OCP)
業界有5大設計原則,其中最重要的就是「開放-封閉原則」——即對擴展開放、對修改封閉。瞭解設計原則能夠查閱:換種思路去理解設計模式(上)
這裏所謂的「對擴展開放」,在面向對象編程中是經過繼承和多態來實現的,繼承容許功能的添加,多態保證接口的穩定性。從實用主義的觀點來看,面向對象的精髓就在於對OCP的實踐。至於把對象看作物體理解起來比較容易,可以創建現實世界的模型等,只不過是一些錦上添花的東西。
一個優秀的設計模式,確定能經得住OCP的考驗!
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.1 MVC
感受做者本文中只是講述了MVC這個理念,並用小例子解釋。因爲我沒有真正參與過MVC的項目,也只是平常的瞭解,因此對這塊感觸不是很深。
6.2 猴子補丁
所謂的「猴子補丁」,其實就是C#中的部分類和擴展方法。在不改變原來代碼結構的基礎上,添加新代碼。我的不建議這種作法,若是重複這樣作,將會致使代碼鬆散難以維護。
-----------------------------------------------------------------------------
推薦一下我錄製的《asp.net petshop4.0源碼解讀》教程,免費學習!
-----------------------------------------------------------------------------
今晚先到這裏,明天繼續寫:
7. 文字編碼
8. 正則表達式
9. 整數與小數
(我的感受「文字編碼」和「整數與小數」兩章,做者介紹的很好)