知识卡片
三大编程范式的共性:各自移除一种编程能力,而非增加
内容
结构化编程(1968年Dijkstra提出,论证goto这类无限制跳转会破坏程序结构)、面向对象编程(1966年Dahl和Nygaard提出,本质是把函数调用栈帧挪到堆内存让局部变量在函数返回后仍存活,从而催生类/构造函数/成员方法/多态)、函数式编程(源自1936年Church的λ演算,核心是不可变性,赋值被严格限制)——这三大范式常被理解为各自增加了某种编程能力,但书中给出一个反直觉的统一视角:结构化编程限制了程序控制权的直接转移(去除无限制跳转),面向对象编程限制了程序控制权的间接转移(去除对函数指针的直接使用,改用多态间接调用),函数式编程限制了赋值本身。三者共同点是都在移除某种能力,而不是新增能力——它们告诉我们不能做什么,而不是可以做什么。三个范式恰好都诞生于1958-1968这十年间,此后再没有新的”移除能力型”范式出现,这被作为”可能只有这三个范式”的旁证。这层历史知识和架构设计的关系很直接:多态是跨越架构边界的手段,函数式编程是规范数据存放位置与访问权限的手段,结构化编程是各模块算法实现的基础——恰好对应软件架构的三大关注点:功能性、组件独立性、数据管理。
结构图:
flowchart TD
A[三大编程范式] --> B[结构化编程 1968]
A --> C[面向对象编程 1966]
A --> D[函数式编程 源自1936年λ演算]
B -->|限制| B1[程序控制权的直接转移: 去除goto]
C -->|限制| C1[程序控制权的间接转移: 去除函数指针,改用多态]
D -->|限制| D1[程序中的赋值: 不可变性]
B1 -.对应.-> E[各模块算法实现基础]
C1 -.对应.-> F[跨越架构边界的手段]
D1 -.对应.-> G[规范数据存放位置与访问权限]
参考来源
- 位置:《架构整洁之道》第3章《编程范式总览》"结构化编程""面向对象编程""函数式编程""仅供思考""本章小结"(源文件:_epub-src/text/part0011_split_001.html)
- 结论依据:原文分别用"对程序控制权的直接转移进行了限制和规范""对程序控制权的间接转移进行了限制和规范""对程序中的赋值进行了限制和规范"三句话总结三大范式,并明确指出没有一个范式是增加新能力的,随后将三者分别映射到软件架构的功能性/组件独立性/数据管理三大关注点,直接支撑本卡片的结构图与解释。
- 原始内容:结构化编程对程序控制权的直接转移进行了限制和规范……面向对象编程对程序控制权的间接转移进行了限制和规范……函数式编程对程序中的赋值进行了限制和规范……没有一个范式是增加新能力的……多态是我们跨越架构边界的手段,函数式编程是我们规范和限制数据存放位置与访问权限的手段,结构化编程则是各模块的算法实现基础。