本書是什麼#
本書並不是一本程式集,也不是一本故事集,而是一本透過故事講述程式如何設計的方法集。
本書希望給渴望了解物件導向(OO,Object-Oriented)世界的初學者、困惑於僵硬/脆弱/無法復用的程式碼的開發者,以及打著 OO 旗號卻仍以過程式思維開發的「基於物件」實踐者,提供有幫助的建議與提示。
寫作緣起#
作者程杰在一次培訓中發現:學生雖能複述類別、方法、構造函式、抽象類、介面等概念,也用 Visual Studio 寫過不少 Windows 與 Web 程式,但被問到「為什麼要用物件導向?它的好處在哪裡?」時,多數人卻說不清楚。
於是作者用中國古代四大發明之一的「活字印刷」做比喻(見第 1 章),透過一個虛構的三國曹操做詩情境,把物件導向的好處具象化,學生普遍反映通俗易懂。這讓作者開始思考:學一門技術是否需要趣味性與通俗性的引導?
- 看小說時,往往能完整讀完,因為作者文字吸引人
- 讀技術書時,常因內容枯燥,前幾章讀完便束之高閣
- 若能讓技術書帶點趣味性,只要不影響核心本質,就值得嘗試
正因如此,作者開始了對設計模式進行趣味性寫作的嘗試。
本書定位#
本書不是培養軟體架構師的「俱樂部」,而是訓練物件導向基本功的「學校」。
適合對象是初學物件導向的程式員,希望讀者讀後能打好物件導向的基礎,從而更容易深入理解 GoF 的《設計模式》與其他大師作品。
作者以足球運動員的成長作對比:
- GoF 的《設計模式》好比世界頂級的射門集錦
- 《重構》、《敏捷軟體開發》、《設計模式解析》好比一場場精彩的比賽
- 但欣賞球星的同時,往往忽略了他們的成長過程
- 對程式員來說,「精彩的程式是如何想出來的」比「看到精彩的程式」更值得期待
本書特色#
重視過程#
多數編程書集中講授「優秀的解決方案」或「完美的範例」,但對演變過程著墨不夠。
《重構與模式》有一句經典:「如果想成為一名更優秀的軟體設計師,了解優秀軟體設計的演變過程,比學習優秀設計本身更有價值,因為設計的演變過程中蘊藏著大智慧。」
本書透過小菜與大鳥的對話,在不斷的提問、回答、重構之中,降低設計模式的學習門檻,讓初學者更容易理解「為什麼這樣設計才是好」、「是如何想到這樣設計的」。
貼近生活#
設計模式並非孤立於現實的理論,所有模式都能在生活中找到對應:求職、面試、工作、交友、投資、兼職、辦公室文化、生活百味等場景,都被寫進書中,用小故事引出模式,讓讀者輕鬆進入學習狀態。
本書內容#
全書通篇以情景對話形式組織,分為四個部分:
- 第一部分:物件導向的意義、好處與幾個重要的設計原則,由小菜面試失敗引出
- 第二部分:詳細講解 23 個設計模式
- 第三部分:設計模式總結,藉由小菜夢到的「超級模式大賽」場景,把所有物件導向與模式概念擬人化,趣味性地總結模式之間的異同與關鍵點
- 第四部分:附錄,補充類別、封裝、繼承、多型、介面、事件等物件導向基礎
主人公介紹#
- 小菜:原名公寻,22 歲,上海人,上海某大學計算機專業大學四年級學生,成績一般,考研剛結束,即將畢業,正求職找工作
- 大鳥:原名李大遼,29 歲,小菜的表哥,雲南昆明人,畢業後長期從事軟體開發與管理工作,近期到上海發展
研讀方法#
建議按順序閱讀。若覺得繼承、多型、介面、抽象類等基礎不足造成閱讀困難,可先閱讀附錄一「培訓實習生——物件導向基礎」,再從第 1 章開始。
若已熟悉部分設計模式,亦可挑選不熟悉的章節閱讀。
學習疑問解答#
看本書需要什麼基礎?#
主要是 C# 或其他程式語言的基礎知識,如變數、分支判斷、迴圈、函式等。物件導向基礎可參看附錄一。
設計模式是否有必要全部學一遍?#
作者主張:Yes! 不要被「設計模式大多用不上、不必全學」的言論左右。
- 在學習 GoF 23 個設計模式的過程中,會被這些大師的技術思想洗禮,不斷加深對物件導向的理解
- 重點不是將來會不會用到這些模式,而是透過模式找到「封裝變化」、「物件間鬆散耦合」、「針對介面編程」的感覺
- 成為詩人後可能不需刻意按某種模式創作,但成為詩人前一定認真研究過唐詩宋詞與古今名句
如果說數學是思維的體操,那設計模式就是物件導向編程思維的體操。
學了設計模式後常會過度設計,怎麼辦?#
設計模式有四境界:
- 沒學前一無所知,根本想不到用設計模式,程式很糟糕
- 學了幾個模式後到處想用,常造成誤用而不自知
- 學完全部模式後感覺諸多模式相似、難以分清,但深知誤用之害,使用時有所猶豫
- 靈活應用模式,甚至不依賴具體模式也能設計出優秀程式碼,達到「無劍勝有劍」的境界
不會用設計模式的人遠遠多於過度使用設計模式的人。
因為怕過度設計就不用設計模式,是因噎廢食。意識到自己有過度使用模式時,正代表已認識到問題的存在,需要繼續鑽研。
適合的程式語言#
本書以 .NET 中的 C# 為描述語言,但並非框架書,因此同樣適合 Java、VB.NET、C++ 等其他物件導向語言的讀者。
- Java:主要差異在於 Java 中繼承類別與實作介面分別用
extends、implements,且所有方法都是虛擬的(virtual),不需指定new或override - VB.NET:可使用線上工具將 C# 程式碼轉換為 VB.NET 後閱讀
- C++:語言上有些差異,但不會影響對物件導向思想的理解
致謝#
本書源於作者在「博客園」網站的連載文章《小菜編程成長記》。在連載受到讀者熱烈反應後,作者萌生將 GoF 23 個設計模式全部寫成書的念頭。
寫作參考的主要著作包括:
- 《設計模式》(Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides,即 GoF)
- 《設計模式解析》(Alan Shalloway、James R. Trott)
- 《敏捷軟體開發:原則、模式與實踐》(Robert C. Martin)
- 《重構——改善既有程式的設計》(Martin Fowler)
- 《重構與模式》(Joshua Kerievsky)
- 《Java 與模式》(閻宏 等)