上篇說 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。
函數式程式設計是一種程式設計範式,最主要的特征是,函數是第一等公民。
特點:
- 函數可以被指派給變量
var hello = function() {}
- 函數能被當作參數傳入
fetch('www.google.com') .then(function(response) {}) // 匿名 function 被傳入 then()
- 函數能被當作傳回值
var a = function(a) {
return function(b) {
return a + b;
};
// 可以回傳一個 function
}
-
函數式程式設計強調 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 的特性,是以較不用擔心死鎖等問題。