1. 程式人生 > >函數語言程式設計和響應式程式設計

函數語言程式設計和響應式程式設計

在程式開發中,a=b+c;賦值之後,b或者c的值變化後,a的值不會跟著變化。響應式程式設計目標就是,如果b或者c的數值發生變化,a的數值會同時發生變化。

函數語言程式設計

函數語言程式設計是一系列被不公平對待的程式設計思想的保護傘,它的核心思想是,它是一種將程式看成是數學方法的求值、不會改變狀態、不會產生副作用(後面我們馬上會談到)的程式設計方式。

FP 核心思想強調:

  • 宣告式程式碼 —— 程式設計師應該關心是什麼,讓編譯器和執行環境去關心怎樣做。

  • 明確性 —— 程式碼應該儘可能的明顯。尤其是要隔離副作用避免意外。要明確定義資料流和錯誤處理,要避免 GOTO 語句和 異常,因為它們會將應用置於意外的狀態。

  • 併發 —— 因為純函式的概念,大多數函式式程式碼預設都是並行的。由於CPU執行速度沒有像以前那樣逐年加快((詳見 摩爾定律)), 普遍看來這個特點導致函數語言程式設計漸受歡迎。以及我們也必須利用多核架構的優點,讓程式碼儘量的可並行。

  • 高階函式 —— 函式和其他的語言基本元素一樣是一等公民。你可以像使用 string 和 int 一樣的去傳遞函式。

  • 不變性 —— 變數一經初始化將不能修改。一經建立,永不改變。如果需要改變,需要建立新的。這是明確性和避免副作用之外的另一方面。如果你知道一個變數不能改變,當你使用時會對它的狀態更有信心。

函數語言程式設計:JS、Scala、Erlang

響應式程式設計

響應式系統具備如下特點:

  • 響應性 —— 一個系統應該總是能夠及時響應使用者請求,並且保持很低的延遲。

  • 彈性 —— 一個系統即使在部分元件開始出現故障的情況下也應該能夠作出響應,將停機時間將至最低。

  • 可伸縮性 —— 一個系統在負載增加時應該能夠根據需求增加資源以確保響應性,但同時也應該能在負載降低時減少資源,保持高效的資源利用率。

  • 訊息驅動 —— 在一個系統的不同部分之間傳遞訊息,Ledbrook認為這是響應式系統的一個必備特點。

響應式實際上是觀察者模式加上事件源的完成通知能力、錯誤傳播能力和監聽者同事件源通訊的能力。

響應式流是一種規範,ReactiveX是一種常用的跨平臺實現。

下面三個重要的概念是響應式流API的構建基礎:

  • 釋出者是事件的傳送方,可以向它訂閱。

  • 訂閱者是事件訂閱方。

  • 訂閱將釋出者和訂閱者聯絡起來,使訂閱者可以向釋出者傳送訊號。

響應式程式設計是一種基於非同步資料流概念的程式設計模式。資料流就像一條河:它可以被觀測,被過濾,被操作,或者為新的消費者與另外一條流合併為一條新的流。

響應式程式設計的一個關鍵概念是事件。事件可以被等待,可以觸發過程,也可以觸發其它事件。事件是唯一的以合適的方式將我們的現實世界對映到我們的軟體中:如果屋裡太熱了我們就開啟一扇窗戶。同樣的,當我們更改電子錶(變化的傳播)中的一些數值時,我們需要更新整個表格或者我們的機器人碰到牆時會轉彎(響應事件)。

今天,響應式程式設計最通用的一個場景是UI:我們的移動App必須做出對網路呼叫、使用者觸控輸入和系統彈框的響應。在這個世界上,軟體之所以是事件驅動並響應的是因為現實生活也是如此。

響應式程式設計的具體實現-RxJava。RxJava提供了一種以面向時序的方式考慮資料的機會:所有事情都是持續變化的,資料在更新,事件在觸發,然後你就可以建立事件響應式的、靈活的、執行流暢的App。