Day 16 談到介面與目錄結構,筆者用一個抽象類別 CacheProvider 來實作 PSR-16 的介面 Psr\SimpleCache\CacheInterface,然後再讓各個 Cache Driver 來繼承 CacheProvider

情境

筆者隆重介紹兩位虛擬的登場人物,藉由對話的方式來幫助理解。

出場人物介紹

  • 小克 - 專案經理 (project manager)。自稱是程式設計師但不會寫程式。講話很白目,常把團隊氣氛搞的很僵。
  • 阿泰 - 程式設計師。小克團隊內的研發團隊一員。為了生活,一直敢怒不敢言。

新專案「代號:鐵人」開始,小克團隊開始內部討論程式架構,小克身為 PM 但很愛管底下的人程式怎麼寫。看到這覺得疑惑:

「為什麼不讓 Cache Driver 直接實作 CacheInterface 就好,而是先用抽象類別實作介面,這不是脫褲子放屁嗎?」

小克心想的 UML 架構圖

「小克呀!事情沒這麼簡單。」阿泰回答。

PSR-16 的規範寫的很清楚,除了參數的型別不是規範的型別的話,要丟出 InvalidArgumentException,還有其它邏輯要處理,例如 TTL 過期了,要刪除。

要是這樣的邏輯處理,每個 Driver 都要寫一遍,重複的程式碼會很多哦,維護也會變得複雜!

CacheProvider 的角色就是負責處理這些重複性的邏輯。

圖例:PRS-16 文件部分截圖

CacheProvider 的 UML 架構圖

AssertTrait 提供檢查輸入參數正確性的方法。實作 CacheInterface 的 8 個方法中依 PSR-16 的規範檢查輸入後,再交給只專心實作功能的 5 個抽象方法,分別為:

  • doGet()
  • doSet()
  • doDelete()
  • doClear()
  • doHas()

然後其它 Driver 只要實作這 5 個抽象方法就可以了。檢查過期的部分也由 isExpired 這個方法處理掉了。

AssertTrait

範例:/day-19/src/SimpleCache/AssertTrait.php

AssertTrait 提供檢查輸入參數正確性的方法。依 PSR-16 的規範拋出實作 Psr\SimpleCache\InvalidArgumentException 介面的類別。

CacheProvider

範例:/day-19/src/SimpleCache/CacheProvider.php

寫好後先測試一下基本的 get, set, delete, clear

CacheProviderTest 類別

範例:/day-19/tests/SimpleCache/CacheProviderTest.php

進行測試

「經過我這樣的說明,瞭解了嗎?基本的測試已經通過,我正打算依此架構開始寫 Driver了。」阿泰說。

「要是我也會這樣寫。我剛剛只是隨便說試探你的反應啦。」

小克說完,就跑到其它部門串門子了。

總結

在開始設計之前先花點時間思考,可能重複性的程式碼,事先把邏輯獨立出來處理,會比事後一個一個修改還好唷。

本篇進度的程式碼
鐵人賽而生的專案程式碼

配合鐵人賽而生的專案程式碼會隨時修改,不一定會和本篇文章一樣。如看範例,請見本篇進度的程式碼。

明天的主題會是 File Driver 的寫法,我們明天見囉!

最後修改日期: 2022-02-07

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。