可以這么說,響應式編程是繼承自函數式編程。從Rx的官網上我們看到這樣的定義:
RxJS是結合了觀察者模式,迭代器模式和函數式編程優點的產物。
觀察者模式在前文中已經出現過了,下面我們來看看函數式編程和迭代器模式。
函數式編程
函數式編程是一種開發軟件的范式,強調使用函數來創建應用程序。聲明式的,不可變的,沒有副作用的是函數式編程的三大護法。
其中不可變
武功最高深。一直使用面向對象范式編程的我們,習慣了用變量存儲和追蹤程序的狀態。然而我們如何在變量不可變的情況下來完成同樣的功能呢?這里舉個鐘表時間的例子,從早上7點到早上8點,存儲時間的變量必然從7變成了8。用函數式的觀點,不能改變變量的值,那如何追蹤時間的變化,那就每走一秒,我們就重新創建個鐘表,在程序中就是新創建個實例,最終,我們得到的結果都是指向8點的鐘表。
RxJS從函數式編程范式中借鑒了很多東西,比如鏈式函數調用,惰性求值等等。
其他兩大護法,我們簡單說一下。什么叫聲明式的語句,請參看SQL查詢語句的寫法。沒有副作用的,我們就看看什么是副作用:在函數中與函數作用域之外的一切事物有交互的就產生了副作用。比如讀寫文件,在控制臺打印語句,修改頁面元素的css等等。在RxJS中,把副作用問題推給了訂閱者來解決。其實副作用這個問題,大家早已熟悉了——編程中最忌諱的全局變量。說白了,共享的都是不安全的,尤其是在多線程,異步環境下,在這里就不多說了。函數式編程我會單開haskell系列來講。
迭代器模式
RxJS中一個關鍵的設計理念是遍歷機制。了解過迭代器設計模式的人應該清楚,迭代器模式的主題思想就是不管要遍歷的數據結構是什么,樹也好,圖也好,我們都用同樣的方式操作它們(for...of)。在ES6中引入了迭代器協議,具體內容請參見http://es6.ruanyifeng.com/#docs/iterator。RxJS中的消費者(observer)也實現了類似的協議用來通知生產者(observable)繼續發送數據。
數據驅動開發
RxJS鼓勵使用數據驅動的方式進行開發。數據驅動可以把數據和處理數據的行為分隔開來,這也是RxJS的核心設計決定,使我們可以用同樣的方式處理不同的數據源。