【我的向】20180916 - Read AND Think

前言

由於想彌補一下本身對一些函數式編程的瞭解和體會,因此特地找了一些資料來閱讀~如下的感想是來自於這本書噠:git

《JS 函數式編程指南》
做者: Franklin Risby for his great work!
地址: https://legacy.gitbook.com/bo...

什麼是純函數

純函數就是保證輸入和對應的輸出是相同的函數,也就相似於咱們課本中學的函數的概念!一個x永遠只對應一個y值。程序員

好比,js中存在的會改變原數組的一些數組操做函數,這些就是不純的。
主要是有共享的變量和成員,好比全局變量之類的。web

純的好處

  • 可緩存性(Cacheable)
  • 可移植性/自文檔化(Portable / Self-Documenting)
  • 可測試性(Testable)
  • 合理性(Reasonable)
  • 並行代碼

對於可緩存性,有下面這段「通用」的代碼,提取一次(即計算)就緩存一次,後面取的時候就不用從新計算了:編程

var memoize = function(f) {
  var cache = {};

  return function() {
    var arg_str = JSON.stringify(arguments);
    cache[arg_str] = cache[arg_str] || f.apply(f, arguments);
    return cache[arg_str];
  };
};

而若是函數是不純的話,咱們並不能靠輸入的值來提取出惟一對應的結果,由於它可能有多種狀況。數組

可移植性緩存

可移植性能夠意味着把函數序列化(serializing)並經過 socket 發送。也能夠意味着代碼可以在 web workers
中運行。總之,可移植性是一個很是強大的特性。

自文檔化是說把須要的數據都寫在參數裏,不寫成好比對象的形式,由於對象的屬性能夠在外面被修改因此可能會形成不同的結果。
而把參數都列出來,這樣使用者也知道它須要什麼數據,也就是像有文檔同樣告訴你。app

可測試性
咱們不少狀況下都是要測試某一個函數或者某一個部分,若是這個函數依賴一些全局的東西,咱們在設置斷點的時候涵蓋的範圍就會很大,因此這樣會影響咱們的測試。而純函數可讓咱們只專一於這一個函數。socket

斷言:表示爲一些布爾表達式,程序員相信在程序中的某個特定點該表達式值爲真,能夠在任什麼時候候啓用和禁用斷言驗證,所以能夠在測試時啓用斷言而在部署時禁用斷言。一樣,程序投入運行後,最終用戶在遇到問題時能夠從新啓用斷言。

合理性ide

若是一段代碼能夠替換成它執行所得的結果,並且是在不改變整個程序行爲的前提下替換的,那麼咱們就說這段代碼是引用透明的。
咱們可使用一種叫作「等式推導」(equational
reasoning)的技術來分析代碼。所謂「等式推導」就是「一對一」替換,有點像在不考慮程序性執行的怪異行爲(quirks of
programmatic evaluation)的狀況下,手動執行相關代碼。

最後一個並行代碼,就是說能夠並行運行任意純函數。因他們不須要訪問共享的內存,也不會因反作用而進入競爭狀態。函數式編程

相關文章
相關標籤/搜索