RxJS 系列故事(1)——理解響應式編程

在學習 RxJS 的過程當中,我發現不少概念晦澀難懂,好比:響應式編程、觀察者模式、各類各樣的操做符以及多播等等。理解這些概念一般會花費大量時間,並且很難將它們吃透。因而我就寫了一個關於「大學生創業」的小故事,以幫助你們理解 RxJS 的核心概念。編程

故事的主角小王是一個計算機專業的大學生,接下來讓咱們先跟隨小王的腳步,去理解命令式編程、聲明式編程以及響應式編程。編程語言

命令式編程

小王畢業以後就回老家開了一家超市。小王一我的忙不過來,因而就僱了李叔來店裏幫忙。爲了更好地瞭解超市的經營情況,小王就讓李叔去統計一下上週的總支出。可李叔哪會這個呀,因而小王只好交代清楚每個步驟:

一、記錄天天的支出函數式編程

二、將一週內天天的支出加起來函數

三、將結果發給老闆學習

在處理問題時,命令式編程須要經過編程語言的循環語句(for/while)或條件語句(switch/if)等,去描述清楚每一步要怎麼作(How),才能達到最終的結果(What)。code

用命令式的方式,來計算總支出,代碼以下:事件

function getTotalCosts(costs) {
  let total = 0;
  for (let i = 0; i < 7; i++) {
    total = total + costs[i];
  }
  return total;
}
李叔按照小王的指令計算好了總支出。但小王得知後卻有點苦惱,由於支出的費用比較高。因而,就讓李叔趕忙再算一下:若是天天減小百分之十的支出,看看一週能省多少錢?可李叔仍是不知道如何計算。小王心想,這不就和以前差很少嗎?沒辦法,仍是隻有手把手教:

一、記錄天天的支出ip

二、將天天的支出乘以0.9開發

三、將一週內天天的支出加起來get

四、將結果發給老闆

用命令式的方式,來計算減小後的總支出,代碼以下:

function getReducedCosts(costs) {
  let total = 0;
  for (let i = 0; i < 7; i++) {
    total = total + costs[i] * 0.9;
  }
  return total;
}

是否是感受很重複?這就是命令式編程的一個問題。現實中的不少問題都具備「類似的模式」,若是將這些模式抽象出來,就能夠減小大量重複代碼。

聲明式編程

小王以爲只統計支出還不夠,也須要關注店裏的營業額。但店裏的事情太多了,手把手教李叔去作真的很累。因而,他便讓學財務的表妹過來幫忙。這樣小王只需告訴表妹:幫我統計一下今天店裏的營業額,便可。至於怎麼計算營業額,表妹自有辦法解決。

在處理問題時,聲明式編程只需描述要作什麼(What),而不須要告訴機器具體要怎麼作(How)。

用聲明式的方式,來計算以前的兩個問題,代碼以下:

const getTotalCosts = (costs) => costs.reduce((res, item) => res + item);
const getReducedCosts = (costs) => costs.reduce((res, item) => res + item * 0.9);

能夠看到,代碼簡潔了不少。在命令式編程中的循環語句,都被封裝到了 reduce 函數中。這讓開發效率有了提高。此外,聲明式編程也是函數式編程的基礎。

響應式編程

雖然表妹的到來給小王減輕了很多負擔,但這樣的管理模式,對學計算機的他而言仍是不夠智能。因而,他就買了一個商家管理系統。只要賣出一件商品,系統就會自動計算營業額,這樣小王隨時想查看報表都沒問題。由於報表會「響應」商品的變化。

響應式編程是一種面向「數據流」和「變化傳播」的編程範式(來自維基百科)。有點難懂是否是? 不過咱們能夠這麼來理解:

數據流能夠想象成在超市結帳時的發生的一系列事件,好比:

-------薯片x1------泡鳳爪x1------無糖可樂x3------餅乾x2------時間軸--->

而變化傳播能夠用收銀臺變化着的總價來理解:隨着收銀員描完一件件商品的二維碼,屏幕上顯示的總價格也在不斷髮生改變。

響應式編程與咱們以前提到的命令式編程、聲明式編程有很大的不一樣。不論是命令式編程仍是聲明式編程,描述的都是一個「瞬時」的過程。就比如讓表妹去計算一下目前的營業額,等表妹計算完以後,即使有新的商品賣出,這個數字也不會再發生變化,除非從新計算一次。

而響應式編程更多的是對關係的描述。好比:營業額 = 賣出商品的價格之和。只要有新的商品賣出,營業額就會隨之發生變化。

對於我而言,響應式編程帶來的更可能是思惟方式上的轉變。傳統的思惟模式是 pull 模式,就是主動「拉取」的過程。好比我想獲取某個數據,那麼我就會主動去調用某個函數。而響應式是 push 模式,當我訂閱一個數據源以後,數據就會在合適的時機「推送」給我。

在響應式編程中,「預鋪設管道」很是重要,當咱們將管道鋪設好以後,數據就會隨着管道流動,一切都會按照咱們預設的邏輯發生。

小結

經過小王的創業故事,咱們瞭解了命令式編程、聲明式編程和響應式編程。下面,讓咱們再回顧一下它們的特色:

  1. 命令式編程:須要描述清楚每一步要怎麼作(How),才能達到最終的結果(What)。
  2. 聲明式編程:只需描述要作什麼(What),而不須要告訴機器具體要怎麼作(How)。
  3. 響應式編程:基於數據流和變化傳播。體現了響應變化的過程。

參考

https://zhuanlan.zhihu.com/p/...

相關文章
相關標籤/搜索