--- title: 為什麼要學 Design Pattern ? tags: mentorship, Design Pattern description: 2019/08/25 --- ## 為什麼要學 Design Patterns ? ### 前言 一直想要寫一系列關於 design pattern 的筆記,去年有嘗試過寫了 [Design Pattern初心者筆記#1](https://medium.com/@nwy0206/design-pattern初心者筆記-1-95774a905010),但因為那時還不太能吸收及要參加課程沒有繼續寫。 這次希望等把《Design pattern by tutorial》和相關的知識整理收錄,算是[讀書會](https://medium.com/@nwy0206/swift-design-pattern-study-group-f902f5e0ddb1)的一個延續,也記錄一下自己學 design pattern 的收穫和感想,同時也希望自身的經歷可以幫助也其他想要學 design pattern 的人。 ### 開始之前 「為什麼要學 design pattern 」我想是每一個人在學 design pattern 之前都會問的問題。 回想自己之所以會開始學設計模式是因為發現很多工作都要求要會設計模式,為了轉職所以我就開始學了,但那時對設計模式根本沒什麼概念,也不知道為什麼軟體工程師要會設計模式。 我是在工作後才對設計模式對寫程式的幫助有比較深的體會,所以想分享一下自己的經驗讓初學者知道為什麼要學設計模式。 ### 什麼是 Design pattern? 要講這主題之前,我們需要了解什麼是設計模式。一般軟體圈講的設計模式是指 GoF 的23個 design pattern ,而 GoF 的23個設計模式全名是 object oriented design pattern,所以設計模式是指在物件導向基礎上的一套設計原則,但這些設計原則也不是 GoF 憑空想出來的,而是結合前人的經驗整理總結出來的一套原則,是一套檢驗過、行之有效的方法。 設計模式在[維基百科](https://zh.wikipedia.org/zh-tw/设计模式_(计算机))上的定義: > 『在軟體工程中,設計模式(design pattern)是對軟體設計中普遍存在(反覆出現)的各種問題,所提出的解決方案。』 - 維基百科 ### 為什麼我們需要 Design pattern? 黑格爾講過「存在即合理」,現實存在的事物必定是有它存在的原因,而設計模式的原因是要 "to a commonly occurring problem in software design” ,解決軟體設計上常見的問題。 身為一個軟體工程師,我們最常見的問題是什麼?不是PM,不是UI,而是**變動的需求**。 之前曾聽過一個不錯的比喻說我們的軟體像是在需求海中航行的船,需求是一波接一波撲面而來的浪,我們無法預測下一波的浪會有多大,能做的只有想辦法加固我們的船讓我們在風浪中能夠應對、繼續航行。 當需求有變動,代表我們的程式碼也需要作出相應的更動去完成需求,而程式碼變更,就會有可能出現不可預期 bug,讓我們辛苦寫出來的系統崩潰,所以變動的需求是我們最大的敵人,但同時這也是無法避免的事。 我們能做的只有想辦法降低修改程式碼而導致有 bug 的可能性,設計模式就是達到此目的的手段之一。 > 設計模式簡化設計的過程 此外,設計模式是別人已經想好怎樣去解決某些問題的方法,能幫我們節省時間,使工作更有效率。 使用設計模式就像是套用用數學公式一樣,你不知道 n(n+1)/2 能不能算出 1 到 100 的總和?也是可以。那為什麼要用公式? 因為公式簡化了運算的過程,方便、快捷而有效。 經無數數學家驗證過、有用的數學公式能幫助我們減省運算,所以它們會被記下來日後使用,設計模式也一樣,經無數軟體工程師驗證過有效的經驗和方法,可以幫助我們解決程式設計上的常見問題,學會設計模式可以幫助我們在程式設計上更節省時間。 跟數學公式不一樣的是因爲每個需求都不會一模一樣,所以我們不能像數學公式般直接套用,要按需求靈感活運用,這方面會在以後的筆記再討論。 ## 最後 以上是我一些對 為什麼要學 design pattern 的看法和體會。 我認為如果不知道為何而學很容易會半途而廢,希望這篇對同樣也在學 design pattern 的人會有些幫助。
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.