書: Head First Design Pattern

這本書實際上已經紅了滿長一陣子,尤其在中文翻譯出來後在台灣跟中國更是火到不行。
這幾年design pattern類的書大概看了不下十來本,當初看它封面設計的如此可愛,心想大概又是另一種 teach yourself xxxx in 10 minutes或 idiot’s guide to xxxx等級的入門書所以完全沒動力拿來看。
最近在 b6s 的強力推薦下終於弄了本來翻翻,結果一看之下才發現原來封面是騙人的,裏面的內容真是料多味美卡實在,尤其是作者很用心的在設計範例,再佐以紅酒醬汁,呃,我是說很多的插圖跟註解,透過大量重覆性的描述讓一個概念可以很生動的解釋清楚,這真是非常棒的寫作手法。
當時會想翻這本書是因為最近在用 flex 2寫 pop3 client, 結果在 socket 部份遇到一些困難,請教b6s長輩後才知這類型的問題可以用 State Pattern解決,所以就先從這章開始看。
看完後才真正覺得世界大不同,以往在 GoF的聖經裏,對於 state pattern的描述就是那短短三句話,最好一般人看完就能理解並應用 -_-,而這本書的例子則設計的非常好,同時應用 Delegate + State 來解決一個實際的問題,看完之後再把 GoF拿出來翻一遍,此時就覺得每段話都很有道理,就連裏面提到的 drawing program 切換 state 的例子也都豁然開朗。
(這裏的豁然開朗指的是:以前看完GoF只大略知道 state pattern可用在drawing tools,可是該如何實作那就是天知地知我不知了, 而看完 head first design pattern後卻是有十足的把握可以立即寫一個這樣的程式 – 實際上等寫完pop 3 後,我就打算用 flashcom重寫一次whiteboard 這個元件來驗証一下這個pattern – 這中間的差異可真是十萬八千里遠吶)
另外順者 State pattern翻下去也順便看了 Command Pattern,這也是一個「知道許久但其實沒怎麼在用」的pattern,可是實際上威力無窮,尤其在寫 app時一定會需要提供 undo 的功能,以往我都是用 memento pattern就解決了,但沒想到有更輕量級的手法。
書中 command pattern 的例子也挺有趣的,是以一個萬用remocon為例子,解釋如何將不同的功能包進command object 後透過同一個介面去執行,同時書中也說明了如果需要 undo時,可以加上一個 undo() 來處理個別指令的 undo事項。
所以簡單講只要將 command + memento 就可以應付大部份大型應用程式的 undo需求了,例如將一個個的 command object塞進 careTaker 裏的 stack,然後將來再依序取出即可。
總而言之,這本書實在是所有工程師的福音,尤其是那些還沒學過 pattern的初學者更該將此書當作入門的第一本教材,看完它,不但會對 pattern有完整的瞭解並打好穩定的基礎,更重要的是將來也有更多的本錢可以看其它深入的pattern書(那些比較硬,沒那麼多插畫,封面也不是清純少女的大部頭教科書)。
note: 寫完後跑去 amazon看了一下 sale rank, 結果很意外的居然總銷量只有幾百本,或許大家真的都被封面給騙走了吧…不過台灣買的到中文翻譯本,銷量應該會好點兒才是。
note2: 呃,如果你是socket programming高手,例如有處理 pop3, smtp, nntp 或 irc socket 的經驗,麻煩請與我聯絡,有幾個技術問題想請教
[但如果只是會用 JavaMail API或其它已包裝過的 socket API的話,那幫助可能不大, 我需要的是能在 byte-level 處理socket的能力]


2 Comments Add your own
1. Stewart&hellip | November 10th, 2005 at 2:49 pm
這本書真的很棒
例子舉得超漂亮
ps. socket programming 我懂一點 BSD 的
win 的就不懂了, 若還沒有人回答你, 可以互相討論
2. jeremy&hellip | November 10th, 2005 at 3:15 pm
對呀,這本的例子實在漂亮到不行,實在很想從今以後逼每個 RIA 班的學生都人手一本,或是開個 Actionscript 3 – a design pattern way 的實務課
socket 問題我已經解決了,當時主要的問題是因為flash AVM 不是 multi-threading,所以無法用java/.net的方式去處理 socket 不斷進來的資料,而使用 flash 的 event model處理這種事又很麻煩,所以最後用Command pattern寫了一個 BatchRunner 來處理這種不同步的資料傳遞就解決了。
不過還是謝謝喔
Trackback this post | Subscribe to the comments via RSS Feed