天天看點

2. 函數式程式設計

上篇說 ReactiveX.io (官網)給的定義是,Rx是一個使用可觀察資料流進行異步程式設計的程式設計接口,ReactiveX結合了觀察者模式、疊代器模式和函數式程式設計的精華!

什麼是 函數式程式設計 Functional Programming

簡單說 Functional Programming 核心思想就是做運算處理,并用 function 來思考問題,例如像以下的算數運算式:

例如像以下的算數運算式:

(5 + 6) - 1 * 3

我們可以寫成

const add = (a, b) => a + b
const mul = (a, b) => a * b
const sub = (a, b) => a - b

sub(add(5, 6), mul(1, 3))
           

我們把每個運算包成一個個不同的 function,并用這些 function 組合出我們要的結果,這就是最簡單的 Functional Programming。

函數式程式設計是一種程式設計範式,最主要的特征是,函數是第一等公民。

特點:

  1. 函數可以被指派給變量

    var hello = function() {}

  2. 函數能被當作參數傳入

    fetch('www.google.com') .then(function(response) {}) // 匿名 function 被傳入 then()

  3. 函數能被當作傳回值
var a = function(a) {
    return function(b) {
      return a + b;
    }; 
    // 可以回傳一個 function
}
           
  1. 函數式程式設計強調 function 要保持純粹,隻做運算并傳回一個值,沒有其他額外的行為。

    純函數 (Pure function 是指 一個 function 給予相同的參數,永遠會回傳相同的傳回值,并且沒有任何顯著的副作用(Side Effect))

var arr = [1, 2, 3, 4, 5];

arr.slice(0, 3); // [1, 2, 3]

arr.slice(0, 3); // [1, 2, 3]

arr.slice(0, 3); // [1, 2, 3]
           

這裡可以看到 slice 不管執行幾次,傳回值都是相同的,并且除了傳回一個值(value)之外并沒有做任何事,是以 slice 就是一個 pure function。

var arr = [1, 2, 3, 4, 5];

arr.splice(0, 3); // [1, 2, 3]

arr.splice(0, 3); // [4, 5]

arr.slice(0, 3); // []
           

這裡我們換成用 splice,因為 splice 每執行一次就會影響 arr 的值,導緻每次結果都不同,這就很明顯不是一個 pure function。

函數式程式設計好處

  • 可讀性高
[9, 4].concat([8, 7]) // 合并數組
      .sort()  // 排序
      .filter(x => x > 5) // 過濾出大于 5 的
           
  • 可維護性高

    因為純函數等特性,執行結果不依賴外部狀态,且不會對外部環境有任何操作

  • 易于平行/并行處理

    因為我們基本上隻做運算不碰 I/O,再加上沒有 Side Effect 的特性,是以較不用擔心死鎖等問題。

繼續閱讀