學習設計模式的捷徑

張恂發表於2009-03-09

(c) 2009 張恂 www.zhangxun.com

本文的最新版在《大道至簡:實話設計模式》:http://www.zhangxun.com/entry.aspx?sname=GoFpatterns

理解、掌握設計模式真有那麼難嗎?我們這個世界存在著簡單的科學真理,複雜的設計模式表象背後自然也存在簡單的客觀現實。學習和掌握設計模式有沒有什麼技巧、竅門和捷徑呢?有。

1、比較法

我最喜歡用、極力向大家推薦的第一種科學學習方法是比較法。在 23 個 GoF 設計模式中,有不少模式存在著相似性,在使用時很容易混淆。通過認真細緻的比較,我們不但可以發現一組彼此相似或相關的設計模式之間的真正差異點,而且還可以用一組、一批模式整體學習的方式取代(或彌補)逐個模式孤立學習記憶的方式,從而起到加深記憶、提高學習效率、促進準確運用的效果。

2、圖形建模法

我最喜歡用、極力向大家推薦的第二種科學方法是圖形建模法(用 UML 記憶、思考和分析設計模式)。學習設計模式切忌死記硬背。最好做到只要一聽到某個設計模式的名稱,就能迅速在自己的大腦中,投射或浮現出這個設計模式的 UML 標準靜態圖(如類圖)和動態圖(如序列圖、通訊圖、狀態圖等等),這遠比直接投射或浮現出一行行的高階程式設計語言原始碼要藝術、敏捷和高效得多。

有經驗的 OO 程式設計師知道,設計模式的抽象層次要比具體的 OO 程式語言高一層,用圖形化的抽象建模語言來描述設計模式,最簡單,也最形象。同一個設計模式,既可以用 Java、C#、VB.NET 實現,也可以用 Delphi、C++、Ruby 或 JavaScript. 等其他各類 OO 程式語言實現。所以,企圖通過死記硬背程式原始碼來記憶設計模式的方式,不但讓我們很難看到(或分析、比較)設計模式的本質特徵,而且也是非常低效和錯誤的。

3、比喻法

第三種最常用的設計模式學習方法是比喻法,或叫比擬法、類比法。我們常常可以把設計模式同現實世界中某一個或某一些為人所熟悉的形象比喻聯絡起來,以便領會和掌握它們的基本結構和特點,加深對模式的記憶和理解。事實上,很多設計模式的名稱原本就是一種比喻或對現實世界的模擬,例如,抽象工廠、橋、職責鏈、中介、訪問者等等。熟練地運用比喻法可以產生這樣的效果,一聽到某個設計模式的名稱,腦子裡就能馬上聯想到它的比喻,進而浮現出它的結構圖(UML 圖形)。

Software is virtual reality(張恂)。比喻法之所以簡單而有效,根本原因是因為軟體設計活動本質上就是一種建模活動,而且由於我們是人類,我們總是會自覺不自覺地在軟體程式中模擬、效仿現實世界中自己所熟悉的各種物質、概念及其運動規律。

通過打比方、比喻、類比,乃至用說俏皮話、調侃和無厘頭的方式來學習設計模式,可能是一種不錯的學習方式,能夠寓教於樂,收到奇效。然而,運用比喻法需要注意的一個問題是:不要濫用比喻。為某個設計模式找到一個非常貼切、形象的比喻並非一件易事。現有很多設計模式比喻的問題是不像,沒有抓住模式的基本特徵(我也不一定能做得更好)。此外在拿設計模式與現實世界、人類社會作類比的時候,最好也不要扯得太遠,以簡明為宜。

4、重視 OOD 原則和方法

第四,我認為最重要的也是被許多人所忽視的一個學習要領是:

通用的原則與方法高於具體的模式和做法(General Principles and Methods over Concrete Patterns and Practices)

有沒有什麼東西比設計模式更重要?有!滿腦子只有設計模式是不對的,其實這個世界上比設計模式更重要、更高階的事物還有很多,比方,設計原則和方法,尤其是 OOD 原則和方法,抽象、普適的原則和方法比具體、個別的模式、做法和解法更重要,其實所有的設計模式都是根據某種或某些軟體設計的基本思想、原則和方法而創造出來的。

相關文章:

實話設計模式:GOF《設計模式》不宜作為初學者入門讀物

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13633641/viewspace-563314/,如需轉載,請註明出處,否則將追究法律責任。

相關文章