在寫Utility之前,先簡單說明一下程式開發上的抽像化概念,抽像化(Abstraction)會是個非常重要的影響,一般來說我們會將模組或是功能個別做獨立開發,然後接下來去描述它們之間的互動關係,因此抽像化它有2個優點

資源的覆用 : 所以抽像化(Abstraction)在一定程度以上它其實是在協助你做到一定程度的覆用,比如說我寫了一段程式碼或是一個元件UI也可以用在其他地方,無形中我就降低了開發成本跟未來的維護成本。

範圍的界定 : 在設計怎麼抽像化你的程式時,某個程度上它讓你去看待整個系統之間內在的關聯性,所以抽象化對於範圍的界定有非常重要的影響

簡單的介紹抽像化之後,在React我們通常有3種方式可以來做抽象化

1. Utility

2.high order component

3. render props

而這邊要介紹的Utility,其實就是指把共用的邏輯抽象化出來,例如我們要做某一個點擊的功能,

  • 點擊後會出現alert(‘hello world’),
  • 按了第二次時文字消失
  • 點擊2次之後不能再按

而上述的這3個點擊後的行為,我們可以把它包成一個功能來使用或是可以理解為另外抽出來使用,而這樣把把可能會常用而抽像化的方式我們稱Utility。

那再以上面這個為例,我們可以針對上面的3個行為做個資訊分析

  • 邏輯封裝 : alert
  • 狀態封裝 : 按的次數
  • 狀態交換 : 次數的共通資訊

所以Utility基本上就是一些預先寫好的抽像化程式碼 -> 第一次寫好後,抽成function給第二次使用

y = 3x+1 +  6x+2 + 9x+3

=(3x+1)+2(3x+1)+3(3x+1)

=>f(x) = (3x+1), y=f(x)+2f(x)+3f(x)

所以Utility的概念其實就是把整個邏輯描述完之後,用function的形式把一致性的部份抽像化出來,然後你就可以從中看出他們的一些關聯性

Utility 優點

可以很乾淨的分化,如圖所示,可以把要做的重覆的事另外拉成function,它其實是一個非常直觀的做法

 

Utility 缺點

Utility其實是有點鬆散,因為它只有把邏輯抽象化出來,但它並沒有把資料抽象化出來(這邊先不討論一些JS常用的資料封裝方式),我們可以這樣想,大部份情況下資料跟邏輯是綁在一起的,所以如果沒有一個很好的寫法,Utility 其實是很難的抽象化及重覆利用的

Utility本質上還是一個函數,一般情形下函數通常會需要帶入參數,嚴格說起來Utility其實是在語言程式做動的,以下圖為例,基本上還是在撰寫Javascript的函式,它跟React並沒有直接關係