原创,转载请注明出处。
函数响应编程,这个概念在网上已经有很多解释了,我也读了很多,说说我的理解。有时候我想,我如何学习一个新的概念或技术,不是应该用我已有的脑袋去理解它么,关键是怎么理解,怎么才算理解,理解的对不对,我想这是抽象变形象的过程。那我就用自己的方法去理解和认识函数响应编程这个概念。
函数响应式编程的本质是什么?是函数编程和响应编程的结合,函数是编排,响应是关联作用。用来编排的是什么呢?是逻辑,是处理逻辑,这些逻辑是用函数实现的,而函数和函数之间的粘合剂是响应式编程实现的函数接口(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。
相关推荐
它被设计为一种简洁、灵活且易于学习的语言,具有许多现代编程语言的特性,如动态类型、函数式编程、以及面向对象编程等。下面是关于Mojo编程语言的一些介绍: 1. **简洁易读的语法**:Mojo采用了简洁易读的语法,...
在经历两个月漫长的学习时间之后,对ReactiveCocoa和RXSwift等函数响应式编程框架的学习已经有了一个非常清晰的概念。不过面对那么多的API和速记方法,脑袋实在记不住太多好用的小技巧。特在此整理了速查表。方便...
如何实现API函数,理解消息响应机制;熟悉MFC编程,了解MFC的类框架,特别文件资源的操作
Javascript 函数响应式编程的 Flash 讲座 本演示文稿是关于 Js 中 FRP 的 20-30 分钟小演讲。 因此,我试图将scary概念分解为更简单、易于理解的部分,并且不包含太多代码。 演示文稿只有 3 个代码示例和演示文稿中...
应用程序中使用函数式响应式编程。 这些库是用纯 Java 编写的。 因此,您可以使用在 JVM 上运行的任何语言,并且仍然可以获得函数式编程的好处。 ReduxFX 应用程序的所有数据结构都是不可变的,并且所有功能都是纯的...
第1章 编程基础和字符串 3 1.1 编程与使用计算机的区别 3 1.1.1 编程的一致性 3 1.1.2 编程的可控性 4 1.1.3 程序要应对变化 4 1.1.4 小结 4 1.2 准备工作 4 1.2.1 在非Windows系统上安装 Python 3.1 5 1.2.2 使用...
此外,在Xerox PARC工作,那里有许多语言和系统上的专家,我不得不强迫自己去理解Tcl/Tk的长处和弱点。我的许多同事都在他们的项目中采用了Tcl和Tk,但是他们也很快指出了它的缺点。因此,我就总结了一套编程技巧以...
对于这些概念,初学者的理解也许只能似是而非,我将用一个最简单的例子说明异步非阻塞Socket的基本原理和工作机制。目的是让初学者不仅对Socket异步非阻塞的概念有个非常透彻的理解,而且也给他们提供一个用Socket...
JavaScript的执行环境是单线程的,单线程的好处是执行环境简单,不用去考虑诸如资源同步,死锁等多线程阻塞式编程等所需要面对的恼人的问题。但带来的坏处是当一个任务执行时间较长时,后面的任务会等待很长时间。在...
API函数是构筑整个Windows框架的基石,只有充分理解和利用API函数,才能深入到Windows的内部,充分发挥各种32位平台的强大功能和灵活性,才能成功地扩展和突破类库、控件和可视开发环境的限制。 Win32 API即为...
通过MFC编程利用window的API函数(CSocket类)完成简单的网络聊天程序编写,重点理解该程序中的消息响应机制。
19.4.3 响应验证错误 528 19.4.4 获取错误列表 529 19.4.5 显示不同的错误指示符号 530 19.4.6 验证多个值 533 19.5 数据提供者 535 19.5.1 ObjectDataProvider 536 19.5.2 XmlDataProvider 539 19.6 小结 541 第20...
高级编程(第6版)-文字版.pdf 第I部分 语言结构和环境 第1章 visual studio 2010 3 1.1 visual studio 2010:从express到ultimate的各种版本 4 1.2 visual basic的关键字和语法 7 1.2.1 控制台应用程序 10 ...
javascript异步编程, web2.0时代比较热门的编程方式,我们平时码的时候也或多或少用到,最典型的就是异步ajax,发送异步请求,绑定回调函数,请求响应之后调用指定的回调函数,没有阻塞其他代码的执行。还有像...
这导致代码的逻辑大大简化,但是,对于熟悉面向对象编程,而不是函数式编程思路的开发者来说,是一个比较大的挑战。 处理请求的函数 在 ASP.NET Core 中,一次请求的完整表示是通过一个 HttpContext 对象来完成的,...
9.4.1 通过编程进行导航 217 9.4.2 导航事件 218 9.4.3 管理日志 219 9.4.4 向日志添加自定义项 221 9.4.5 页函数 225 9.5 XAML浏览器应用程序 227 9.5.1 XBAP应用程序的运行要求 228 9.5.2 创建XBAP应用程序...
全书分为三部分:第一部分(第1~6章),提供了翔实的背景知识和框架方面的概念,借助于此框架,读者可理解WinSock的具体细节,包括WindowsSockets概述、OSI网络参考模型、TCP/IP协议簇中的协议和可用的服务、...
第1章 函数响应式编程。这⼀章⽤⼀些例⼦展⽰RxJS体现的编程风 格,引出两个重要的概念:函数式编程和响应式编程,使⽤RxJS的开发者 必须先理解这两种风格。 第2章 RxJS⼊门。这⼀章介绍软件项⽬中导⼊RxJS的⽅法...
2.3.1 游戏事件函数 2.3.2 GameEngine类 2.4 开发Blizzard示例 2.4.1 编写程序代码 2.4.2 测试完成的程序 2.5 小结 2.6 游戏大变身 第3章 学习绘制基本图形 3.1 图形基础 3.1.1 理解图形坐标系统 ...