RxJava+Retrofit (一) 什么是響應(yīng)式編程

本系列的七篇文章(目前完成進(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)式編程,官方一點(diǎn)的解析是:響應(yīng)式編程是一種面向數(shù)據(jù)流和變化傳播的編程范式。是的,每個字我都看的懂,但是組合起來就我就不知道是什么意思了。
  好吧,其實(shí)我們把定語去掉,就變成了:響應(yīng)式編程就是編程范式。
  OK,編程范式懂了吧,類比一下數(shù)據(jù)庫的設(shè)計(jì)范式,我們知道,數(shù)據(jù)庫的設(shè)計(jì)范式是為了解決數(shù)據(jù)冗余等一系列問題的,數(shù)據(jù)庫不遵循范式設(shè)計(jì)也是可以正常運(yùn)行, 但是整個數(shù)據(jù)庫結(jié)構(gòu)就會變得非常丑陋,在日常維護(hù)的時候會引發(fā)一系列的問題。那么這個”異步數(shù)據(jù)流交互的編程范式“也是如此,不用也行,只是用了的話就會賊舒服


一個例子

扯了挺多的,還沒進(jìn)入正題,我們再理一下,看了這么多,我們總算是知道了:響應(yīng)式編程就是tm一種編程范式,遵循這個范式會讓我們的代碼結(jié)構(gòu)合理很多。OK,很好,小兄弟悟性不錯。

在解釋定語之前(解釋完就整個概念解釋完了喂ヽ(●-`Д′-)ノ),我們先來一個場景:

因?yàn)槌绦騿T工作越來越難找,你去富士康做生產(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)換的喔)

在你哭泣的時候,你忽然想到了一個東西——流水線?。。?!于是你給出了一個方案:
  1、廠內(nèi)引進(jìn)流水線,讓生產(chǎn)員工坐在流水線旁邊;
  2、工人完成自己的工序以后,就把手機(jī)放到流水線上面,讓下一個兄弟繼續(xù)加工;
  3、在流水線上的員工,沒有事做的時候可以睡大覺,這條智能的流水線會在手機(jī)流到你的崗位的時候?qū)δ沩懤龋涯銌拘哑饋砉ぷ鳎?br>   4、如果在工人加工的過程中,發(fā)現(xiàn)了問題(比如混入了Note7),那個員工就在手機(jī)上面貼上一個紅色的貼紙,讓后面有能力處理的員工來處理這個問題。

實(shí)際上員工會盯著流水線,但是在我們的編程中,不可能這樣,因?yàn)樯弦徊讲僮鞯暮臅r是不可預(yù)知的,不停輪詢實(shí)在是太蠢了。在實(shí)際的代碼實(shí)現(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àn)槲翌A(yù)計(jì)這個系列還要寫個6篇的,所以你的意見非常重要)

4、自問自答(不必書面回答),你真的了解響應(yīng)式編程了嗎,你能不能給一個剛接觸編程的人解釋一下?


未經(jīng)授權(quán),不得轉(zhuǎn)載。
  原文地址:http://www.itdecent.cn/p/111e0a4b9b17

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容