冒險日誌 - 生活隨筆

好書推薦:《深入淺出設計模式》

設計模式(Design Pattern),從字面上來看不太好理解,我個人的解釋是:

為了解決程式設計上屢見不鮮的問題,因而發展出的一套思考模式。

它並不是一套API,也沒有大量引入新的變數、資料結構,而是巧妙地運用一直都存在於程式語言裡的東西,形成功能強大的組合技Combo

因此,設計模式並不是被「發明」的,而是眾人集思廣益下的「發現」。


我第一次接觸到Design Pattern是在2017年的福島Game Jam,那時我的組員使用了單例(Singleton)模式,我知道這東西的時候大為震驚:

只要把全域且唯一的腳本套用單例模式,我就不用一直把它拉進別人的腳本當reference了!

當然過度濫用的話也會衍生其他問題,但的確是解決了我當時的一大痛點。

由上述的小故事(?)可以得知:

「知道自己面臨到什麼問題」「了解目前的作法有什麼痛點」的前提下,才是學習 Design Pattern 最有效率、最能感同身受的方式。 ((至少對我來說啦

而我今天要推薦的這本書就做到了這樣的事情: 《深入淺出設計模式》

深入淺出
不要被封面嚇到了,這是歐萊禮出版的精品啊!!

這本書裡頭有大量的插圖和設計旁白,剛開始可能會覺得很不正經、不像是一本技術書籍,但繼續讀下去就會發現這個安排的重大意義:讓讀者能夠融入情境。


在一款鴨子模擬器的遊戲中,喬伊為所有的鴨子創了Duck這個class,並且在底下實作的fly()這個Function。剛開始一切都很順利,但是問題來了:橡膠鴨子不會飛怎麼辦?如果後面有越來越多不需要這個function的鴨子,是不是要一直創設沒有意義的空Function

duck.jpg
喬伊遇到麻煩了QQ

從小規模來看,這或許不是什麼大問題,多做幾個步驟就能解決了,但如果類似的情況一再發生的話:有些鴨子不會叫、有些鴨子不能走在地上、有些鴨子不能把頭埋進水裡…….喬伊可能會覺得寫辭職信是比較輕鬆的選擇。

這本書就是透過這樣引導的方式:

  1. 介紹情境
  2. 一般來說,大家會怎麼解決
  3. 這個解法所遇到的盲點
  4. 逐步修正
  5. 恭喜你,你剛剛讀到的就是XX模式!

我覺得這就是這本書最迷人的地方,我讀了幾十頁,卻完全沒看到XX模式的字樣,最後才揭曉答案。唯有先了解情境和現有解決方式的缺點,讀者才能真正體會到使用Design Pattern的重要性,這就像大家都知道躺著玩手機不健康,卻還是照做不誤,直到下次看眼科的時候才發現悲劇了(X

這樣的編排難免使字數量有點爆炸(這本書有637XD),但我覺得這是徹底了解Design Pattern的一個好方式Design Pattern只是一套思維,並不會因為你在設計應用類APP還是3D動作遊戲而有太大的差異。《深入淺出設計模式》這本書中使用到的都是很生活化的案例,我認為一樣非常好理解,並不會因為不是講遊戲而遇到隔閡。

裡面用到的案例有:設計鴨子模擬器、氣象站的資料串接、比薩店的製程改善、變壓器的運作原理等等。


真要說這本書有什麼隱憂的話,我覺得是:裡面的程式碼都是用Java

同樣身為物件導向語言,其實Design Pattern在任何語言上的應用方式是相同的,只是看到Javacode要自己大腦轉換回C#,這部分的適應程度因人而異,真的要買這本書的話還是要請自行斟酌!

Java.jpg
裡面的範例程式碼都是Java

我沒學過Java,但理解這些code並不會很吃力,畢竟就像最開頭所說的:Design Pattern並不是用一套很複雜的方法去解決問題,而是用往往被一般人忽略的方式,把現有的功能玩出新高度。

所以,只要大概了解Java裡面的繼承(inheritance)、介面(interface)、重寫(override)、重載(overload)等等語法怎麼寫,並且知道該怎麼轉換回C#code,閱讀起來就不會有什麼障礙了!

2 thoughts on “好書推薦:《深入淺出設計模式》

  1. 感謝分享,常常在你的部落格中潛水,想推薦兩本遊戲相關與設計模式的書籍: 《設計模式與遊戲開發的完美結合》- 蔡昇達著、《Game Programming Patterns》- Robert Nystrom ,第二本作者直接很好心的直接把書的內容方在網站上了 => http://gameprogrammingpatterns.com/

    Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s