天堂国产午夜亚洲专区-少妇人妻综合久久蜜臀-国产成人户外露出视频在线-国产91传媒一区二区三区

《松本行弘的程序世界》讀書筆記(上)

發(fā)布時(shí)間:2017-05-13 07:05

  本文關(guān)鍵詞:松本行弘的程序世界,由筆耕文化傳播整理發(fā)布。


松本行弘的程序世界》讀書筆記(上)——面向?qū)ο、程序塊、設(shè)計(jì)模式、ajax

1. 前言

《松本行弘的程序世界》讀書筆記(上)

半個(gè)月之前買了這本書,還是經(jīng)園子里的一位網(wǎng)友推薦的。到現(xiàn)在看了一半多,基礎(chǔ)的都看完了,剩下的幾章可做高級(jí)部分來(lái)看。這本書看到現(xiàn)在,可以說(shuō)感觸很深,必須做一次讀書筆記!

關(guān)于這本書,不了解的可以去網(wǎng)上查查。作者是Ruby語(yǔ)言的創(chuàng)始人,可謂是程序世界中的高手,開卷有益,不管你是哪個(gè)層次的編程人員,相信都能或多或少的汲取到你想要的營(yíng)養(yǎng)。

下面將總結(jié)一下看完本書我記錄下的一些知識(shí)點(diǎn)。有的是書中的原話,有的是我個(gè)人的理解,供參考。

 

2. 面向?qū)ο?/span>

2.1 多態(tài)性

面向?qū)ο笕笤瓌t:繼承、封裝和多態(tài),其中最重要的技術(shù)是“多態(tài)性”,多態(tài)往往會(huì)用繼承來(lái)表現(xiàn),而封裝又保證多態(tài)的獨(dú)立性。多態(tài)性可以讓程序只關(guān)注做什么,而不是關(guān)注怎么做。根據(jù)情況的不同,自動(dòng)選擇最合適的方法來(lái)處理。多態(tài)也是程序擴(kuò)展性的基礎(chǔ)。

2.2 歷史

面向?qū)ο笳Z(yǔ)言從60年代的Simula,到70、80年代的SmallTalk,直到后來(lái)的C++和java,java是最成功、應(yīng)用最普遍的面向?qū)ο笳Z(yǔ)言。本人用C#,和java差不多。UML是描述面向?qū)ο蠓椒ㄔO(shè)計(jì)模型的圖示方法(不會(huì)UML的抓緊補(bǔ)補(bǔ)吧,這也算是基礎(chǔ)了)。

2.3 結(jié)構(gòu)化編程

在很久很久以前,一些比較低級(jí)語(yǔ)言,是通過(guò)goto語(yǔ)句來(lái)執(zhí)行代碼的。C語(yǔ)言中有g(shù)oto語(yǔ)句,一開始學(xué)的時(shí)候老師就不讓用。goto語(yǔ)句是在出現(xiàn)if...else...(條件判斷)和for、while等循環(huán)結(jié)構(gòu)之前,人們用來(lái)控制程序的方法。大家試想,如果不讓你用if..else..和for循環(huán),通篇都是goto,那將會(huì)是什么結(jié)果??所以,用【順序】、【條件】和【迭代】來(lái)代替goto語(yǔ)句,是程序開發(fā)的一大變革。

另外提一句,如果你從事.net開發(fā),你可能有幸解除到goto語(yǔ)句——IL中間語(yǔ)言,IL相當(dāng)于.net中的匯編預(yù)研。將一個(gè)簡(jiǎn)單的 if..else...編譯成IL之后,結(jié)果如下:

《松本行弘的程序世界》讀書筆記(上)

2.4 數(shù)據(jù)抽象化

前面講到程序結(jié)構(gòu)從goto語(yǔ)句中解放出來(lái),那么程序所操作的數(shù)據(jù)結(jié)構(gòu)呢?也需要有一種抽象的表達(dá)方式,而不是計(jì)算式世界所能理解的二進(jìn)制代碼。最常見是我們常用的數(shù)組、鏈表、字典等結(jié)構(gòu)。其實(shí),嚴(yán)格來(lái)說(shuō),程序中的整數(shù)、浮點(diǎn)數(shù)、各國(guó)的語(yǔ)言文字,都是數(shù)據(jù)抽象的結(jié)果。因?yàn)橛?jì)算機(jī)只認(rèn)識(shí)二進(jìn)制字符串。

