自从初中开始学编程已经使用过好几门(PL)编程语言了,目前主流最多使用的编程语言 C/C++ 、Java 、JavaScript 这些都属于结构式和命令式编程语言。但在 Java 在 8 版本发布之后引入了 Lambda 表达式方式对函数式编程的支持,从现代的 Java 设计角度上来说并不是一个纯粹的结构和命令式编程语言了,个人将其归属为一个综合性很强的多编程范式的语言。在过去一年的重新学习了基于 ES6 版本的 JavaScript 之后,让我对函数式编程语言更为感兴趣了。在此之前使用过 Go 语言的实现过一些类似于函数式编程的代码,但 Go 在语言设计的时候并没有添加三目运算符和 Lambda 表达式,使其在编程体验上逊色于 JavaScript 和 Java8 这类原生支持三目运算符和 Lambda 表达式的函数式语言,目前我已经从完全放弃了 Go 语言传统命令式进行编程了,除了几个极少历史遗留开源项目正在使用它进行维护之外。如果读者正在考虑深入学习一门 PL 编程语言的话,我建议学习并且使用现代 Java21 之后的版本,现代 Java 已经添加很多新特性,这篇文章我会介绍一下函数式编程的优势。
面向过程
程序员日常开发中使用的最多编程方式是面向过程和面向对象,面向对象 OOP 是从 C 语言的面向过程演变发展设计出来的;面向过程取决于程序员如何设计一个好的数据结构和用编写好的函数去操作数据完成逻辑计算,在面向过程编程代码逻辑过程中,函数是主要的组织单元,程序的执行是一系列的函数调用,使用结构体来组织数据,但是能操作这些结构体仍然是通过函数来进行的。
编程范式最典型的例子,生活中一件事情抽象到计算机程序如何做?例如一个抽象的问题:如何把一头大象放到冰箱里面该如何做?换到人类的思维第一反应是怎么可能会有冰箱能装得下一头大象?在计算机里你只要想将具体逻辑告诉它,它能可以按照你逻辑去做某件事情,它很笨不会考虑这么多其他因素,不能去考虑大象是不是比冰箱大,除非在装填函数中编写了一些逻辑来检查是否合规。
下面就是使用 C 语言就编写一个 3 个函数把大象结构放到冰箱结构里,每个步骤对应着一个操作函数,面向过程的窜行代码:
#include <stdio.h>
#include <stdbool.h>
// 定义大象的结构体
struct Elephant {
char name[20];
int weight;
};
// 定义冰箱的结构体
struct Refrigerator {
bool isOpen;
bool hasElephant;
};
// 函数原型
void openRefrigerator(struct Refrigerator *fridge);
void closeRefrigerator(struct Refrigerator *fridge);
void placeElephantInRefrigerator(struct Elephant *elephant, struct Refrigerator *fridge);
int main() {
// 创建大象对象
struct Elephant elephant = {"大象", 5000};
// 创建冰箱对象
struct Refrigerator refrigerator = {false, false};
printf("将大象放到冰箱里面:\n");
// 打开冰箱
openRefrigerator(&refrigerator);
// 将大象放到冰箱里
placeElephantInRefrigerator(&elephant, &refrigerator);
// 关上冰箱
closeRefrigerator(&refrigerator);
return 0;
}
// 打开冰箱的函数
void openRefrigerator(struct Refrigerator *fridge) {
printf("打开冰箱门\n");
fridge->isOpen = true;
}
// 关闭冰箱的函数
void closeRefrigerator(struct Refrigerator *fridge) {
printf("关闭冰箱门\n");
fridge->isOpen = false;
}
// 将大象放到冰箱里的函数
void placeElephantInRefrigerator(struct Elephant *elephant, struct Refrigerator *fridge) {
if (fridge->isOpen) {
printf("将 %s 放进冰箱\n", elephant->name);
fridge->hasElephant = true;
} else {
printf("无法将大象放进冰箱,因为冰箱门没有打开\n");
}
}