[Design Pattern] 形狀

最近上完了 Bill 大叔的 Design Pattern 課程,受益良多,簡單分享一下學習心得。此篇聊聊 Pattern 的形狀

在學習 Design Pattern 時,免不了會從 class diagram 開始下手,但有時候太過在意「形狀」反倒會忽略 Pattern 真正的意涵。Pattern 真正的用途是為了解決問題,而不是炫技或面試

 

看看以下的例子:

倘若這個例子需求會異動的部份是:可能出現新的 state 狀態,會由舊有的 state 根據某些條件跳轉而來;固定不變的部份是:state 彼此之間並沒有任何參數的相依性,state 動作結束後也會跳轉到下一個 state,不會有其他運作行為(例如不會有 state 執行完畢想要取得下一個 state 執行結果之類的狀況)。

現在的寫法若有所異動,那一大串 if else 就會越來越「巢」,bug也容易滋生。為了解決這樣的問題,第一個想到的大概就是 Sate Pattern,也就是以下的 Class Diagram,將各個 State 切分為 class,形成一個狀態機的樣式。
(此圖出自 Skilltree Bill 大叔課程投影片)

但必須要符合這個 class diagram 才能被稱為 State Pattern 嗎?看看以下的實做方式:

以上方式只是將原巢狀判斷式打散為 Function,除此之外定義了一個 Action<MyData> 的 delegate 作為記憶下一步之用。看起來只是將程式碼稍稍整理了一下,但無形中已經抽象化出Action<MyData> 這個共同介面。很顯然這並不符合 State Pattern 提到的 class diagram,但這樣就不算是 state pattern 了嗎?不,這的確就是 state pattern 啊!

當然老老實實使用 class 來裝載 state 會更好版控管理,這邊只是想討論一下 Pattern 的形狀

Design Pattern 是從 OOP 的概念衍生而來的各種組合模式,但也不需要侷限於非得要創立一堆 class 弄得很 OO 才算 Pattern,形狀什麼的都不重要,重要的是能不能解決問題。其實具體是不是夠格叫 state pattern 似乎也無所謂了~

我想,到達一個境界之後,思考的自然是問題的根源,程式寫好後,發現 Pattern 已經在其中了,叫什麼名字的已經無所謂了。

天機老人:「要手中無環,心中也無環,到了環即是我,我即是環時,已差不多了。」

                             -- 古龍,多情劍客無情劍

摘自Bill老師投影片引言。

不過 Pattern 有個名字還是方便團隊溝通的啦~