2.5 多重繼承

如果你是一名java、C#開發(fā)人員,你用不到多繼承,因?yàn)樗麄兏揪筒惶峁。但是有些語(yǔ)言是支持多繼承的,C++、python。現(xiàn)實(shí)世界中需要多繼承,例如以為程序員同時(shí)也可能是一位作家,一個(gè)部門經(jīng)理同事也可能是一位父親。但是多繼承如果開放到程序中,就會(huì)帶來(lái)許多問(wèn)題。允許一個(gè)類有多個(gè)父類,復(fù)雜度可想而知,因此java禁止使用。但是它用什么來(lái)彌補(bǔ)這一缺失——接口interface。

至此,大家要了解接口是因?yàn)槭裁床艁?lái)到這個(gè)世界——因?yàn)閺浹a(bǔ)進(jìn)制使用多繼承而帶來(lái)的問(wèn)題。但是接口真的能很好的解決這個(gè)問(wèn)題嗎?不見得。因?yàn)榻涌诋吘共荒芟窀割惸菢邮褂谩?/p>

Ruby中沒(méi)有接口(不是所有面向?qū)ο笳Z(yǔ)言都有接口的),它通過(guò)引用程序塊的方式來(lái)實(shí)現(xiàn)多繼承。我沒(méi)有深入了解Ruby的這塊功能,有興趣的朋友可以研究。

2.6 面向?qū)ο笫乾F(xiàn)實(shí)世界中具體事物的反映嗎?

作者認(rèn)為,對(duì)“面向?qū)ο?rdquo;最好的解釋是“對(duì)數(shù)據(jù)的結(jié)構(gòu)化”。前文講到結(jié)構(gòu)化編程是將程序流程分為順序、條件和循環(huán)三種結(jié)構(gòu),而面向?qū)ο髣t是在此基礎(chǔ)上的延伸,它將程序處理的數(shù)據(jù)進(jìn)行了結(jié)構(gòu)化。通過(guò)對(duì)象來(lái)組織數(shù)據(jù),數(shù)據(jù)就成為一個(gè)整體,而不再松散。

這是面向?qū)ο笞罡镜囊饬x,如果理解這一點(diǎn),那么是否反映現(xiàn)實(shí)世界就不重要了。其實(shí)像數(shù)組、字符串,你也找不出現(xiàn)實(shí)世界的什么東西與之對(duì)應(yīng)。

程序是處理抽象數(shù)據(jù)的。無(wú)論以后學(xué)習(xí)什么技術(shù),都不要滿足于小貓小狗之類的例子。

另外,關(guān)于“繼承”,也不要看成是現(xiàn)實(shí)世界的真實(shí)反映,它就是一些抽象、公用功能的重用方法,這樣反而更好理解。

2.7 靜態(tài)語(yǔ)言 VS 動(dòng)態(tài)語(yǔ)言

這里所謂的靜態(tài)和動(dòng)態(tài),指的是數(shù)據(jù)類型的強(qiáng)弱。例如C#、java就是強(qiáng)類型,js、Ruby就是弱類型。強(qiáng)類型中,每個(gè)變量都有明確的數(shù)據(jù)類型,不能更改,也不能賦其他類型的值,要不然會(huì)報(bào)錯(cuò)。而在若類型中,變量的類型是隨著其存儲(chǔ)值動(dòng)態(tài)改變的。

兩者各有好壞。強(qiáng)類型可以在編譯時(shí)識(shí)別類型錯(cuò)誤,程序執(zhí)行的速度會(huì)更快,但是不靈活。弱類型靈活,但是有些潛在的錯(cuò)誤不容易發(fā)現(xiàn)。

我恰巧C#和js都用,在我看來(lái),這兩種方式都可以,只要你認(rèn)真對(duì)待,哪個(gè)都不會(huì)出現(xiàn)大問(wèn)題。所以了解即可,不必太糾結(jié)到底哪個(gè)好。

 

