在 Day 16 談到介面與目錄結構,筆者用一個抽象類別 CacheProvider
來實作 PSR-16 的介面 Psr\SimpleCache\CacheInterface
,然後再讓各個 Cache Driver 來繼承 CacheProvider
。
筆者隆重介紹兩位虛擬的登場人物,藉由對話的方式來幫助理解。
新專案「代號:鐵人」開始,小克團隊開始內部討論程式架構,小克身為 PM 但很愛管底下的人程式怎麼寫。看到這覺得疑惑:
「為什麼不讓 Cache Driver 直接實作 CacheInterface
就好,而是先用抽象類別實作介面,這不是脫褲子放屁嗎?」
「小克呀!事情沒這麼簡單。」阿泰回答。
PSR-16 的規範寫的很清楚,除了參數的型別不是規範的型別的話,要丟出 InvalidArgumentException,還有其它邏輯要處理,例如 TTL 過期了,要刪除。
要是這樣的邏輯處理,每個 Driver 都要寫一遍,重複的程式碼會很多哦,維護也會變得複雜!
CacheProvider
的角色就是負責處理這些重複性的邏輯。
圖例:PRS-16 文件部分截圖
AssertTrait
提供檢查輸入參數正確性的方法。實作 CacheInterface
的 8 個方法中依 PSR-16 的規範檢查輸入後,再交給只專心實作功能的 5 個抽象方法,分別為:
然後其它 Driver 只要實作這 5 個抽象方法就可以了。檢查過期的部分也由 isExpired
這個方法處理掉了。
範例:/day-19/src/SimpleCache/AssertTrait.php
AssertTrait
提供檢查輸入參數正確性的方法。依 PSR-16 的規範拋出實作 Psr\SimpleCache\InvalidArgumentException
介面的類別。
範例:/day-19/src/SimpleCache/CacheProvider.php
寫好後先測試一下基本的 get
, set
, delete
, clear
。
範例:/day-19/tests/SimpleCache/CacheProviderTest.php
「經過我這樣的說明,瞭解了嗎?基本的測試已經通過,我正打算依此架構開始寫 Driver了。」阿泰說。
「要是我也會這樣寫。我剛剛只是隨便說試探你的反應啦。」
小克說完,就跑到其它部門串門子了。
在開始設計之前先花點時間思考,可能重複性的程式碼,事先把邏輯獨立出來處理,會比事後一個一個修改還好唷。
配合鐵人賽而生的專案程式碼會隨時修改,不一定會和本篇文章一樣。如看範例,請見本篇進度的程式碼。
明天的主題會是 File Driver 的寫法,我們明天見囉!
本文同步更新於 TerryL 部落格 Day 19 - PHP 套件設計實戰 (5) 抽象類別 CacheProvider 的角色定位,歡迎前往討論。