原创,转载请注明出处。
函数响应编程,这个概念在网上已经有很多解释了,我也读了很多,说说我的理解。有时候我想,我如何学习一个新的概念或技术,不是应该用我已有的脑袋去理解它么,关键是怎么理解,怎么才算理解,理解的对不对,我想这是抽象变形象的过程。那我就用自己的方法去理解和认识函数响应编程这个概念。
函数响应式编程的本质是什么?是函数编程和响应编程的结合,函数是编排,响应是关联作用。用来编排的是什么呢?是逻辑,是处理逻辑,这些逻辑是用函数实现的,而函数和函数之间的粘合剂是响应式编程实现的函数接口(when,then,merge,map,flatmap,fork,join etc.),我们最熟悉的编程方式是什么?如何定义一个函数?对输入参数进行各种运算,赋值,if-elseif-else,函数调用,抛出ex,处理ex,最后return,这是我们的函数定义。函数响应编程怎么做?定义一个函数:对函数的参数输入,进行map(func1).filter(func2).merge(func3)...(funcN),好了,编排完了,这是函数定义。
函数都定义好了,但它并没有真正执行,只是定义,最终需要调用,需要执行,怎么调用执行?怎么触发?基于事件流触发,事件流中是一个个事件单元,一个事件什么时候产生,什么时候触发。那到底是哪些事件呢?具体到实际中,我们界面上的操作或者动作,也可以是系统定时产生的动作,这些动作会被转化成事件而write到stream中。而在后台,一样是事件,可以是notify事件,可以是io事件,本质上io也是notify的一种。异步的线程之间相互作用触发了函数的执行,而函数的执行结果可能再次作用于异步的线程。函数响应编程定义的处理过程可能是同步的可能是异步的,由scheduler的调度方式决定。有的执行多次,有的执行一次,是由流的性质决定的。
map filter merge...这不是和mapreduce很像吗?是的,mapReduce使用了函数式编程方式,像更贴近的spark的定义执行方式。spark的RDD是函数响应编程的事件流,而spark的mapreduce定义了响应行为,输入和输出的RDD形成了DAG(有向无环图),通过对数据的位置和依赖分析形成最终的执行计划。如果说spark的batch RDD是静态(冷)数据流,那spark streaming则更像是动态(热)数据流。
涉及到并发编程,那并发编程的本质是什么?现在的并发和古老的并发到底有何区别?这些各种封装好框架,除了让你编程的代码结构发生了变化,提取了常用的处理模式,分离了并发处理逻辑和你实现的业务逻辑。本质仍然是wait/notify/资源共享(表现为内存区域共享,简单的就是变量,文件,数据库,介质无非就是内存或者磁盘,这就是资源)。
和传统编程相比,到底哪里不同?同步单线程确实无差别,异步调用确实有差别,使用高阶函数,让传统的回调漩涡看起来扁平化,高阶函数是什么?输入参数为函数或输出结果为函数(curry化)或两者兼备的函数。这看上去更像是两种生长方式,传统回调漩涡是从地面一直下降到地心的漩涡,而高阶函数更像是通过函数指针或接口定义重新定义函数或接口的行为,依次进行输入输出的调用。
最后简单总结下我们的编程方式:
1、野蛮人风格?
exec(){
dosomethingA...;
dosomethingB...;
dosomethingC...;
}
2、看上去像漩涡?像链?
function a(r1){
dosomethingA...;
b(r1);
}
function b(r1){
dosomethingB...;
c(r1);
}
function c(r1){
dosomethingC...;
}
exec(){ a("r1");}
3、看上去像大饼
function a(r1){
dosomethingA...;
}
function b(r1){
dosomethingB...;
}
function c(r1){
dosomethingC...;
}
exec(){ a("r1");b("r1");c("r1");}
4、这是函数式编程?
function a(r1){
dosomethingA...;
return r1;
}
function b(r1){
dosomethingB...;
return r1;
}
function c(r1){
dosomethingC...;
}
exec(){ c(b(a("r1")));}
5、这是函数响应编程?
List acts = ...;
acts.add(function(r1){dosomethingA...})
.add(function(r1){dosomeghingB...})
.add(function(r1){dosomethingC...});
exec(){for(Action act : acts) act("r1");}
亦或是:
List acts = ...;
acts.add(&a)
.add(&b)
.add(&c);
exec(){for(Action act : acts) (*act)("r1");}
或是:
List acts = ...;
acts.add(new Action(){ call(r1){dosomethingA...;}})
.add(new Action(){ call(r1){dosomethingB...;}})
.add(new Action(){ call(r1){dosomethingC...;}};
exec(){for(Action act : acts) act.call("r1");}
编程很简单,就看你怎么折腾它。
我感觉很简单,但是好像也没说明白,也许还需要理解2.0。
相关推荐
“iOS函数响应型编程”一书通过具体的案例和详尽的解释,为iOS开发者提供了一个全面的指南,帮助他们理解并掌握函数式响应型编程范式,特别是如何在ReactiveCocoa框架下实践FRP以及如何有效地使用MVVM设计模式。...
因此,函数式编程在构建响应式应用程序时尤其有用。 最后,对于大多数开发者来说,学习函数式编程的最终目的并不是要完全放弃传统的命令式编程,而是为了扩展自己的编程视野,掌握更多编程的工具和技巧。通过学习...
iOS函数响应型编程是软件开发领域中的一个重要概念,它结合了函数式编程范式和响应型编程模型。通过利用响应型编程的异步数据流处理机制,iOS开发者能够构建出更加高效和可维护的应用程序。本文将详细介绍函数响应型...
4. **不适合实时系统**:由于其强调不可变性和无副作用,函数式编程可能不适用于需要即时响应和动态更新的实时系统。 在JavaScript中,函数式编程也得到了广泛的应用,例如通过使用箭头函数、map、reduce、filter等...
本篇文章将深入探讨Spring响应式编程的基本知识,帮助你理解和实践这一前沿技术。 首先,我们需要理解什么是响应式编程。响应式编程是一种编程范式,它强调数据流和变换传播,使得系统能够快速响应输入变化。在...
3. **响应式**:如果库支持响应式编程,那么当屏幕尺寸变化时,布局会自动更新,无需额外的条件判断或通知监听。 4. **测试友好**:纯函数更易于单元测试,因为它们不会产生副作用。 在实际应用中,结合Swift的其他...
这可能包括路由、请求处理和响应构建等方面的比较,强调函数式编程的简洁性和可组合性。 【函数式编程范式】 函数式编程范式包括: 1. **纯函数**:无副作用,只依赖输入参数,不改变外部状态。 2. **不可变性**:...
函数式编程还有助于实现函数式反应式编程(FRP),这是一种编程模型,它结合了函数式编程和响应式编程,允许开发者以声明式方式处理事件和时间变化。在现代前端开发中,如React和Vue.js框架,FRP已经成为构建用户...
在这种环境下,`ReactiveObjC`应运而生,它是一个Objective-C框架,实现了函数响应式编程(Functional Reactive Programming,简称FRP)模式,为Objective-C开发者提供了类似Swift中的反应式编程体验。 **函数响应...
标题中的"swift-TDFReactive"是一个专为Swift编程语言设计的API请求库,它利用了函数响应式编程(FRP)的理念和离散模型来优化网络交互。这个库旨在提供一种更简洁、更易于理解和维护的方式来处理网络请求,使得...
函数式编程基本可以理解具有以下四种特性:属于声明式编程范式、纯函数、不可变性以及引用透明。 在前端开发中,函数式编程可以帮助管理和减少可变状态,让我们在实际开发中,尽可能的将纯函数从不纯的部分中分离...
本教程将详细解释如何在MFC对话框程序中添加菜单以及如何实现菜单消息的响应函数。 首先,我们需要理解MFC对话框程序的基础。一个基于对话框的MFC应用程序通常由一个继承自`CDialog`类的自定义对话框类构成,该类...
《MITSUBISHI三菱FXCPU 结构化编程手册 [应用函数篇]》是一本针对MELSEC-F FX系列可编程控制器的用户手册,旨在帮助用户理解和应用结构化编程技术。该手册详细介绍了FX系列CPU在结构化编程中的应用函数,以提升编程...
在编程领域,特别是涉及到用户界面(UI)设计时,编辑菜单项和修改响应函数是两个至关重要的概念。本文将深入探讨这两个主题,并提供详细的解释。 首先,让我们理解“编辑菜单项”。在大多数软件应用程序中,菜单是...
回调函数在计算机编程中是一种非常重要的机制,它允许我们将一个函数作为参数传递给另一个函数,以便在特定条件或事件发生时由被...回调函数是理解和掌握高级编程技巧的关键,尤其在需要处理事件驱动和分布式系统时。
在函数式编程中,数据是不可变的,这使得代码更易于理解、测试和并行化。 KTH(瑞典皇家理工学院)提供的这门课程深入探讨了函数式编程的概念,包括: 1. **λ演算**:作为函数式编程的理论基础,λ演算提供了一种...
《精通Windows API——函数、接口、编程实例》这本书主要涵盖了Windows操作系统编程的核心技术,包括Windows API的基本概念、函数调用、系统接口以及丰富的编程实例。Windows API是开发Windows应用程序的基础,它...
6. 响应式编程:虽然不是所有函数式语言的特征,但在某些环境中,如Haskell的FRP(Functional Reactive Programming)框架,可以处理时间变化的值,提供一种声明式的处理事件和数据流的方式。 7. Monads:Haskell中...
在Swift 4中,函数式编程框架如RXSwift的引入,为Swift开发者提供了响应式编程的能力。响应式编程是一种以数据流和变化传播为中心的编程范式,RXSwift通过Observable序列来处理事件和数据,使得异步操作变得更为直观...