本系列的七篇文章(目前完成進(jìn)度:2/7):
1砸彬、響應(yīng)式編程
2颠毙、觀察者模式及Rx基礎(chǔ)概念解釋
3、RxJava深入淺出
4砂碉、RxJava+Retrofit 的結(jié)合
5蛀蜜、RxJava的高階高階
6、Retrofit的高階應(yīng)用
7增蹭、總結(jié)
引子
關(guān)于什么是函數(shù)響應(yīng)式編程滴某,官方一點的解析是:響應(yīng)式編程是一種面向數(shù)據(jù)流和變化傳播的編程范式。是的滋迈,每個字我都看的懂霎奢,但是組合起來就我就不知道是什么意思了。
好吧饼灿,其實我們把定語去掉幕侠,就變成了:響應(yīng)式編程就是編程范式。
OK碍彭,編程范式懂了吧晤硕,類比一下數(shù)據(jù)庫的設(shè)計范式,我們知道庇忌,數(shù)據(jù)庫的設(shè)計范式是為了解決數(shù)據(jù)冗余等一系列問題的舞箍,數(shù)據(jù)庫不遵循范式設(shè)計也是可以正常運(yùn)行, 但是整個數(shù)據(jù)庫結(jié)構(gòu)就會變得非常丑陋漆枚,在日常維護(hù)的時候會引發(fā)一系列的問題创译。那么這個”異步數(shù)據(jù)流交互的編程范式“也是如此,不用也行墙基,只是用了的話就會賊舒服
一個例子
扯了挺多的软族,還沒進(jìn)入正題,我們再理一下残制,看了這么多立砸,我們總算是知道了:響應(yīng)式編程就是tm一種編程范式,遵循這個范式會讓我們的代碼結(jié)構(gòu)合理很多初茶。OK颗祝,很好,小兄弟悟性不錯恼布。
在解釋定語之前(解釋完就整個概念解釋完了喂ヽ(●-`Д′-)ノ)螺戳,我們先來一個場景:
因為程序員工作越來越難找,你去富士康做生產(chǎn)員工折汞。
你負(fù)責(zé)的是給蘋果手機(jī)裝屏幕倔幼,但是在安裝屏幕之前,這臺手機(jī)需要先給你的同事——張全蛋爽待,全蛋負(fù)責(zé)給手機(jī)裝電池损同,但是裝電池這工序還是比較耗時翩腐,而且你不知道什么時候裝好,于是有了這幾種方案:
A膏燃、全蛋把裝電池的手機(jī)扔在一個籃子里茂卦,你定時去看那個籃子里面有沒有手機(jī),有就拿起來裝屏幕组哩,沒有就再先回去等龙,過一會再來看;
B禁炒、你更全蛋約定而咆,你們兩個之間裝一個設(shè)備霍比,全蛋那里有一個按鈕幕袱,按一下你這邊的那個燈就閃一下,然后你就知道有手機(jī)準(zhǔn)備好裝屏幕了悠瞬。此外们豌,全蛋哪里還順手裝多了一個按鈕,按一下你這邊紅燈就會亮浅妆,你就知道出問題了(比如說有一臺Note7混進(jìn)來了)望迎,你就去處理一下這個問題。
你看完這兩個方案以后凌外,男默女淚辩尊,老子可是程序員出身啊,一看就知道方案B是異步康辑,肯定是方案B好吧阌!
于是工廠用了方案B疮薇,你欣慰地笑了胸墙,然后繼續(xù)回去裝手機(jī)屏幕。直到有一天按咒,你發(fā)現(xiàn)原來整個生產(chǎn)流程不只是 裝電池-裝屏幕這么簡單迟隅,還有裝天線、裝攝像頭等等一系列的流程励七,于是你略一沉思智袭,用代碼模擬了大概的流程:
void 生產(chǎn)手機(jī)(){
手機(jī) phone = 手機(jī)模版.build("iphone");
裝天線(phone){
onSuccess(){
裝攝像頭(phone){
onSuccess(){
裝電池(phone){
onSuccess(){
continue();
....
}
onFailure(){
handleError();
...
}
}
}
onFailure(){
print(msg);
}
}
}
onFailure(msg){
print(msg);
}
}
}
寫完以后,你哭了(好吧我也哭了)掠抬。這巨tm丑哇大哥吼野!這樣的代碼你還有維護(hù)的欲望?然后你發(fā)現(xiàn)剿另,原來廠里面已經(jīng)是信號燈閃來閃去了箫锤,要修改生產(chǎn)流程贬蛙,要順著燈的指引找下去,找到之后還要balabala地引導(dǎo)員工....(各位兄弟可以嘗試修改一下上面的代碼谚攒,需求很簡單阳准,我要“裝電池”和“裝天線”兩個步驟對換一下,里面的回調(diào)函數(shù)也是需要調(diào)換的喔)
在你哭泣的時候,你忽然想到了一個東西——流水線A蟪簟R坝!括儒!于是你給出了一個方案:
1绕沈、廠內(nèi)引進(jìn)流水線,讓生產(chǎn)員工坐在流水線旁邊帮寻;
2乍狐、工人完成自己的工序以后,就把手機(jī)放到流水線上面固逗,讓下一個兄弟繼續(xù)加工浅蚪;
3、在流水線上的員工烫罩,沒有事做的時候可以睡大覺惜傲,這條智能的流水線會在手機(jī)流到你的崗位的時候?qū)δ沩懤龋涯銌拘哑饋砉ぷ鳎?br>
4贝攒、如果在工人加工的過程中盗誊,發(fā)現(xiàn)了問題(比如混入了Note7),那個員工就在手機(jī)上面貼上一個紅色的貼紙隘弊,讓后面有能力處理的員工來處理這個問題哈踱。
實際上員工會盯著流水線,但是在我們的編程中长捧,不可能這樣嚣鄙,因為上一步操作的耗時是不可預(yù)知的,不停輪詢實在是太蠢了串结。在實際的代碼實現(xiàn)中哑子,還是采用了異步的思想。放回這個例子中肌割,就是沒事做的時候你可以睡大覺卧蜓,當(dāng)上一件產(chǎn)品流到你這里的時候,“智能流水線”就會在你這個位置響喇叭把敞,把你喚醒起來工作弥奸,甚至,當(dāng)你手頭上的工作還沒完成的時候奋早,流水線會停下來(阻塞))
于是你試圖使用代碼抽象一下這個過程:
手機(jī)生成流水線.from(手機(jī)毛胚序列[]) //先把毛胚按序放到生產(chǎn)線上面
.map(裝天線())
.map(裝攝像頭())
.map(裝電池())
.map(裝屏幕())
.subscribe(打包員);
//這里的打包員是在生產(chǎn)線的尾端盛霎,將好的產(chǎn)品打包赠橙,將標(biāo)記了有問題的手機(jī)扔到一邊
(老板很滿意,于是給你晚飯加了雞腿)
哇愤炸,簡直是藝術(shù)品啊期揪,大氣簡潔有木有。要維護(hù)這樣的代碼规个,別說了凤薛,老板再來十段!
好了诞仓,現(xiàn)在我就跟你港缤苫,流水線生產(chǎn)就是函數(shù)響應(yīng)式編程!再讀一下響應(yīng)式編程的定義墅拭,”響應(yīng)式編程是一種面向數(shù)據(jù)流和變化傳播的編程范式活玲。“帜矾,小兄弟翼虫,現(xiàn)在懂了沒有哇屑柔。
最后再多說一嘴吧屡萤,沒有流水線,工廠照樣生產(chǎn)掸宛,而且效率還不會很低死陆;但是有了流水線,工廠的生產(chǎn)就顯得非常規(guī)范通順唧瘾,這就是”范式"的魅力措译。
總結(jié)
本來還想說一下響應(yīng)式編程的好處和什么時候該用響應(yīng)式編程的,但是我不是很喜歡這種政治題式的總結(jié)饰序,所以我將問題拋給你們领虹,算是給大家在看完這玩意的一個總結(jié)吧:
(就大家交流一下求豫,要是沒人回答我會很尷尬的塌衰,如果這些題目都做對的話就基本合格了)
一、判斷題
1蝠嘉、響應(yīng)式編程不是異步操作最疆;
1.5、響應(yīng)式是阻塞的蚤告;
2努酸、只有特定的對象才能產(chǎn)生數(shù)據(jù)流;
3杜恰、范式只是一種指導(dǎo)获诈,所以不使用范式并不會影響代碼的運(yùn)行(僅指運(yùn)行效果仍源,不涉及效率等其他指標(biāo));
二舔涎、簡答題
1镜会、有如下幾個關(guān)于響應(yīng)式編程的定義,請逐個解釋并找出不正確的定義(可能有若干個):
A终抽、響應(yīng)式編程是一種面向數(shù)據(jù)流和變化傳播的編程范式戳表。
B、響應(yīng)式編程就是異步數(shù)據(jù)流交互的編程范式昼伴。
C匾旭、響應(yīng)式編程就是 異步操作同步化。
D圃郊、響應(yīng)式編程就是流水線
2价涝、響應(yīng)式編程的好處和什么時候該用響應(yīng)式編程。 (提示一下持舆,可能部分特性還沒講色瘩,但這道題也應(yīng)該能答出個大概)
3、給這篇博客評個分(10分滿分)逸寓,你給幾分居兆,為什么?(因為我預(yù)計這個系列還要寫個6篇的竹伸,所以你的意見非常重要)
4泥栖、自問自答(不必書面回答),你真的了解響應(yīng)式編程了嗎勋篓,你能不能給一個剛接觸編程的人解釋一下吧享?
未經(jīng)授權(quán),不得轉(zhuǎn)載譬嚣。
原文地址:http://www.reibang.com/p/111e0a4b9b17