3. 程序塊

3.1 閉包

“閉包”這個(gè)詞,我是在js中第一次接觸的。不過(guò)看來(lái)業(yè)界通用這個(gè)詞匯,大體意思就是應(yīng)用外部的變量和環(huán)境,和js中一樣。作者提到Ruby中可以通過(guò)傳遞程序塊的方式實(shí)現(xiàn)閉包,我沒(méi)有仔細(xì)去看細(xì)節(jié)。不過(guò)讀到這里,我想起了以下幾點(diǎn):

01. jQuery源碼中用到了大量的閉包,了解到j(luò)s中的閉包會(huì)影響到性能和內(nèi)存。所以,我以后將會(huì)非常注意jQuery中閉包的使用,真正深入了解閉包;

02. C語(yǔ)言的函數(shù)指針是閉包嗎?

03. C#和java中,哪些用到了閉包?

以后再遇到這種問(wèn)題、知識(shí)點(diǎn),將關(guān)注以下。

3.2 for循環(huán)

Ruby中實(shí)現(xiàn)for循環(huán)的方式是 obj.each(....) 這種方式,和jquery的each循環(huán)類似。作者在本章節(jié)的后面提到“不用for語(yǔ)句”,因?yàn)閒or語(yǔ)句會(huì)破壞對(duì)象的封裝性。其實(shí)這一點(diǎn)在設(shè)計(jì)模式中也有專門的解決方案——迭代器模式。

 

4. 設(shè)計(jì)模式

首先,書中沒(méi)有一個(gè)一個(gè)挨著講每個(gè)設(shè)計(jì)模式。有興趣可以看看我寫的關(guān)于設(shè)計(jì)模式的博客:

換種思路去理解設(shè)計(jì)模式(上) 

換種思路去理解設(shè)計(jì)模式(中)

換種思路去理解設(shè)計(jì)模式(下)

 

大家最好要知道,“設(shè)計(jì)模式”一詞來(lái)源于建筑業(yè)(曾經(jīng)是我比較向往的專業(yè),呵呵)。大家常說(shuō)的設(shè)計(jì)模式,一般是指《設(shè)計(jì)模式.可復(fù)用軟件的基礎(chǔ)》一書中提到的二十三中設(shè)計(jì)模式,作者們是GoF。其實(shí)這些設(shè)計(jì)模式并不是作者們創(chuàng)新出來(lái)的,而是他們總結(jié)當(dāng)時(shí)日常設(shè)計(jì)工作中,最常用的23中模式,給他們分組、取名,最后成就了一部偉大的作品。所以,GoF做出的貢獻(xiàn)就是將原本沒(méi)有名字的東西,給他們起名字,并讓他們成為結(jié)構(gòu)化的知識(shí)。這是件很了不起的事,例如美國(guó)PMI將日常項(xiàng)目管理工作總結(jié)為10大知識(shí)領(lǐng)域5大過(guò)程組一樣。

 

4.1 設(shè)計(jì)模式和類庫(kù)

類庫(kù)是把常用的算法、接口封裝起來(lái),供系統(tǒng)其他模塊使用,或者供其他系統(tǒng)使用,它可以“0成本”重用的。但設(shè)計(jì)模式的重用,卻不是“0成本”,它是一個(gè)很抽象的東西,你要根據(jù)實(shí)際情況來(lái)具體確定。

4.2 開放-封閉 原則(簡(jiǎn)稱:OCP)

業(yè)界有5大設(shè)計(jì)原則,其中最重要的就是“開放-封閉原則”——即對(duì)擴(kuò)展開放、對(duì)修改封閉。了解設(shè)計(jì)原則可以查閱:換種思路去理解設(shè)計(jì)模式(上) 

