l

2014年3月27日 星期四

先學物件導向還是先學設計模式?

Mar. 12 16:12~17:03

螢幕快照 2014-03-12 下午4.43.03

 

在〈Top-down和Bottom-up設計方法〉中,Teddy比較Pattern Language與Design Pattern所採取設計方法的不同,前者是由上而下的設計,後者是由下而上的設計。今天把範圍再縮小一些,談談物件導向(OO)和設計模式的關係。

很多人可能已經知道,design pattern用到了OO技巧,因此學design pattern至少要懂一些基礎的OO觀念,像是類別、物件、介面、繼承、多形等。而design pattern相對來講好像是比OO還要「高級」的技術,所以非得把OO學個「精通」,最好再去考個什麼OO證照之類的東西,再來學design pattern應該比較容易。

很不幸的,這種單純的bottom-up方式,有可能一直困在OO這一層,而延緩了「升級」的時機。

***

有一派人士認為,只要稍微了解OO觀念之後,直接學習design pattern可以反過來加速對於OO的理解。Erich Gamma在訪問中提到

I think patterns as a whole can help people learn object-oriented thinking: how you can leverage polymorphism, design for composition, delegation, balance responsibilities, and provide pluggable behavior.

從這個角度來看,由pattern去學OO,就是一種「由上而下」的學習方式。由上而下的設計或是學習方式的好處,在〈Top-down和Bottom-up設計方法〉裡面已經談過,因為「整體」先存在,所以透過整體分解的過程,只是讓整體的輪廓更加清楚,比較不容易「長歪掉」。也就是說,每一個pattern代表著某些良好的OO特性,直接去學習pattern也就學到了個別的OO優點。當然這些OO優點也可以用「由下而上」的方式慢慢兜起來,但是在經驗不夠的情況下,可能需要花一段時間,或是嘗試過許多錯誤之後,才會慢慢發現如何靈活運用這些好的OO技巧。

***

鄉民甲:所以Teddy你的意思是說從design pattern來學OO這種方式比較好?

達摩大師:無所謂好壞,端看造化而定。

鄉民甲:切,又是這一句。

學習並不是一種線性的歷程,而是來來回回,逐步成長的過程,如此才能產生「層次」(怎麼跟敏捷開發那麼像)。所以,單一方向的top-down或是bottom-up,效果可能都不會很好。Teddy自己的經驗是,基本的OO觀念學一點,design pattern學一點,然後會對OO觀念有更具體與深刻的感受,再回頭學一些design pattern。依此類推,這種上下夾擊的方式比較容易累積功力。

不然賴尿蝦牛丸是怎麼來的不要告訴別人

***

友藏內心獨白:Context不同,原本的bottom-up就變成top-down了。

2 則留言:

  1. OO 類似於內功的型態
    Design pattern 類似於學派的招式

    兩者精神某些相似,但整體的作法又不相同
    ,因許多武學之道既相似卻又不相同

    Design pattern 不一定要使用 OO 才能達成,OO 也不一定會搭配 Design Pattern 進行實作。

    回覆刪除
  2. 不覺得一定要把Design Pattern跟OO綁一起,我自己就是單純的先學OO,之後才接觸Design Pattern,不覺得有啥不妥的。另外我一直覺得Design Pattern不是必要的,Design Pattern是發現來的,不是發明來的,不需要凡事都特別想套個Design Pattern的,自然而然就用了,我覺得那才是正道,特地為了用Design Pattern為用而用,我覺得有點邪魔歪道了,只是個人感想。

    回覆刪除