1. 程式人生 > >函式響應式程式設計(FRP)思想

函式響應式程式設計(FRP)思想

ReactiveCocoa是IOS廣為使用的技術框架,而ReactiveCocoa的核心思想就FRP。FRP不同於JAVA的object-oriented和AOP,FRP能讓你的程式碼像數學一樣簡潔,業務像流水一樣清晰流暢。

函式響應式程式設計

響應式程式設計思想為體,函數語言程式設計思想為用。
這裡寫圖片描述

響應式程式設計

例如,在指令式程式設計環境中, a:=b+c表示將表示式的結果賦給 a,而之後改變 b 或 c的值不會影響 a。但在響應式程式設計中,a的值會隨著 b或 c的更新而更新。

在響應式程式設計當中,a:=b+c宣告的是一種繫結關係。(a與b、c繫結起來了,所以b、c的變化會影響a,這也就是所謂【變化傳播】)

函數語言程式設計

不產生副作用的函式稱為純函式
函式是一等公民=>高階函式
函數語言程式設計抽取了很多常用操作,作為高階函式,比如map,filter,reduce。
有了這些函式,你的程式碼將被大大簡化,也意味著你可以進行更加快速的開發,同時這些函式也幫助別人理解你的程式碼。

Callback風格

客戶端開發一個主要組成部分就是監聽事件然後更新UI。如下圖所示
這裡寫圖片描述

事件來源包括UI事件、網路回撥、生命週期回撥,通知等等。更新UI往往需要依賴多個事件以及事件包含的資料。所以我們不得不引入共享狀態,如下圖所示
這裡寫圖片描述
為了與FRP區分,可以把這種程式設計風格叫做Callback風格。

Callback的缺點顯而易見:

The code to manage our state and to update our output is ALL over the place.

狀態的修改可能分佈在很多地方,UI的更新也可能分佈在很多地方。
狀態之間的組合以及相互影響。並且容易出現Bug,很有可能出現未考慮到的狀態組合。
變數式執行緒同步管理非常複雜。

FRP風格

資料流

在FRP世界裡,沒有共享狀態,定義了一個新的型別——資料流。資料流也是FRP的核心概念。所以有下面這種說法:

FRP is about “datatypes that represent a value ‘over time’”

資料流用圖可以表示如下:
這裡寫圖片描述

Operator

我們對資料流進行操作,比如map、disinct、debounce等等。
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

Schuduler

FRP還提供了Schuduler,你可以指定你的Operator在哪個執行緒執行,你的Observer在那個執行緒監聽事件,比如網路請求操作需要在後臺執行緒執行,網路返回之後重新整理頁面需要在主執行緒執行。有了Schudeler,就不再需要手動操作執行緒。

FRP實踐

FRP很適合應用於客戶端開發。
舉個例子:專案中有個需求,根據使用者輸入金額以及所選擇的優惠卷實時計算實付金額。控制流如下圖所示:
這裡寫圖片描述

用IOS中的FRP框架實現如下:

//使用者輸入金額資料流
RACSignal *feeSignal = [[[[payView.fee.rac_textSignal
                          throttle:1.0f]//每秒檢測一次
                          distinctUntilChanged]//去重
                          map:^id(NSString *text) {
                             return [NSString stringWithFormat:@"%.2f", [text floatValue]];
                          }]
                          replayLast];
//使用者選擇優惠券資料流
self.couponSignal = [[[RACReplaySubject
                      subject]
                      distinctUntilChanged]
                      replayLast];

//實時計算支付金額資料流
[[[[[RACSignal
      combineLatest:@[self.feeSignal, self.couponSignal]//組合
      reduce:^id(id paramA, id paramB){
          //構建網路請求引數
      }]
      distinctUntilChanged]
      map:^id(id params) {
          //網路請求
          return [XXNetService queryXX:params];
      }]
      switchToLatest]//取消之前的計算請求,發起最新的計算請求
      subscribeNext:^(NSNumber *x) {
          //顯示請求結果
      }];                      

所以,程式碼基本上就是流程的直接對映,就像照鏡子,如下圖所示。
並且,程式碼邏輯集中。
這裡寫圖片描述
而使用Callback風格,維護狀態讓人焦頭爛額,如下圖所示。
這裡寫圖片描述

FRP優勢:

可讀性

- 程式碼邏輯更加集中
- 減少共享變數,減少出錯率
- 框架分步,流程清晰

複用性

- 豐富的高階函式

相關推薦

函式響應程式設計FRP思想

序 ReactiveCocoa是IOS廣為使用的技術框架,而ReactiveCocoa的核心思想就FRP。FRP不同於JAVA的object-oriented和AOP,FRP能讓你的程式碼像數學一樣簡潔,業務像流水一樣清晰流暢。 函式響應式程式設計 響應式

使用響應程式設計RxJava開發Android App

如果你已經看過了RxJava或其他的ReactiveX庫的點贊數,你一定會同意我的說法:響應式程式設計的學習曲線很陡峭,而之所以形成這種學習體驗,則是因為沒有好的學習嚮導和書籍。 我探究了響應式程式設計(尤其是RxJava)背後的基本原理。我不想從Rx

Android響應程式設計RxJava前篇[入門基礎]

1.RxJava概述 ReactiveX與RxJava 在講到RxJava之前我們首先要了解什麼是ReactiveX,因為RxJava是ReactiveX的一種java實現。 ReactiveX是Reactive Extensions的縮寫,一般簡寫為

函數響應編程FRP思想-Callback風格

south ont 限制 per ref filter 命令 src bind 序 ReactiveCocoa是IOS廣為使用的技術框架,而ReactiveCocoa的核心思想就FRP。FRP不同於JAVA的object-oriented和AOP,FRP能讓你的代碼像數學一

