架构整洁之道书摘三——编程范式

编程范式指的是程序的编写模式,与具体的编程语言关系相对较小。这些范式会告诉你应该在什么时候采用什么样的代码结构。

目前也只有三个编程范式:

它们分别是结构化编程(structured programming)、面向对象编程(object-oriented programming)以及函数式编程(functional programming)。

结构化编程

结构化编程是第一个普遍被采用的编程范式(但是却不是第一个被提出的),由Edsger Wybe Dijkstra于1968年最先提出。与此同时,Dijkstra还论证了使用goto这样的无限制跳转语句将会损害程序的整体结构。接下来的章节我们还会说到,也是这位 Dijkstra 最先主张用我们现在熟知的 if/then/else 语句和do/while/until语句来代替跳转语句的。

我们可以将结构化编程范式归结为一句话: 结构化编程对程序控制权的直接转移进行了限制和规范。

面向对象编程

就是面向对象编程了。事实上,这个编程范式的提出比结构化编程还早了两年,是在1966年由Ole Johan Dahl和Kriste Nygaard在论文中总结归纳出来的。这两个程序员注意到在ALGOL语言中,函数调用堆栈(call stack frame)可以被挪到堆内存区域里,这样函数定义的本地变量就可以在函数返回之后继续存在。这个函数就成为了一个类(class)的构造函数,而它所定义的本地变量就是类的成员变量,构造函数定义的嵌套函数就成为了成员方法(method)。这样一来,我们就可以利用多态(polymorphism)来限制用户对函数指针的使用。

在这里,我们也可以用一句话来总结面向对象编程: 面向对象编程对程序控制权的间接转移进行了限制和规范。

函数式编程

尽管第三个编程范式是近些年才刚刚开始被采用的,但它其实是三个范式中最先被发明的。事实上,函数式编程概念是基于与阿兰·图灵同时代的数学家Alonzo Church在1936年发明的λ演算的直接衍生物。1958年John Mccarthy利用其作为基础发明了LISP语言。众所周知,λ演算法的一个核心思想是不可变性——某个符号所对应的值是永远不变的,所以从理论上来说,函数式编程语言中应该是没有赋值语句的。大部分函数式编程语言只允许在非常严格的限制条件下,才可以更改某个变量的值。

因此,我们在这里可以将函数式编程范式总结为下面这句话: 函数式编程对程序中的赋值进行了限制和规范。

它们都从某一方面限制和规范了程序员的能力。没有一个范式是增加新能力的。也就是说,每个编程范式的目的都是设置限制。这些范式主要是为了告诉我们不能做什么,而不是可以做什么