函数式编程入门

什么是函数式编程

函数式编程 (Functional Programming) 是一个比较宏大的话题。它是一个编程范式,与大家熟知的面向过程和面向对象平级,在维基百科中,可以看到各种各样的编程范式。

编程范式

那什么是范式? 其实就是在解决实际问题中,总结的编写程序的方法论,以某种统一的模式进行编程抽象及思考,构建出整个编程模型。比如面向过程的编程范式强调,我们去抽象现实世界时,按照初入门时的语法,去定义变量,去定义控制流,按照一定的逻辑把整个过程用程序描述清楚。当我们用面向对象的范式去考虑问题时,我们就不会平铺直叙地去描述整个过程,我们会把这个过程中用于消息交互的节点抽象成对象,定义好它们之前的消息接口,然后把整个的消息流转跑起来就可以了。所以编程范式与语言无关,只是有些语言偏重不同,会为我们以某种范式编写程序时提供最大的便利性。那我们以函数式编程的思想去构建程序时是怎么考虑的呢?

函数式编程的好处

在编写程序过程中,当我们调用一个可重入(reentrant)的函数的时候,心情总是有底的,因为可重入的函数是线程安全的。它不会修改一些共享资源的状态。而函数式编程中提倡的就是类似的纯函数。它没有副作用,给定相同的输入总会得到相同的输出。这样的函数才是好的。它类似于函数公式,传入一个值,就会得到一个结果,稳定可靠。
这样说来,函数式编程很简单,都写这种纯函数,拿面向过程去编写逻辑就好了。但函数式编程主要的不同是它的思想。它主张把整个运算过程写成一系列嵌套函数的调用。下面举个例子:

int i = 1 + 2;
int j = i * 3;
int k = j - 4;

上面是我们命令式编程中常用的逻辑,而函数式编程鼓励下面的做法:

int k = sub(mul(add(1, 2), 3), 4);

函数式编程更倾向于使用表达式,而不是使用命令式语句。并且函数是里面的第一等公民,可以像命令式编程中变量一样使用,类似于 C++ 中的 std::function,所以 lambda 表达式在 C++ 中被引入也在一定程序上向函数式靠近。

意义

综合上面的阐述,函数式编程的意义也不难得出。
- 比较接近自然主义,便于理解
如果上面例子中不够突显优势的话,当能够返回一个函数,即函数对象可以当作返回值 时,改写上面的例子,如下:

int k = add(1, 2).mul(3).sub(4);

我们可以像写公式一样,用表达式表示出一个运算过程的逻辑,这样就可以得到我们想要的结果。
- 有更好的并发效率
因为函数式编程需要编写纯函数,而纯函数是可重入,线程安全的,在完全并发情况下,可以不需要利用一些加锁机制进行同步,达到真正的并发。
- 其它
其它的一些特性比如开发效率高,等各种语言各执一词的特点,这里就不赘述。

结束语

每种编程范式的提出都不会是救世主,能够解决现实世界的所有问题。如果自己喜欢一种编程范式,然后就把现实世界里面的所有抽你都像这个范式靠只会适得其反,就像纯面向对象的 Java,由于过于要求面向对象,所以当一些事物不适合用这种范式抽象时,就不得不提出一些不自然的方式去强解问题,比如各种复杂的设计模式。因为现实世界是一直存在的,并且是多元的,它不会因为我们抽象的范式而改变,只有我们找到合适的不同范式去合作抽象它,才会使一切技术显得更自然。

你可能感兴趣的:(Functional,Programming)