成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

王垠:解密“設計模式”

開發 架構
有些人問我,你說學習操作系統的最好辦法是學習程序設計。那我們是不是應該學習一些“設計模式”(design patterns)。這是一個我很早就有定論,而且經過實踐檢驗的問題,所以想在這里做一個總結。

有些人問我,你說學習操作系統的***辦法是學習程序設計。那我們是不是應該學習一些“設計模式”(design patterns)。這是一個我很早就有定論,而且經過實踐檢驗的問題,所以想在這里做一個總結。

總的來說,如果光從字面上講,程序里總是有一些“模式”可以發掘的。因為你總是可以借鑒以前的經驗,來構造新的程序。你可以把這種“經驗”叫做“模式”??墒亲詮摹?a target="_blank">設計模式》(通常叫做 GoF,“Gang of Four”)這本書在 1994 年發表以來,“設計模式”這個詞有了新的,扭曲的含義。它變成了一種教條,帶來了公司里程序的嚴重復雜化。

解密鈥溕杓頗J解

GoF 借鑒的是一個叫 Christopher Alexander 的建筑師的做法。Alexander 給一些建筑學里的“設計模式”起了名字,試圖讓建筑師們有一些“共同語言”??上У氖牵珹lexander 后來自己都承認,他的實驗失敗了。因為這些固定的模式,并沒有有效地傳遞精髓的知識,沒有能讓新手設計出好的建筑。照搬模式東拼西湊,而不能看透事物的本質,其實是設計不出好東西的。

當我聽說這本書的時候,我已經學會了函數式編程,正在 Cornell 讀 PhD,專攻程序語言設計。有一天由于好奇這書為什么名氣這么大,我從圖書館借了一本回來看。我很快的發現,其實這本書的作者只是給早已經存在的編程方法起了一些新的名字而已。當時我就拿起一張紙,把所有的 20 來個設計模式跟我常用的編程概念做了一個映射。這個映射居然是“多對一”(many-to-one)的。也就是說,多個 GoF 設計模式,居然只對應同一個我每天都用的概念。有些概念是如此的不值一提,以至于我根本不需要一個名字來描述它,更不要說多個名字!

其中極少數值得一提的“模式”,也許是 visitor 和 interpreter。很可惜的是,只有很少的人明白如何使用它們。所謂的 visitor,其實本質上就是函數式語言里的含有“模式匹配”(pattern matching)的遞歸函數。在函數式語言里,這是多么輕松的事情。可是因為 Java 沒有模式匹配,所以很多人使用 visitor pattern。為了所謂的“通用性”,他們往往把 visitor pattern 搞出多層繼承關系,讓你轉幾道彎也搞不清楚到底哪個 visitor 才是干實事的。

其實,函數式語言的研究者們早就知道 visitor pattern 是怎么得來的。如果你想知道如何從無到有,“發明”出 Java 的 visitor pattern,可以參考 Dan Friedman 跟他的學生 Matthias Felleisen 合寫的的另一本“小人書”《A Little Java, A Few Patterns》(發表于 1997 年)。

解密鈥溕杓頗J解

而 interpreter (解釋器)模式呢?看了作者們寫的例子程序之后,我發現他們其實并不會寫解釋器,或者說他們不知道如何寫出優雅的,正確的解釋器。如果你想知道如何寫出好的解釋器,可以參考我的博文《怎樣寫一個解釋器》。

你說我在貶低這本書的真正價值,因為 GoF 說了:“我們的貢獻,就是給這些編程方式起名字。這樣讓廣大程序員有共同的語言。” 如果這也叫貢獻的話,我就可以寫本書,給“空氣”,“水”,“豬肉”這些東西全都起個新名字,讓大家有“共同的語言”。這不是搞笑嗎。

這不是我的一家之言,Peter Norvig 在 1998 年就做了一個演講,指出在“動態語言”里面,GoF 的 20 幾個模式,其中絕大部分都“透明”了。也就是說,你根本感覺不到它們的存在。這就像我剛才告訴你的。

