主題|設計模式
為什麼該學好設計模式
設計模式(Design Patterns)一直是門易學難精的學問,開發人員從初出茅廬拿規格寫程式、程式會動就好的 coder,到想讓自己精進到有設計概念的 programmer,能設計出具有擴充性的產品,在面對需求異動時,能不傷筋動骨、優雅地擴充現有產品功能,是往資深工程師、tech lead 必備能力。
學習注意事項
學習設計模式前,最好已經有過許多實務開發上的痛點、卡點,不順的地方,學起來才會有感,才會知道設計模式可以幫助你解決什麼問題。除了痛點以外,當然,學設計模式之前也有一些前置天賦技能要點。
設計模式學習地圖
91 建議的設計模式學習地圖,是這樣的順序:
- 物件導向三特性、兩個抽象
-
UML類別圖、UML循序圖
-
SOLID 原則
-
重構、簡單設計
-
設計模式
我個人的想法,所謂的模式是基於某個面向的問題,用好的重構與設計技巧,讓原本的設計能面對未來需求的變化。這樣的問題是不分語言的,而重構的設計方式也與語言關係不大,最後產出一個比較 common 的通用設計方式,這就是模式。因此,我強烈推薦從遺留代碼,因應某個擴充彈性的需求,進行重構,重構到夠簡單、乾淨、剛好的滿足這個擴充性的需求,這樣學習設計模式的切入點才會比較實際,不會被設計模式綁死,而是面對真實的需求優雅的解決問題。
透過書籍學習設計模式的方式
此外,透過閱讀來學習設計模式時,我個人的習慣是,多看幾本不一樣的設計模式書籍。因為設計模式所面臨的問題,有時讀者跟作者的 context 並不相同,作者解釋的角度可能跟讀者的狀況不一樣,導致讀者無法順利理解作者要闡述的內容。這時,手邊有多本設計模式的書,挺有用的。這一本看不懂,翻翻別本設計模式怎麼解釋這個 pattern,就像換個老師用不同的角度再跟你解釋 pattern 的來龍去脈,往往容易帶領讀者跨過那道門檻。
當自己抓到一點感覺之後,就可以用自己的話去跟公司或社群的夥伴解釋,如果你講錯了,他們會第一時間給你指導或糾正。如果你講不清楚,你會發現你對這個東西還不夠熟悉,只是表面。如果你講對了、講得很好,會累積你的影響力,提昇更多人的設計能力。
為了避免模式而模式
設計模式學習過程中,最常見的問題是拿了鎚子之後,看到的都是釘子,到處亂捶。不要為了設計模式而設計模式,實務上避免設計模式 over design 的狀況,有三個很有效果的方式來避免這個問題:
- Refactoring to Patterns
- 簡單設計(Kent Beck 或 Martin Fowler 的 Simple Design)
- 測試驅動開發(TDD)
上述就是我推薦的學習姿勢,有足夠的痛點、想改善設計、想知道怎麼解決或避免問題,按照學習地圖的順序打好基礎,役物不易於物,設計模式是果,重構跟良好的設計才是根本,透過這樣學習設計模式,才能避免 over design,才能以解決問題為目標,而不是以設計出符合某個 pattern 為目標。
額外推薦書籍
(目前設計模式主題之外的)
-
無瑕的程式碼-敏捷軟體開發技巧守則 (Clean Code: A Handbook of Agile Software Craftsmanship)
-
無瑕的程式碼 ── 敏捷完整篇 ── 物件導向原則、設計模式與C#實踐 (Agile principles, patterns, and practices in C#)
推薦課程
-
公開培訓課程:SKILLTREE:決戰設計模式
-
公開培訓課程:重構與 TDD 實戰操練營
-
企業內訓、顧問、教練:91 敏捷開發之路