springboot2.x簡單詳細教程--高階篇幅之響應程式設計第十五章

      一、SprinBoot2.x響應式程式設計簡介     簡介:講解什麼是reactive響應式程式設計和使用的好處     1、基礎理解:     

RxJava實現響應程式設計Reactive Programming with RxJava

本書已經全部翻譯完成,地址在GitBook上,詳情請檢視: 請在學習之前,保證有一定的Java8基礎,否則學起來太吃力~~ 由於本人沒有安卓經驗,純Java開發,所以安卓的實戰那一節不會翻譯了,感興趣的安卓開發,可以在基礎比較嫻熟的情況下自己看相關的章節

講課:Webflux響應程式設計SpringBoot 2.0新特性

學習webflux前需要學習三個基礎: 函數語言程式設計和lambda表示式 Stream流程式設計 Reactive stream 響應式流 接下來進入學習 一、函數語言程式設計和lambda表示式 1. 什麼是函數語言程式設計 函數語言程式設計是

Rxjava2入門:函式響應程式設計及概述

Rxjava2入門教程一:https://www.jianshu.com/p/15b2f3d7141a Rxjava2入門教程二:https://www.jianshu.com/p/c8150187714c Rxjava2入門教程三:https://www.jianshu.com/p/6e7

淺析Vue響應原理

Vue響應式原理之defineReactive defineReactive 不論如何,最終響應式資料都要通過defineReactive來實現,實際要藉助ES5新增的Object.defineProperty。 defineReactive接受五個引數。obj是要新增響應式資料的物件;key是屬性名,

教你寫響應框架

還要做什麼? 在教你寫響應式框架(一)中我們介紹了觀察者模式,現在我們將基於上一篇中的程式碼進行改造。當然,我們是有目的的改造: 在響應式框架中,觀察者是可能隨時產生,種類多,生命週期卻短暫. 我們希望操作是非同步的,並且只有在觀察者被註冊到

教你寫響應框架

在真正開始編寫自己的響應式框架之前,我們先來從觀察者模式說起。已經對觀察者模式很熟悉的可以直接掠過。 基本概念 觀察者模式屬於物件行為模式之一,也可叫做釋出——訂閱模式。它定義了一種以對多的依賴關係,讓多個觀察者(訂閱者)同時觀察(監聽)一個被觀察者(主

面向物件程式設計OOP思想小結

Concepts 類(class):對我們要解決問題的抽象,比如建造房子的藍圖;但實現機制上來講,類是根據藍圖構建而成的,儲存在記憶體中的,用來表示物件的資料。 物件(object):根據類構建的實體,比如根據藍圖造出來的房子;實現時,通常是複製類的資料到新的記憶體空間,有可能需要改變初始值。

【25】手把手教你響應佈局

一:佈局方式有如下幾種: 1. 固定佈局:固定佈局以PX(畫素)作為單位的,在PC端,設計稿多少PX就寫多少PX,前幾年都是這種佈局,常見的是以960px或者1000px來設計的,但是這樣設計有如下缺點: 1.1.頁面很死板,在更大的螢幕上,頁面左右2邊留白。 1.2.不適

Android函式響應程式設計——RxJava的4大subject和執行緒控制

Subject Subject既可以是一個Observer也可以是一個Observable,它用來連線兩者。所以Subject被認為是Subject=Observable+Observer 1.PublishSubject PublishSubject在被建立完成之後立刻開

淺析Vue響應原理

Vue響應式原理之Observer 之前簡單介紹了Dep和Watcher類的程式碼和作用,現在來介紹一下Observer類和set/get。在Vue例項後再新增響應式資料時需要藉助Vue.set/vm.$set方法,這兩個方法內部實際上呼叫了set方法。而Obser

函式響應程式設計

相信你們在學習響應式程式設計這個新技術的時候都會充滿了好奇,特別是它的一些變體,例如:Rx系列、Bacon.js、RAC等等…… 在缺乏優秀資料的前提下,響應式程式設計的學習過程將滿是荊棘。起初,我試圖尋找一些教程,卻只找到少量的實踐指南,而且它們講的都非常淺顯,從來沒人接受圍繞響應式程式設計建立一個完

【iOS架構】iOS ReactiveCocoa函式響應程式設計

宣告式程式設計 宣告式程式設計(declarative programming)是一種程式設計範型,與指令式程式設計相對立。它描述目標的性質,讓電腦明白目標,而非流程。宣告式程式設計不用告訴電腦問題領域,從而避免隨之而來的副作用,大幅簡化了平行計算的編寫

Vue的響應原理MVVM深入解析

1. 如何實現一個響應式物件 最近在看 Vue 的原始碼,其中最核心基礎的一塊就是 Observer/Watcher/Dep, 簡而言之就是,Vue 是如何攔截資料的讀寫, 如果實現對應的監聽,並且特定的監聽執行特定的回撥或者渲染邏輯的。總的可以拆成三大塊來說

Android函式響應程式設計——必學的RxJava組合操作符startWith、merge、concat、zip、combineLastest

1.startWith:給你被觀察者的資料流前再增加一點同類型的資料,這裡增加的是1,2 rx.Observable.just(3, 4, 5).startWith(1, 2) .subscribe(new Action1<Integer>()

ReactiveCocoa 函式響應程式設計簡介 鏈程式設計 函數語言程式設計 響應程式設計

最近,RAC的名氣可謂是越來越大,出於對技術的探索心(為了裝逼),最近研究學習了一下RAC,以下是本人在學習中對其的一些粗淺的認識; 首先,什麼是RAC,ReactiveCocoa時Github上的一個Cocoa FRP框架,目的為了接管蘋果的所有事件機制(addTarge