解密鈥溕杓頗J解

在這里 Norvig 的觀點是正確的,不過需要小心一個概念錯誤。高級的“靜態語言”(能傳遞函數作為參數的),其實也可以避免大部分 GoF 設計模式。而“動態語言”這個概念,在程序語言的理論里面,其實是沒有明確的定義的。“動態語言”其實也能進行某些“靜態類型檢查”。不過在 1998 年,我還是個啥都不懂屁孩,所以這里就不跟 Norvig 大叔計較了。

既然老人們都有歷史局限性,那么為啥我還跟 GoF 找茬?本來這本書很老了,如果沒有人再被它誤導的話,這篇博文也就不必存在了??墒钱斘以?Google 實習的時候,我發現幾乎每個程序員的書架上都有一本 GoF!我在 Google 實習了兩次,***次的時候代碼全都是我一個人寫的,所以沒有使用任何 GoF 設計模式。代碼直接,精巧而簡單。當我第二次回到 Google,發現我的代碼里已經被加入了各種 factory,visitor,…… 其實啥好事也沒做,只不過讓我的代碼彎了幾道彎,讓人難以理解。

可見一本壞書,毀掉的不只是一代程序員。鑒于如此,特發此文。各位新手,希望你們敲響警鐘,不要再走上這條老路,寫出代碼來讓大家痛苦。

至于如何學會寫真正好的代碼,我在另一篇博文里再講。

原文鏈接:http://blog.sina.com.cn/s/blog_5d90e82f0101ipap.html

責任編輯:林師授 來源: 王垠的博客
相關推薦

2013-03-18 10:19:41

程序設計語言

2012-10-30 15:31:17

2013-03-29 10:02:37

編譯器語言編譯開發

2013-06-19 09:42:27

工作經歷程序員開發經驗

2012-08-13 09:40:12

語言編程語言程序語言

2013-05-21 09:47:15

編輯器IDE程序員

2013-04-18 09:29:02

編程語言編程

2013-03-20 09:54:07

2017-07-10 17:00:24

程序語言語言特性

2014-02-12 14:31:55

2012-08-14 10:44:52

解釋器編程

2012-09-12 10:33:37

工具工具奴隸語言工具

2021-05-26 18:21:19

計算機互聯網 技術

2021-02-01 10:01:58

設計模式 Java單例模式

2011-01-18 10:57:26

職場

2023-03-06 08:49:02

加密和解密SpringBoot

2023-11-02 21:11:11

JavaScript設計模式

2019-12-27 10:06:00

王垠面試官趙海平

2022-01-12 13:33:25

工廠模式設計

2023-05-04 08:47:31

命令模式抽象接口
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品中文字幕在线 | 国产电影一区二区三区爱妃记 | 特黄一级| 免费看国产一级特黄aaaa大片 | 精品久久香蕉国产线看观看亚洲 | 国产福利观看 | 99久久久无码国产精品 | 欧美激情国产日韩精品一区18 | 欧美日韩黄色一级片 | 成人黄色电影免费 | 久久久一区二区三区四区 | 一区二区三区国产 | 国产一级视频在线观看 | 色婷婷综合网站 | 国产福利视频网站 | 精品久草 | 日韩国产专区 | 男女在线网站 | 成人在线免费观看视频 | 成人激情免费视频 | 日韩资源 | 成人国产精品久久 | 免费小视频在线观看 | 中文在线亚洲 | 精品久久久久久亚洲精品 | 国产日韩一区 | 精品欧美一区二区三区精品久久 | 久久精品视频在线观看 | 国产精品一区二区三区四区 | 亚洲精品一区二区三区四区高清 | 欧美日韩综合视频 | 操操操日日日 | 国产成人精品在线播放 | 国产区精品 | 中文字幕av一区 | 成人久久久 | 国产午夜亚洲精品不卡 | 亚洲精品日韩综合观看成人91 | 福利视频亚洲 | 日本免费一区二区三区四区 | 亚洲激情综合 |