[心得] Design Patterns這樣學就會了–入門實作班

http://teddysoft.tw/
之前參加 Teddy 開的課程的心得

入門班教了GoF(Gang of Four :四人幫)23個Pattern中的11個,但是如果你認為我上完課程後最大的心得是懂了這11個Pattern的話,那就是大錯特錯了XD
並且,個人覺得上完這個課程如果最大的收穫是學到這11個Pattern的話,我覺得非常可惜

就如Teddy說的,其實第一節課最一開始講的,才是本次課程最重要的而且受用無窮的地方,就是關於什麼是設計、什麼是好的設計、什麼是Pattern等
這些有聽的進去,或者說能夠初步的體驗、種植在腦袋中的話,日後對於思考一些問題應該都有滿大的幫助

換個方式說,Pattern是一些經驗去「找尋」出來的痕跡,那你要如何在你自己的生活中找到一個Pattern呢?
畢竟天下Pattern萬萬種,你不可能都學會吧?所以要懂得如何去尋找、思考這點是相對於來說是「根本」覺得是最重要的地方!

至於GoF的23個Pattern不重要嗎?當然不是,而是相對來說這是沒有那麼重要的,但你能夠多瞭解一些Pattern,就表示你多吸收了人家的經驗, 在遇到問題的時候,你就可以比較容易的從這些「經驗」中找尋適合的解法

但是當你要套用Pattern的時候,有些事情要知道
(1) 一種Pattern只解決一個問題,套用一個解決不了的話,就在套另外一個(當然套用一個Pattern解決不了問題還有另外一個問題就是套錯了,所以上課聽Teddy教11個Pattern還是有用低XD)
(2) 要套用哪一種Pattern不能看你的「程式結構」而是要看 你要解決的問題! GoF的Pattern很多的Class Diagram長的都是很雷同的,所以你不能拿「程式結構」來決定你要套的Pattern,而是你要解決的問題
(3) 套用Pattern不一定會減少程式碼,但是一定會減少重複的程式碼
(4) 套用Pattern一定會使你的程式架構變得比較複雜些,但懂得人這樣其實是比較「容易」些
(5) 其實所有的Pattern都是多了一層間接層達到目的的

最後,上完這三天聽了11種Pattern學這些Pattern需不需要學呢?
我覺得如果你心中寫程式有些堅持、原則的話,學Pattern也許並沒有那麼重要,可能只是對於你平常寫程式時候的一些「驗證」
我覺得要把程式寫好,有幾個簡單的堅持(原則)
(1) 懶,換句話說就是減少重複的Code,而重複的Code不僅是真的程式碼一模一樣的重複出現,也包含程式碼的「樣式」很雷同的重複出現,思考減少這些狀況
(2) 做到可以盡量不要動原有的程式碼的狀況下,可以輕鬆的達到擴充功能
(3) 不斷的rethink、refine,挑戰自己的思考
(4) 確實的知道物件導向的特性(封裝、繼承、多型)以及你自己熟悉語言在這些特性上的實現

我覺得能夠最到我說的第一點,應該就可以把程式寫好到一種程度了,尤其對於剛入門的程式設計師,哈XD

其實大師描述的更精要,而且很重要!(老師說了有沒有在聽?XD) GoF說的兩點
(1) Programming to an interface not an implementation,其實這點跟最近流行的DI(Dependency Injection應該是有相關的),這邊有C#的例子:CodeProject
(2) Favor composition over inheritance(多用合成少用繼承,啊?你問我什麼是合成?去查資料吧XD),這邊有C#的例子:CodeProject

另外是OOD的五點:SOLID,分別是
S = Single Responsibility Principle
O = Opened Closed Principle (這個跟我說的第二點是一樣的意思,不信?去查就知道了XD)
L = Liskov Substitution Principle
I = Interface Segregation Principle
D = Dependency Inversion Principle
目前比較常聽到的事S、O,D是最近很常聽到的IoC

以上,希望對各位寫程式的生涯上有所幫助XD  

2014/10/27 08:48補充:寫在最後的最後,為什麼要把程式寫好?不是能動就好了?我覺得是要對的起自己的良心,現在黑心的東西太多惹XD

2014/10/28 21:17補充:Learning The S.O.L.I.D Programming Principles: Overview [Part - I],剛好CodeProject有人寫了一系列的文章用C#解說OOD的五個原則