第三章 范式概述

本概述章节中包含的三个范例是结构化编程,面向对象编程和函数式编程。

结构化编程

第一个被采纳的范式(但不是第一个被发明)是由Edsger Wybe Dijkstra在1968年发现的结构化编程。Dijkstra表明使用无限制的跳转(goto语句)对程序结构是有害的。 正如我们将在后面的章节中看到的那样,他用更熟悉的if/then/else和do/while/until的结构来替换那些跳转。

我们可以总结如下的结构化编程范例:

结构化编程描述控制的直接转移。

面向对象编程

第二个被采用的范式实际上是在两年前由Ole Johan Dahl和Kristen Nygaard在1966年发现的。 这两位程序员注意到,ALGOL语言中的函数调用堆栈框架可以被移动到一个堆中,从而允许函数声明的局部变量在函数返回后依然存在着。 该函数成为类的构造函数,局部变量变成实例变量,嵌套函数变成方法。再通过函数指针的使用规范,自然发现多态性。

我们可以总结面向对象的编程范式如下:

面向对象编程描述控制的间接转移。

函数式编程

最近才开始采用的第三种模式是第一个被发明的模式。 事实上,它的发明早于计算机编程本身。函数式编程是Alonzo Church的直接工作结果,他在1936年发明了兰布达演算,当时探寻同样数学问题的Alan Turing备受激励。他的兰布达演算是John McCarthy于1958年发明的LISP语言的基础。 兰布达演算的基本概念是不可变性,也就是符号的值不会改变的概念。 这实际上意味着一个函数式语言没有赋值语句。 事实上,大多数函数式语言都有一些方法可以改变变量的值,但是只能在非常严格的规定下进行。

我们可以总结功能编程范例如下:

函数式编程描述变量不可变。

精神食粮

注意我在介绍这三种编程范例时非常谨慎使用的方式:每个范式都影响程序员自我移除了某种行为,没有增加新的能力。每一个都强加一些额外的规程,其意图是消极的。这些范式告诉我们不该做什么,而不是告诉我们该做什么。

另一种看待这个问题的方法是认识到每一个范式都移除了我们什么行为。这三个范例一起删除goto语句,函数指针和赋值。还有什么可以移除的吗?

可能不会。因此这三种模式可能是我们将会看到的唯一的三种模式,至少只有三种这件事是负面的。进一步的证据表明,不会再有更多范式了,因为他们在1958年到1968年间的十年内全部被发现。在接下来的几十年中,没有新的范式被加入。

小结

这个范式的历史教训与架构有什么关系?完全相关。我们使用多态作为跨越架构边界的机制;我们使用函数式编程对数据的位置和访问进行原则处理;我们使用结构化编程作为模块的算法基础。

注意这三个方面与架构的三大关注点(功能,组件分离和数据管理)是否相符。

results matching ""

    No results matching ""