iT邦幫忙

2022 iThome 鐵人賽

DAY 18
0

在這邊我們再次針對純函式做個簡單的整理,一個函式若要成立純函式需要包含以下特性:

  • 一定要傳入參數
  • 不帶有自身的狀態
  • 回傳值只依賴傳入的參數
  • 函式本身不會對其他變數造成任何改變

這些要素可以簡單統整為:「同樣的輸入會有同樣的輸出且不產生副作用之函式」。

透過使用純函式的方式來封裝我們的取用資料的方式,有非常多的優點:

  1. 可預期性:可以大大降低「意外」的產生,沒有預期外的副作用,就也可以降低「蟲蟲」的誕生
  2. 可維護性:風格一致的程式碼,後續更好維護
  3. 可複用性:純函式要成立通常都會是一個「獨立且抽象」概念,由於沒有自己的狀態,且可以透過外部主體來控制產出(output),與其他程式碼就不會有高度的耦合,也更能被重複使用
  4. 可被測試性:在大多數討論 FP 及純函式中的文章中,我們可以看到,大家把測試與純函式的概念綁在一起,但實際上只是兩者同樣都有「單一任務原則」的樣貌,當有錯誤發生時,這個錯誤也會因為純函式 、單輸入單輸出的原則而能被更好、明顯地檢查出來。

當然除了純函式我們在這個章節也聊了很多其他內容:

重點整理:

  • 抽象化(英語:Abstraction)是將資料與程式,以它的語意來呈現出它的外觀,但是隱藏起它的實作細節。抽象化是用來減少程式的複雜度,使得程式設計師可以專注在處理少數重要的部份。
  • 在電腦科學中,在程式的執行過程中,修改到全域、區域變數狀態、有傳參考特性之參數或是物件等值的改變,都可以稱的上是副作用。
  • 前端開發中,會有許多行為會產生副作用,包含:CSS 選擇器的覆蓋、堆疊、樣式修改;透過 Web APIs 操作 DOM tree ,影響節點與節點的相對關係;JavaScript 中全域、區域變數修改及 Mutaion 的行為。
  • 與純函式不同,Impure Function 會在執行的過程中產生副作用,或是我們在函式中使用了 Mutable Data(例如帶有自己的狀態),帶來預期之外值的改變。
  • 命令式程式設計主要是使用陳述式的方式來進行程式碼的撰寫。
  • 宣告式程式設計中,我們只使用表達式來進行程式碼的撰寫。
  • FP 就是宣告式程式設計的一種,我們透過使用純函式來嚴格限制函式的輸入與輸出,透過這樣的方式,函式最終產生的結果絕對會與我們所輸入的內容,也就是參數有所關係。

關於純函式到此告一個段落,在下個章節中,我們要來聊聊 FP 中,一個非常重要的概念:柯里化(Curring),就讓我們下章見吧!


上一篇
Day 17:什麼是純函式 ?(5):宣告式程式設計
下一篇
Day 19:什麼是 Currying(1)?瀏覽器運作簡介
系列文
致 JavaScript 開發者的 Functional Programming 新手指南30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

3
良葛格
iT邦新手 2 級 ‧ 2022-09-24 17:07:47

不帶有自身的狀態

純函式可以帶有狀態,只是那個狀態不會(或不能)變動,什麼時候一個純函式會帶有狀態?Closure 是一個例子,使用案例之一是,你可以將一個運算的結果用 Closure 保存下來,後續基於該運算的結果繼續其他運算,因為純函數式裡 immutable 的天性,Closure 保存下來的狀態,不用擔心會被變更,運算也就完全能依照輸入,產生對應的輸出,一樣是純函式。

純函數式沒有狀態是對函數式設計最常見的誤解之一,一個真實系統不可能沒有狀態,只是在純函數式的部份,一個狀態構成就不會再被改變,如果系統需要進入新的狀態,不是改變原本承載狀態的載體,而是建立一個新的載體,承載新的狀態。

我要留言

立即登入留言