PHP面试一战到底
上QQ阅读APP看书,第一时间看更新

4.5 函数式编程

4.5.1 什么是函数编程

函数式编程是一种流行的编程范型(Programming Paradigm)。编程范型是指编程风格,就像写作时有散文、小说、说明文、诗歌等文体一样。不同的文体,风格差异很大,写作方法也不同。常见的编程范型有过程式编程、面向对象编程、函数式编程等。

过程式编程是一种比较“古老”的编程范型,程序执行时以函数(或过程、子程序等)为单位,首先调用主函数,主函数再调用其他函数,直到程序结束。常见的过程式编程语言是C语言。

面向对象的理念是将现实世界映射到计算机语言里,如“猫”对应到“Cat”类,猫有品种、颜色等不同的特性(属性),会吃猫粮,会喵喵叫(方法)。面向对象编程目前是主流的编程语言,PHP、C++、Java、.Net等都支持面向对象的特性。

函数式编程并非一个崭新的概念。最早的函数式编程语言Lisp诞生于20世纪50年代。随着编程语言的发展,人们逐渐发现过程式编程和面向对象编程的一些缺点。我们在讨论闭包和Lambda表达式时已经看到,过程式编程和面向对象编程在处理回调和迭代问题时,不可避免地遇到了全局变量和多余函数定义的问题。函数式编程的设计正是要规避这些“副作用”:将计算机运算作为函数处理,并避免状态改变和数据更改。目前PHP、Python、Javascript、Erlang、clojure、Scala、F#等语言都提供了函数式编程的特性。

4.5.2 函数编程的理念

函数式编程的基石是Lambda表达式,前面已有详细说明,不再赘述。这里重点说明其理念。

1.函数是“第一等公民”

其他编程范型中,各种基本类型的数据(整型、浮点、布尔等)是程序的基础,是“第一等公民”。函数式编程里,函数也是“第一等公民”(First-class)。所谓First-class,是计算机专用术语,指可以出现在程序的任何地方,包含将函数作为参数传递给另一个函数,或将一个函数作为返回值。这个特性在PHP的低版本(≤5.3)里是没有的。

2.高阶函数(Higher-Order Function)

高阶函数是指接收函数作为参数,或者其返回值是函数的函数。这个理念与“第一等公民”的理念紧密相连,高阶函数将函数视为和基本数据类型(整型、浮点、布尔等)同等地位,处理上并无特殊之处。

3.纯正函数(Pure function)

纯正函数是指没有副作用的函数。书写一个正确的纯正函数,需要满足4个条件:

● 如果没有使用到一个纯正函数计算的结果,那么该纯正函数可以删掉。

● 幂等性。如果某个参数不为引用类型,那么使用相同的参数进行多次计算的结果应该是相同的。

● 交换性。如果两个纯正函数没有数据依赖关系,那么它们可以交换位置,并行执行,彼此不会相互干扰。这对于多线程执行时尤为重要,纯正函数是线程安全的。

● 可被编译优化。如果整个程序都没有副作用,那么编译器可以自由地使用各种优化策略(排序或重新组合)来优化编译代码。

我们在第3.1节演示了forech的引用陷阱,这里给出一个使用函数式编程解决此问题的方案。

程序代码如下:(源码文件:ch04/lambda/reference_functional.php)

第3至5行用Lambda表达式实现了将数组内的数字加1的操作,整个过程没有使用引用,不会造成引用陷阱;也没有引入新的函数定义,是比较完美的一个解决方案。

4.5.3 函数式编程的优势

函数式编程的优势主要有以下几点:

(1)易写出可读性好的程序:程序的可读性大部分由开发者决定,但使用函数式编程容易写出可读性好的程序。函数式编程无副作用,不易存在不易察觉的更改变量的操作。

(2)易维护的代码管理:函数式编程没有副作用,既不依赖外部的状态,又不改变外部的状态,根据纯正函数的条件2,可以将函数视为一个独立的黑盒,有利于进行单元测试和模块化。

(3)易于代码重构:由于函数为独立个体,只要保证输入和输出一致,就很容易重构代码。

(4)并发编程:根据纯正函数的条件3,纯正函数是线程安全的,可以将程序更好地在多核计算机上并发执行。