譯序
本文摘自Design Patterns Explained: A New Perspective on Object-Oriented Design一書的前言部分。通過本文,讀者可以大概了解學習設計模式的過程和效果。同時,作者謙虛謹慎的態(tài)度也是非常值得我們中國軟件開發(fā)者學習的。
這本書的很多地方都復述了我自己學習設計模式的經驗。在學習設計模式之前,我認為自己理所當然是面向對象分析和設計的專家。我曾經為各種行業(yè)的客戶做過一些還算給人深刻印象的設計和實現(xiàn)。我會使用C++并且已經開始學習JAVA。我的代碼中的對象格式優(yōu)美封裝緊密。我可以在繼承體系中設計優(yōu)秀的數(shù)據抽象。我想我已經懂得面向對象了。來源:www.examda.com
現(xiàn)在回頭看看,我發(fā)現(xiàn)那時其實我還根本不知道面向對象設計的全部能力,盡管我一直按照專家建議的方式來做。直到我開始學習設計模式,我的面向對象設計能力才得到了擴展和深化。學習設計模式使我成為了一個更好的設計者,甚至是我還沒有直接使用那些模式的時候。
我從1996年開始學習設計模式。當時我正在西北部一家大型航天公司擔任C++/面向對象設計顧問。有幾個人勸說我領導一個設計模式學習組。正是在那里我遇到了本書的另一個作者Jim Scott。在那個學習組中發(fā)生了幾件有趣的事情。首先,我開始對設計模式著迷。我可以把自己的設計和其他更有經驗的人的設計相比較,我愛上了這種感覺。另一方面,我發(fā)現(xiàn)我并沒有完全做到"對接口做設計",也沒有隨時注意"一個對象是否可以在不知道另外對象的類型的情況下使用另外對象"。同時我注意到,那些面向對象的初學者--通常他們被認為過早開始學習設計模式--從這個學習組得到的收益與那些面向對象的專家不相上下。設計模式向學習者展現(xiàn)出優(yōu)秀的面向對象設計實例并闡述基本的面向對象設計原則,而這些使學習者的設計更快地成熟起來。在整個學習進程結束之后,我確信:設計模式,這是面向對象設計被發(fā)明之后軟件設計中的東西。
但是,看看那個時候我自己的工作,我發(fā)現(xiàn)我根本還沒有在自己寫的代碼中結合任何一個設計模式。
當時我只是認為自己還沒有學到足夠的設計模式,還需要學習更多。那時候,我只知道六個設計模式。然后我可以說是得到了頓悟。我在一個項目中擔任面向對象設計顧問,并需要為這個項目創(chuàng)建一個高層設計。這個項目的領導人極其聰明,但在面向對象設計領域,他可以說是一個新手。
這個問題本身并不困難,但需要非常注意確保代碼容易維護。按照慣例,在看過問題兩分鐘之后,我便有了一個設計--采用了我常用的數(shù)據抽象的途徑。很不幸的是,很顯然這不會是一個好的設計。簡單的數(shù)據抽象已經讓我嘗到過失敗的滋味。我必須找到一些更好的設計思路。
兩個小時過去了。在使用了我所知道的所有設計技術之后,情況仍然沒有好轉。我的設計基本上都還是和從前一樣。而最讓我感覺受挫的是,我知道一定有一個更好的設計,但我就是找不到它。更具諷刺意義的是,我甚至還知道四個設計模式就"生活"在我的問題中,但我看不出應該如何使用它們。在這里,我,一個被認為是面向對象設計專家的人,被一個簡單的問題困住了!
我實在覺得很受挫,于是我停了下來,開始繞墻行走以清醒頭腦,并告訴自己:至少10分鐘里我不再想這個問題。呵呵,30秒之后,我又開始想它了!但我獲得了一種領悟并完全改變了我對設計模式的看法:設計模式無法作為獨立的條款使用;我應該把設計模式放在一起使用。
模式是應該被結合在一起來共同解決一個問題的。
以前我曾經聽到過這句話,但那時我并沒有真正理解它。因為軟件開發(fā)中的模式往往被介紹為"設計模式",所以我總是在"模式最主要的貢獻是在設計階段"的假設下努力。我的想法是:在設計世界里,模式就好象是類之間優(yōu)美的聯(lián)系。然后,我閱讀了Christopher Alexander那本令人驚訝的書--The Timeless Way of Building。我學到了:模式存在在所有的階段--分析、設計以及實現(xiàn)--之中。Alexander在書中討論了如何使用模式來幫助理解(乃至描述)問題領域,而不是僅僅在理解了問題領域后使用模式來創(chuàng)建一個設計。
我的錯誤是:我嘗試先創(chuàng)建問題領域中的類,然后將這些類縫合起來形成最終的系統(tǒng)--lexander把這樣的過程稱為"一個壞主意"。我從來沒有問過自己:我是否擁有正確的類?僅僅因為這些類看起來如此正確、如此明顯。我擁有的,是在我開始分析時立刻進入了我的腦海的類,是我們的老師告訴我們應該在系統(tǒng)的描述中尋找的"名詞"。但是我的錯誤就是我僅僅嘗試把它們簡單的放在一起。
當我回過頭,開始使用設計模式和Alexander的方式來指導自己創(chuàng)建我的類時,僅僅幾分鐘之后,一個優(yōu)秀得多的解決方案在我的腦海中顯露出來。這是一個很好的設計,于是我們把它應用在產品之中。我很興奮--為我設計了一個好的解決方案,更為設計模式的威力。從此,我開始在自己的開發(fā)工作和教學中結合設計模式。
本文摘自Design Patterns Explained: A New Perspective on Object-Oriented Design一書的前言部分。通過本文,讀者可以大概了解學習設計模式的過程和效果。同時,作者謙虛謹慎的態(tài)度也是非常值得我們中國軟件開發(fā)者學習的。
這本書的很多地方都復述了我自己學習設計模式的經驗。在學習設計模式之前,我認為自己理所當然是面向對象分析和設計的專家。我曾經為各種行業(yè)的客戶做過一些還算給人深刻印象的設計和實現(xiàn)。我會使用C++并且已經開始學習JAVA。我的代碼中的對象格式優(yōu)美封裝緊密。我可以在繼承體系中設計優(yōu)秀的數(shù)據抽象。我想我已經懂得面向對象了。來源:www.examda.com
現(xiàn)在回頭看看,我發(fā)現(xiàn)那時其實我還根本不知道面向對象設計的全部能力,盡管我一直按照專家建議的方式來做。直到我開始學習設計模式,我的面向對象設計能力才得到了擴展和深化。學習設計模式使我成為了一個更好的設計者,甚至是我還沒有直接使用那些模式的時候。
我從1996年開始學習設計模式。當時我正在西北部一家大型航天公司擔任C++/面向對象設計顧問。有幾個人勸說我領導一個設計模式學習組。正是在那里我遇到了本書的另一個作者Jim Scott。在那個學習組中發(fā)生了幾件有趣的事情。首先,我開始對設計模式著迷。我可以把自己的設計和其他更有經驗的人的設計相比較,我愛上了這種感覺。另一方面,我發(fā)現(xiàn)我并沒有完全做到"對接口做設計",也沒有隨時注意"一個對象是否可以在不知道另外對象的類型的情況下使用另外對象"。同時我注意到,那些面向對象的初學者--通常他們被認為過早開始學習設計模式--從這個學習組得到的收益與那些面向對象的專家不相上下。設計模式向學習者展現(xiàn)出優(yōu)秀的面向對象設計實例并闡述基本的面向對象設計原則,而這些使學習者的設計更快地成熟起來。在整個學習進程結束之后,我確信:設計模式,這是面向對象設計被發(fā)明之后軟件設計中的東西。
但是,看看那個時候我自己的工作,我發(fā)現(xiàn)我根本還沒有在自己寫的代碼中結合任何一個設計模式。
當時我只是認為自己還沒有學到足夠的設計模式,還需要學習更多。那時候,我只知道六個設計模式。然后我可以說是得到了頓悟。我在一個項目中擔任面向對象設計顧問,并需要為這個項目創(chuàng)建一個高層設計。這個項目的領導人極其聰明,但在面向對象設計領域,他可以說是一個新手。
這個問題本身并不困難,但需要非常注意確保代碼容易維護。按照慣例,在看過問題兩分鐘之后,我便有了一個設計--采用了我常用的數(shù)據抽象的途徑。很不幸的是,很顯然這不會是一個好的設計。簡單的數(shù)據抽象已經讓我嘗到過失敗的滋味。我必須找到一些更好的設計思路。
兩個小時過去了。在使用了我所知道的所有設計技術之后,情況仍然沒有好轉。我的設計基本上都還是和從前一樣。而最讓我感覺受挫的是,我知道一定有一個更好的設計,但我就是找不到它。更具諷刺意義的是,我甚至還知道四個設計模式就"生活"在我的問題中,但我看不出應該如何使用它們。在這里,我,一個被認為是面向對象設計專家的人,被一個簡單的問題困住了!
我實在覺得很受挫,于是我停了下來,開始繞墻行走以清醒頭腦,并告訴自己:至少10分鐘里我不再想這個問題。呵呵,30秒之后,我又開始想它了!但我獲得了一種領悟并完全改變了我對設計模式的看法:設計模式無法作為獨立的條款使用;我應該把設計模式放在一起使用。
模式是應該被結合在一起來共同解決一個問題的。
以前我曾經聽到過這句話,但那時我并沒有真正理解它。因為軟件開發(fā)中的模式往往被介紹為"設計模式",所以我總是在"模式最主要的貢獻是在設計階段"的假設下努力。我的想法是:在設計世界里,模式就好象是類之間優(yōu)美的聯(lián)系。然后,我閱讀了Christopher Alexander那本令人驚訝的書--The Timeless Way of Building。我學到了:模式存在在所有的階段--分析、設計以及實現(xiàn)--之中。Alexander在書中討論了如何使用模式來幫助理解(乃至描述)問題領域,而不是僅僅在理解了問題領域后使用模式來創(chuàng)建一個設計。
我的錯誤是:我嘗試先創(chuàng)建問題領域中的類,然后將這些類縫合起來形成最終的系統(tǒng)--lexander把這樣的過程稱為"一個壞主意"。我從來沒有問過自己:我是否擁有正確的類?僅僅因為這些類看起來如此正確、如此明顯。我擁有的,是在我開始分析時立刻進入了我的腦海的類,是我們的老師告訴我們應該在系統(tǒng)的描述中尋找的"名詞"。但是我的錯誤就是我僅僅嘗試把它們簡單的放在一起。
當我回過頭,開始使用設計模式和Alexander的方式來指導自己創(chuàng)建我的類時,僅僅幾分鐘之后,一個優(yōu)秀得多的解決方案在我的腦海中顯露出來。這是一個很好的設計,于是我們把它應用在產品之中。我很興奮--為我設計了一個好的解決方案,更為設計模式的威力。從此,我開始在自己的開發(fā)工作和教學中結合設計模式。