本系列的七篇文章(目前完成進度:2/7):
1、響應式編程
2、觀察者模式及Rx基礎概念解釋
3、RxJava深入淺出
4、RxJava+Retrofit 的結合
5、RxJava的高階高階
6、Retrofit的高階應用
7、總結
引子
關于什么是函數響應式編程,官方一點的解析是:響應式編程是一種面向數據流和變化傳播的編程范式。是的,每個字我都看的懂,但是組合起來就我就不知道是什么意思了。
好吧,其實我們把定語去掉,就變成了:響應式編程就是編程范式。
OK,編程范式懂了吧,類比一下數據庫的設計范式,我們知道,數據庫的設計范式是為了解決數據冗余等一系列問題的,數據庫不遵循范式設計也是可以正常運行, 但是整個數據庫結構就會變得非常丑陋,在日常維護的時候會引發一系列的問題。那么這個”異步數據流交互的編程范式“也是如此,不用也行,只是用了的話就會賊舒服
一個例子
扯了挺多的,還沒進入正題,我們再理一下,看了這么多,我們總算是知道了:響應式編程就是tm一種編程范式,遵循這個范式會讓我們的代碼結構合理很多。OK,很好,小兄弟悟性不錯。
在解釋定語之前(解釋完就整個概念解釋完了喂ヽ(●-`Д′-)ノ),我們先來一個場景:
因為程序員工作越來越難找,你去富士康做生產員工。
你負責的是給蘋果手機裝屏幕,但是在安裝屏幕之前,這臺手機需要先給你的同事——張全蛋,全蛋負責給手機裝電池,但是裝電池這工序還是比較耗時,而且你不知道什么時候裝好,于是有了這幾種方案:
A、全蛋把裝電池的手機扔在一個籃子里,你定時去看那個籃子里面有沒有手機,有就拿起來裝屏幕,沒有就再先回去,過一會再來看;
B、你更全蛋約定,你們兩個之間裝一個設備,全蛋那里有一個按鈕,按一下你這邊的那個燈就閃一下,然后你就知道有手機準備好裝屏幕了。此外,全蛋哪里還順手裝多了一個按鈕,按一下你這邊紅燈就會亮,你就知道出問題了(比如說有一臺Note7混進來了),你就去處理一下這個問題。
你看完這兩個方案以后,男默女淚,老子可是程序員出身啊,一看就知道方案B是異步,肯定是方案B好啊!
于是工廠用了方案B,你欣慰地笑了,然后繼續回去裝手機屏幕。直到有一天,你發現原來整個生產流程不只是 裝電池-裝屏幕這么簡單,還有裝天線、裝攝像頭等等一系列的流程,于是你略一沉思,用代碼模擬了大概的流程:
void 生產手機(){
手機 phone = 手機模版.build("iphone");
裝天線(phone){
onSuccess(){
裝攝像頭(phone){
onSuccess(){
裝電池(phone){
onSuccess(){
continue();
....
}
onFailure(){
handleError();
...
}
}
}
onFailure(){
print(msg);
}
}
}
onFailure(msg){
print(msg);
}
}
}
寫完以后,你哭了(好吧我也哭了)。這巨tm丑哇大哥!這樣的代碼你還有維護的欲望?然后你發現,原來廠里面已經是信號燈閃來閃去了,要修改生產流程,要順著燈的指引找下去,找到之后還要balabala地引導員工....(各位兄弟可以嘗試修改一下上面的代碼,需求很簡單,我要“裝電池”和“裝天線”兩個步驟對換一下,里面的回調函數也是需要調換的喔)
在你哭泣的時候,你忽然想到了一個東西——流水線!!!!于是你給出了一個方案:
1、廠內引進流水線,讓生產員工坐在流水線旁邊;
2、工人完成自己的工序以后,就把手機放到流水線上面,讓下一個兄弟繼續加工;
3、在流水線上的員工,沒有事做的時候可以睡大覺,這條智能的流水線會在手機流到你的崗位的時候對你響喇叭,把你喚醒起來工作;
4、如果在工人加工的過程中,發現了問題(比如混入了Note7),那個員工就在手機上面貼上一個紅色的貼紙,讓后面有能力處理的員工來處理這個問題。
實際上員工會盯著流水線,但是在我們的編程中,不可能這樣,因為上一步操作的耗時是不可預知的,不停輪詢實在是太蠢了。在實際的代碼實現中,還是采用了異步的思想。放回這個例子中,就是沒事做的時候你可以睡大覺,當上一件產品流到你這里的時候,“智能流水線”就會在你這個位置響喇叭,把你喚醒起來工作,甚至,當你手頭上的工作還沒完成的時候,流水線會停下來(阻塞))
于是你試圖使用代碼抽象一下這個過程:
手機生成流水線.from(手機毛胚序列[]) //先把毛胚按序放到生產線上面
.map(裝天線())
.map(裝攝像頭())
.map(裝電池())
.map(裝屏幕())
.subscribe(打包員);
//這里的打包員是在生產線的尾端,將好的產品打包,將標記了有問題的手機扔到一邊
(老板很滿意,于是給你晚飯加了雞腿)
哇,簡直是藝術品啊,大氣簡潔有木有。要維護這樣的代碼,別說了,老板再來十段!
好了,現在我就跟你港,流水線生產就是函數響應式編程!再讀一下響應式編程的定義,”響應式編程是一種面向數據流和變化傳播的編程范式。“,小兄弟,現在懂了沒有哇。
最后再多說一嘴吧,沒有流水線,工廠照樣生產,而且效率還不會很低;但是有了流水線,工廠的生產就顯得非常規范通順,這就是”范式"的魅力。
總結
本來還想說一下響應式編程的好處和什么時候該用響應式編程的,但是我不是很喜歡這種政治題式的總結,所以我將問題拋給你們,算是給大家在看完這玩意的一個總結吧:
(就大家交流一下,要是沒人回答我會很尷尬的,如果這些題目都做對的話就基本合格了)
一、判斷題
1、響應式編程不是異步操作;
1.5、響應式是阻塞的;
2、只有特定的對象才能產生數據流;
3、范式只是一種指導,所以不使用范式并不會影響代碼的運行(僅指運行效果,不涉及效率等其他指標);
二、簡答題
1、有如下幾個關于響應式編程的定義,請逐個解釋并找出不正確的定義(可能有若干個):
A、響應式編程是一種面向數據流和變化傳播的編程范式。
B、響應式編程就是異步數據流交互的編程范式。
C、響應式編程就是 異步操作同步化。
D、響應式編程就是流水線
2、響應式編程的好處和什么時候該用響應式編程。 (提示一下,可能部分特性還沒講,但這道題也應該能答出個大概)
3、給這篇博客評個分(10分滿分),你給幾分,為什么?(因為我預計這個系列還要寫個6篇的,所以你的意見非常重要)
4、自問自答(不必書面回答),你真的了解響應式編程了嗎,你能不能給一個剛接觸編程的人解釋一下?
未經授權,不得轉載。
原文地址:http://www.lxweimin.com/p/111e0a4b9b17