1. 程式人生 > >一、Rxjava從頭學:響應式程式設計

一、Rxjava從頭學:響應式程式設計

響應式程式設計,現在被經常提起,同時越來越多的出現在我們的程式碼構建中。同時現在有很多主流的響應式框架,如RX等,如果不能夠理解響應式程式設計的話,對此類框架的使用總是有一些迷惑。那麼,到底什麼是響應式程式設計?

搜尋網路會有一大片的響應式程式設計的解釋,其中描述的最多的就是非同步資料流程式設計。 類似這樣的解釋有很多,這個解釋更與Rx的描述接近,而非響應式程式設計。(網路上大多是講的響應式程式設計的實現方式,而非到底什麼是響應式程式設計)

那麼到底什麼是響應式程式設計? 我又去stackoverflow搜尋了一下,找到了一些答案,當然我的理解依然可能出現偏差,但是這已經幫助我對響應式程式設計的理解打開了一扇大門。

1. 我理解的響應式程式設計(Functional Reactive Programming)

什麼是響應式程式設計?是以響應式思維來思考程式設計及實現的一種程式設計方式。於是我搜索了stackoverflow,有一篇文章吸引了我:What is Reactive Programming?。它通過一個簡短的例子,描述了什麼是響應式思維(可能只是其中的一部分).

1.1 例子

var a = 10;
var b = a + 1;
a = 11;
b = a + 1;
...

這段程式碼想要描述一種關係,a是獨立的個體,b的值依賴於a,當a的值發生變化時,b的值依照某種關係同樣發生變化。但是這種依賴關係非常短,當第二行和第四行程式碼一旦執行結束時,這種依賴關係就結束了。如果a的值再此發生變化,b需要重新與a建立依賴關係,如果我們忘了建立這種依賴關係,那麼就會造成b的與不同步,產生不可預料的後果。

那如果我們用想用響應式思維來設計這段程式碼會是什麼樣子呢?

//這是一段虛擬碼
var a = 10;
var b <= a + 1;
a = 20;
Assert.AreEqual(21,b)

通過上面這段程式碼我們看到,我們通過這個(<=)這個操作符,對a和b建立以了一種關係,這種關係是一種顯示並且持久的關係,每當a的值發生變化時,b的值都會發生變化。他們總是能夠達到同步。

變數之間的依賴關係存在於程式設計師的的頭腦中及想法中,而通過響應式程式設計,我們把這種關係變為顯示的實現,變成了程式碼的一部分。

1.2 我理解的響應式思維

通過上面那個例子,我們可以把響應式思維理解為,通過某種方式為有關聯的個體(值或者一組行為)之間建立永久的關係,這種關係一旦建立是不間斷的、永久的

,其中的一個體發生變化時(隨著時間),另外的個體(們)可以通過這種關係,進行不同的變化(做出響應),有點類似與觀察者和被觀察者模式。

其實我認為響應式程式設計和觀察者模式講述的是同一種東西,只是角度不一樣。
- 觀察者模式:當被觀察者發生變化時,需要手動的去通知所有的觀察者,告知他們被觀察者發生了變化。
- 響應式程式設計:當被”觀察者“發生變化時,與“被觀察者”建立了某種關係的”觀察者“會自動的跟隨“被觀察者”進行變化。

同時網上也另外有一個非常簡短的解釋對FRP做了更深一步的補充:

FRP is about "datatypes that represent a value 'over time'
Conventional imperative programming captures these dynamic values only indirectly, through state and mutations. 
The complete history (past, present, future) has no first class representation. Moreover, only discretely evolving values can be (indirectly) captured, since the imperative paradigm is temporally discrete. 
In contrast, FRP captures these evolving values directly and has no difficulty with continuously evolving values.

FRP是一種“隨時間推移而代表值的資料型別”。傳統的命命程式只能通過狀態和突變間接地捕獲這些動態值。沒有一個類能在開始定義的時候就表示出完整的歷史(過去、現在、未來)

這是我目前理解的響應式思維。

2. 目前主流的響應式程式設計的解釋