函数响应式编程(frp)思想

海洋顶端 海洋顶端     2022-08-24     336

关键词:

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优势:

可读性

- 代码逻辑更加集中
- 减少共享变量,减少出错率
- 框架分步,流程清晰

复用性

- 丰富的高阶函数

参考链接
why reactive(cocoa)
input and ouput

frp-functionalreactiveprogramming-函数响应式编程

...是一种面向数据流和变化传播的编程范式;响应式编程和函数式编程的融合;响应式编程为内核;函数式编程为工具;流的概念先天适合函数式编程。 Somequotesfromthearticle:Reactiveprogrammingisprogrammingwithasynchronousdatastreams.Ontopofthat... 查看详情

函数式响应编程

ReactiveCocoa的基本使用方法ReactiveCocoa是github一个开源项目,是在iOS平台上对FRP的实现。FRP的核心是信号,信号在ReactiveCocoa(以下简称RAC)中是通过RACSignal来表示的,信号是数据流,可以被绑定和传递。可以把信号想象成水龙头,只... 查看详情

走进reactivecocoa的世界

...coa的FRP框架.FRP的全称是FunctionalReactiveProgramming,中文译作函数式响应式编程,是RP(ReactiveProgramm,响应式编程)的FP(FunctionalProgramming,函数式编程)实现。说起来很拗口。太多的细节不多讨论,我们先关注下FRP的FP 查看详情

Python 中函数响应式编程的现状如何?

】Python中函数响应式编程的现状如何?【英文标题】:WhatisthestatusofFunctionalReactiveProgramminginPython?【发布时间】:2015-11-3003:31:25【问题描述】:我找到了this论文(“PracticalFunctionalReactiveProgramming”),作者(据我所知)尝试本着Ya... 查看详情

函数响应式编程的“信号”表示是不是正确?

】函数响应式编程的“信号”表示是不是正确?【英文标题】:Isthe\'Signal\'representationofFunctionalReactiveProgrammingcorrect?函数响应式编程的“信号”表示是否正确?【发布时间】:2011-11-1901:28:45【问题描述】:我一直在研究FRP,发现... 查看详情

reactivecocoa响应式函数编程

简介ReactiveCocoa(简称为RAC),RAC具有函数响应式编程特性,由MattDiephouse开源的一个应用于iOS和OSX的新框架。为什么使用RAC?因为RAC具有高聚合低耦合的思想所以使用RAC会让代码更简洁,逻辑更清晰。如何在项目中添加RAC?方法1.可... 查看详情

精通高级rxjava2响应式编程思想

...列课程的内容,并提前布置预先需要储备的知识。第2章响应式编程思想概述—概念与案例讲解本章节主要阐释响应式编程思想,先做一个概念性的介绍,之后会以生活中的实例和代码实例相结合的方式来讲解。第3章RxJava基本元... 查看详情

函数式编程思想

对于函数式编程来说,其只关心,定义输入数据和输出数据相关的关系,数学表达式里面其实是在做一种映射(mapping),输入的数据和输出的数据关系是什么样的,是用函数来定义的。http://www.yxtvg.com/toutiao/5413179/20180212a04ro500.ht... 查看详情

《javascript函数式编程思想》——从面向对象到函数式编程

第9章 从面向对象到函数式编程假如本书的写作时间倒退回十年前,书名可能会变成JavaScript面向对象编程思想。自上世纪90年代兴起的面向对象编程思想随Java的繁荣达于顶点,在JavaScript从一门只被用来编写零星的简单的... 查看详情

功能响应式编程语言规范

】功能响应式编程语言规范【英文标题】:SpecificationforaFunctionalReactiveProgramminglanguage【发布时间】:2011-08-1801:40:46【问题描述】:我正在考虑在某个时候创建​​一个功能性反应框架。我已经阅读了很多关于它的内容并看到了一... 查看详情

kotlin函数式编程思想fpinkotlin

Kotlin函数式编程思想:FPinKotlin函数式编程特性闭包和高阶函数函数编程支持函数作为第一类对象,有时称为闭包或者仿函数(functor)对象。实质上,闭包是起函数的作用并可以像对象一样操作的对象。与此类似,FP语言... 查看详情

《javascript函数式编程思想》——列表

第8章 列表函数式编程与列表处理有很深的渊源。列表是最基础,也是使用最普遍的复合数据类型。作为最早出现的函数式编程语言之一,Lisp【注:它的名称就来源于“列表处理器”(LIStProcessor)】用函数参... 查看详情

js函数式编程思想(v客学院知识分享)

...现在已经更新到ES7,不久ES8规范即将面世,为了是JS语法对函数编程更加友好,诸如RxJS(ReactiveX)等函数式框架的不断流行。函数式编程则应该是以函数做为舰载主体,然后对函数进行拆分封装、更加抽象,可扩展性极强。 与传... 查看详情

函数式编程思想:耦合和组合,第2部分

...者可能会对这一方法的缺点及其他的可选做法视而不见,函数式编程使用不同的构建块来实现重用,其基于的是更一般化的概念,比如说列表转换和可移植代码。函数式编程思想的这一部分内容比较了作为重用机制的经由继承的... 查看详情

函数式编程思想:以函数的方式思考,第3部分

...ealFord发布:2011-07-0611:23:24挑错|查看译者版本|收藏本文在函数式编程思想的第一部分和第二部分中,我考察了一些函数式编程的主题,研究了这些主题如何与Java?及其相关语言产生关联。本篇文章继续这一探索过程,给出来自前... 查看详情

《javascript函数式编程思想》

...快速发展,JavaScript向各个领域渗透的势头仍然强劲。函数式编程的思想和语言原来仅仅在计算机学术圈中流行,近年来它的魅力越来越多地被主流软件开发行业认识到࿰ 查看详情

响应式编程函数式编程简介

...不是B一直等待(阻塞),提高效率。    函数式编程:关键字:lambda,lisp,大数据,AI理念:1.一切为函数2.每个函数是可靠的,没有副作用的;不能依赖外部环境/上下文3.每一个可靠小函数组合成大函数,再组成... 查看详情

《javascript函数式编程思想》——部分应用和复合

第5章 部分应用和复合一等值的函数,是函数式编程的基石。部分应用和复合,则是函数式编程的重要特征。采用命令式编程时,每当我们感觉需要抽象出一个新的功能时,就会定义一个函数。在函数式编程中... 查看详情