在看函数式编程,响应式编程的文章的时候。中文有时候都讲“编程”比较容易混淆。什么东西翻译过来都是“编程”,有些时候翻译用词又用很高深的字眼,有时候又是同级概念2333。自己会弄混,所以做些笔记好区别,大部分句子都仅是摘抄,文后有标明文章出处。在看这些个讲函数式、响应式文章之前先做的一些概念区别的笔记。
-
先根据英文直接先区分下面4个名词:
- 设计模式(Design Pattern)
- 编程范式(Programming Paradigm)
- 编程思想(Programming Thinking?)(这个我也不太确定前面有没有Programming这个词在前面,我的理解是:编程思想是一种思考问题的方式,是在真正写代码之前你考虑这个问题的方法,角度,模式;它区别于编程范式,编程语言。可能单单说是Thinking,前面不加Programming也不为过吧。)
- 句法(syntax)
-
上面名词的举例:
- 上面的表的一些讲解:Functional Thinking是一种编程思想,这个观点是有一篇文章讲到了的点。对应是文1貌似。
- Impreative Programming有两个中文译名:一个是命令式编程,另一个是指令式编程。
- 这里没有将Pure Functional和Functional进行区分。自己也不是看得很懂。
- Method Chaining的中文译名是链式编程(容易混淆)
- Dynamic Programming不是编程范式23333。是动态规划呀2333。它还有一个英文名Dynamic Optimization(直译:动态最优化)。
-
一些笔记
- Method Chaining不是一种编程范式。wiki上面也说这是一种句法。我的理解是Method Chaining最多可以算是一种编程技巧吧。但也不是编程范式。
- Functional的特性笔记:
- 函数是First Class
a. 函数能作为变量的值。
b. 函数可以作为另外一个函数的参数。
c. 函数返回另外一个函数 - Pure Functional(也是Functional的一些思想)
a. func结果只受参数影响
b. func内部不使用会受外部改变的变量
c. func的结果不影响外部 - 不可变数据。不能改变的数据。所有改动的操作都仅是值拷贝,对只进行修改后返回结果。
- 尾调用优化。有尾调用优化的编程语言会通过重用同一个栈来进行递归。若无往往会申请内存到满,崩掉,有优化的不会。
“与普通递归相比,由于尾递归的调用处于方法的最后,因此方法之前所积累下的各种状态对于递归调用结果已经没有任何意义,因此完全可以把本次方法中留在堆栈中的数据完全清除,把空间让给最后的递归调用。这样的优化便使得递归不会在调用堆栈上产生堆积,意味着即时是“无限”递归也不会让堆栈溢出”。(出自文7)
Functional Programming的思考方式:去掉不确定的那些因素,让同样的输入产生同样的输出。
如何行动
在自己的代码库中检查某些有一定复杂度的函数,跟踪它能触及的每一比特外部状态以及所有可能的状态更新。即使对它不做一点改动,把这些信息放入一个注释块就已经是极好的文档了。如果函数能够——比方说,通过渲染系统触发一次屏幕刷新,你就可以直接把手举在空中,声明这个函数所有的正副作用已经超出了人类的理解力。你要着手的下一项任务是基于实际执行的计算从头开始重新考虑这个函数。收集所有的输入,把它传给一个纯函数,然后接收结果并做相应处理。(出自文8)- 响应式编程Reactive Programming是一种编程范式。是一种面向数据流的,面向变化传播的编程范式。针对数据更新相关联,举个例子:用KVO来update我们的View。
- 将函数式编程思想整合到响应式编程中就是函数式响应编程。
- 也讲下OO吧:面向对象有思考方式和面向对象编程。它的3个特性是:封装,继承,多态。抽象、接口等等更接近是OO具体的做法了。
参考文章:
文1--函数式编程解释(博乐网python版本的解释)
文2--函数式响应文章
文3《“函数式”编程 vs 编程写个函数》(Swift的filter及函数式的思考方式)
文4--百度百科FP(我觉得是文1的再次解析)
文5--讲了OOP和FP在细节上的对比。
文6--C++ 11的Lambda表达式(这货是闭包2333)
文7--尾调用优化编译器做什么
文8--用C++进行函数式编程
小补充,语法上的貌似感觉