這里所謂的“對(duì)擴(kuò)展開放”,在面向?qū)ο缶幊讨惺峭ㄟ^(guò)繼承和多態(tài)來(lái)實(shí)現(xiàn)的,繼承允許功能的添加,多態(tài)保證接口的穩(wěn)定性。從實(shí)用主義的觀點(diǎn)來(lái)看,面向?qū)ο蟮木杈驮谟趯?duì)OCP的實(shí)踐。至于把對(duì)象看做物體理解起來(lái)比較容易,能夠建立現(xiàn)實(shí)世界的模型等,只不過(guò)是一些錦上添花的東西。

一個(gè)優(yōu)秀的設(shè)計(jì)模式,肯定能經(jīng)得住OCP的考驗(yàn)!

 

5. Ajax

ajax是web開發(fā)中比較基礎(chǔ)的東西,基本概念此處不再贅述。

 

5.1 Ajax中的“x”

“x”指的是“XML”。因?yàn)樵赼jax剛開始用的時(shí)候,都是用xml格式來(lái)傳遞數(shù)據(jù),因此xml也被說(shuō)成是ajax的基本部分之一。但是現(xiàn)在隨著json越來(lái)越流行,xml的用武之地越來(lái)越少,,高版本的瀏覽器直接支持JSON轉(zhuǎn)換接口。

所以,此處了解即可。開發(fā)時(shí)該用什么用什么。

5.2 javascript——基于對(duì)象的語(yǔ)言

可能你會(huì)經(jīng)常聽到:js是以對(duì)象為基礎(chǔ)的語(yǔ)言,所有的數(shù)據(jù)都是對(duì)象,js是基于原型的語(yǔ)言。對(duì),js中沒(méi)有“類”的概念,除了基本的值類型之外,其他的數(shù)據(jù)都以對(duì)象來(lái)處理,都可以自定義添加屬性,包括函數(shù)。js是通過(guò)原型來(lái)實(shí)現(xiàn)所謂的繼承的。

另外,js中的閉包是比較出名的,閉包在js中的應(yīng)用很多,jQuery源碼中大量使用閉包就是個(gè)例證。

這兩個(gè)問(wèn)題,不是一兩句話能說(shuō)明白的,說(shuō)實(shí)話我現(xiàn)在感覺(jué)自己知道一些,但是了解的不是很透徹。不過(guò)正在努力的補(bǔ)充。要想把js的“對(duì)象”和“閉包”講明白,我想還需要從其他方面下手,將會(huì)是一個(gè)比較系統(tǒng)的工程。后期我定會(huì)搞定它們,并以某種方式講出來(lái)。此處點(diǎn)到為止。

 

6 MVC和“猴子補(bǔ)丁”

6.1 MVC

感覺(jué)作者本文中只是講述了MVC這個(gè)理念,并用小例子解釋。由于我沒(méi)有真正參與過(guò)MVC的項(xiàng)目,也只是日常的了解,所以對(duì)這塊感觸不是很深。

6.2 猴子補(bǔ)丁

所謂的“猴子補(bǔ)丁”,其實(shí)就是C#中的部分類和擴(kuò)展方法。在不改變?cè)瓉?lái)代碼結(jié)構(gòu)的基礎(chǔ)上,添加新代碼。個(gè)人不建議這種做法,如果重復(fù)這樣做,將會(huì)導(dǎo)致代碼松散難以維護(hù)。

 

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

今晚先到這里,明天繼續(xù)寫:

7. 文字編碼

8. 正則表達(dá)式

9. 整數(shù)與小數(shù)

(個(gè)人感覺(jué)“文字編碼”和“整數(shù)與小數(shù)”兩章,作者介紹的很好)

 

松本行弘的程序世界》讀書筆記(下)——文字編碼、整數(shù)、浮點(diǎn)小數(shù)

 

posted @


  本文關(guān)鍵詞:松本行弘的程序世界,由筆耕文化傳播整理發(fā)布。



本文編號(hào):361844

資料下載
論文發(fā)表

本文鏈接:http://sikaile.net/wenshubaike/mishujinen/361844.html


Copyright(c)文論論文網(wǎng)All Rights Reserved | 網(wǎng)站地圖 |

版權(quán)申明:資料由用戶81de5***提供,本站僅收錄摘要或目錄,作者需要?jiǎng)h除請(qǐng)E-mail郵箱bigeng88@qq.com