90%的人封裝Storage時忽略了一個點!你們知道封裝的意義是啥嗎?

2024.01.21

二次封裝Storage?

關於Storage 的封裝問題,其實都是老生常談了,很多人都會在專案中去二次封裝Storage,為了讓開發者能更方便地去使用localStore、sessionStorage。就比如下方,應該是很多人封裝的案例,就是封裝簡單的讀取、寫入,或是有刪除、清空:

我們為什麼要封裝?

要不我們回過頭來想一下,我們為什麼要封裝?其實封裝無非就是為了兩個目的:

  • 更好地統一維護
  • 使用者更方便、更無腦地使用

但我覺得在一個大專案中以及緊急的開發進度中,使用者更方便、更無腦地使用才是封裝的第一目的,所以想想剛剛的LocalStorage 的封裝,真的能讓使用者更方便、更無腦地使用嗎?

我就舉個例子吧,我想存進去一個對象,我就這樣存,可以嗎?

顯然是不行的,存進去的物件會被轉成字串[object Object]:

所以我必須這樣去存、取值,利用JSON.parse、JSON.stringify 去轉:

這樣去做才能達到我的目的:

但是這樣不覺得很麻煩嗎?使用者更方便、更無腦地使用是封裝的第一目的,顯然這樣只會讓使用者徒然煩惱!!!

有的人就說了,可以把JSON.parse、JSON.stringify 寫在useLocalStorage 中,但是這個方案只是針對Object 而已,但是資料型別其實有多種:number、string、object、set、map、date 等等,你直接寫在裡面,不太合理,你得兼顧所有的資料型態才行!!

類型猜測邏輯

所以呢,你如果想要讓使用者更方便、更無腦地使用,我們可以封裝一套類型猜測邏輯。

首先我們必須準備一個函數,這個函數用來判斷資料型態:

但光是判斷出類型還不夠啊,我們還必須給每一種類型,準備一套讀取、存入的策略:

最後只需要:

  • 判斷類型
  • 取得類型對應的存取策略
  • 在訪問的時候執行對應策略

我們現在可以來試試能不能達到目的:

顯然已經達到我們想要的效果:

小結

當然, Storage 的封裝不僅僅是類型猜測這麼一個功能點!而且其實封裝還有很多兜底的情況我這裡沒寫出來,本文就是想讓大家知道,封裝Storage 的時候,類型猜測是一個最基本的功能,有這個功能,使用者更方便、更無腦地使用。