iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 3
1
Software Development

PHP 大師之路 - 開源的技術淬練系列 第 3

Day 3 - PHP 設計模式 (Design Pattern)

  • 分享至 

  • xImage
  •  

設計模式

在這一系列的文章中,會特別介紹設計模式 (design pattern)。什麼是設計模式呢?當筆者第一次知道這四個字的時候,買了幾本工具書,看了許多文章,然後呢...沒有然後了。

不虧是專業程式設計高手寫的書,對於當時的我,完全看不懂,一頭霧水。按照書中的範例程式碼按步就班地練習了幾次,然後就忘記了。如果有更白話、貼近一般生活的解釋會不會比較好懂呢?

什麼是設計模式

設計模式是程式設計的「best practice」,有的書翻成:最佳實踐、最佳實作、好習慣。總之,就是從平庸的程式設計師要寫出頂尖的程式碼必須學習的方法。它不是專屬於 PHP,因為它是一種概念、一種思考習慣,在 PHP 練習到的設計模式一樣可以用在其它的程式語言。

武林版

如同金庸的武林小說,裡頭的武林高手使用的招式,都會有個名字,例如降龍十八掌、獨孤九劍、九陰白骨爪等等。但如果這些招式沒有名字,實際上也不影響這些武林高手出招,因為那本來就是他們已經會的招式。

武林高手為了傳授弟子學習這些好招,必須記錄在紙本上,寫成武功秘笈,將招式命名,一步一步寫在裡面。

九陰白骨爪

Credit: Dai-Chang Yang

只知道招式名字,沒有內化成自己的武功,是完全沒用的。(笑)

現代版

觀察了很多高手的程式碼,在他們的程式碼中會發現有類似的寫法 (武林版:招式),對於解決一些問題 (武林版:對手) 特別有效,更多程式設計人員模仿、學習這樣的寫法。有人整理了這樣的寫法 (武林版:武功秘笈),為了方便大家學習,就給了這些寫法一個名字 (武林版:招式名稱),於是有了單例 (signgleton)、工廠 (factory) 等等名字。

學習方法

於是乎過了幾年,累績了經驗,回過頭看,突然明白了這是怎麼一回事。

「買了工具書,光是看,或者按照書中的範例練習,是沒用的。」

平常工作都是使用現成的框架 (framework),使用別人寫好的函式庫 (library、package),光是 if, else, foreach, switch 套用別人寫好的函式庫、框架內建的功能就能應用在工作所需,不需要自己費心去造輪子,說白了沒什麼機會及動機去運用設計模式。

實際應用

你必須實際把設計模式應用在自己的作品中,經過大腦的慎密思考,當在維護自己的作品時,思考如何讓作品更棒時,設計模式就會不知不覺、悄悄地內化了。甚至不需要知道用的是什麼名字的設計模式,因為它已經是內在的一部分。

而這也是筆者的系列標題「開源的技術粹練」,藉由開源自己的作品,讓自己的技術日益進步。

而工具書是必須買的。當沒有點子來最佳化自己的程式碼時,或晚上失眠睡不著時,拿來翻翻助眠(真的會幫助睡意),有時候會發現有些寫法是可以用在目前在做的東西。如此實際應用,才會把好的寫法變成自己的習慣寫法。

常見設計模式

叫的出名字的設計模式有三十種以上,但不是每一種都很常見,除非你的作品整個專案規模非常大,否則大部分用到的機會趨於零。接下來會每天各一個篇幅來介紹以下最常見的設計模式,未來用在你的作品的機會非常高的。

  • 單例 (singleton)
  • 註冊表 (registry)
  • 工廠 (factory)
  • 觀察者 (observer)
  • 依賴注入 (denpendency injection)

我們明天見。


本文同步更新於 TerryL 部落格 Day 3 - PHP 設計模式 (Design Pattern),歡迎前往討論。


上一篇
Day 2 - PHP 各版本差異
下一篇
Day 4 - PHP 設計模式:單例 (Singleton)
系列文
PHP 大師之路 - 開源的技術淬練30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言