l

2014年3月28日 星期五

直接套用Pattern還是Refactoring to Pattern?

Mar. 12 17:22~18:00

螢幕截圖 2014-03-14 09.06.35

畫面節錄自電影「達摩祖師傳」

 

繼〈Top-down和Bottom-up設計方法〉和〈先學物件導向還是先學設計模式?〉,今天再來談一個和「由上而下」和「由下而上」的問題:「寫程式的時候,要直接套用Pattern還是Refactoring to Pattern?」

看過〈Top-down和Bottom-up設計方法〉和〈先學物件導向還是先學設計模式?〉這兩篇的鄉民們,現在應該很清楚了,直接套用pattern,就是「由上而下」的設計方法。反之,如果先不管三七二十一把程式功能寫好,在必要的時候才將程式重構成pattern,這種做法就屬於「由下而上」的方式。

***

Erich Gamma在訪問中提到

Do not start immediately throwing patterns into a design, but use them as you go and understand more of the problem. Because of this I really like to use patterns after the fact, refactoring to patterns…

Trying to use all the patterns is a bad thing, because you will end up with synthetic designs—speculative designs that have flexibility that no one needs. These days software is too complex. We can't afford to speculate what else it should do. We need to really focus on what it needs. That's why I like refactoring to patterns. People should learn that when they have a particular kind of problem or code smell, as people call it these days, they can go to their patterns toolbox to find a solution.

Gamma提到在問題還不明確的時候就套用pattern,很容易產生一個synthetic design(人造、想像中的設計),也就是為了設計而設計,通常都會伴隨著over design(過度設計)的問題。如果直接實作,等問題的輪廓慢慢浮現之後,再思考可以套用,或是將系統改成pattern,這樣子會比較保險。

***

鄉民甲:所以Teddy你的意思是說開發系統的時候先不要套用任何pattern,先把功能寫好,等到有需要的時候再重構成pattern這樣比較好?

鄉民甲:達摩大師說—無所謂好壞,端看造化而定。

Teddy:怎麼你也學會這一招了。

鄉民甲:因為我看出你講話的pattern了吐舌頭

Gamma的意思是說,如果問題不明確,不要急著套pattern。因為此時套pattern變成一種bottom-up設計方式(理想上應該是top-down),連要解決什麼問題(整體概念)都還不清楚就貿然套用pattern,就很可能產生bottom-up設計方法的缺點,那就是「系統長歪掉了」。所以在這種情況下先藉由實作,然後把問題慢慢釐清,如果有需要再套用pattern,這樣子會比較好。在這樣的套用流程中,原本未知的整體已經成形,之後重構成pattern就比較不會遭遇什麼困難。

相反的,如果問題已經非常明確,這裡就是需要一個Observer,Teddy覺得就直接套用pattern也沒什麼不好。

***

回想之前開發系統的經驗,遇到的問題時候,會先看看有沒有什麼pattern可以套用。如果可以立即發現有pattern可以很清楚的解決problem,就立刻套用。否則,就先把功能做出來再說。做出來之後如果還是覺得有套用pattern的必要,再重構成pattern,否則就先維持原狀。整體來說,直接套用pattern跟重構成pattern的比例,可能各占一半(有時是6:4,有時是4:6甚至3:7也有可能,要看開發專案的特性,以及開發人員對於問題熟悉程度)。

***

友藏內心獨白:又是那句「普通人隨緣即變,得道者隨緣不變」。

5 則留言:

  1. 請問一下,若是較大的專案通常要怎麼由上而下做分析呢? 感覺上還是要把各小部分的獨立出來分析,討論之間的互動,再套用小pattern,才能決定套用哪一個比較大的 pattern?

    開發新手留

    回覆刪除
    回覆
    1. 請參考〈http://teddy-chen-tw.blogspot.tw/2014/03/top-downbottom-up.html〉、〈http://teddy-chen-tw.blogspot.tw/2014/02/pattern.html〉、〈http://teddy-chen-tw.blogspot.tw/2014/02/patterthe-timeless-way-of-building.html〉。

      刪除
  2. 你好我在看"套用Design Pattern的時間點"時連過來看這一篇文章。這邊文章的前面說"直接套用pattern,就是「由上而下」的設計方法",但是在後面的內容卻說,"套pattern是一種bottom-up的方式",兩種說法好像有衝突,請問是後面的部分筆誤嗎?還是說在不同的情境下有不同的使用方式?

    回覆刪除
    回覆
    1. 您好,您說得應該是這句:『Gamma的意思是說,如果問題不明確,不要急著套pattern。因為套pattern是一種bottom-up的方式,連要解決什麼問題(整體概念)都還不清楚就貿然套用pattern,就很可能產生bottom-up設計方法的缺點,那就是「系統長歪掉了」。』

      原文的語意不清楚,我修正為『Gamma的意思是說,如果問題不明確,不要急著套pattern。因為此時套pattern變成一種bottom-up設計方式(理想上應該是top-down),連要解決什麼問題(整體概念)都還不清楚就貿然套用pattern,就很可能產生bottom-up設計方法的缺點,那就是「系統長歪掉了」。』

      謝謝提問。

      刪除
  3. 總覺得有點把Design Pattern給神話一般,軟體設計的銀子彈= =

    回覆刪除