🧩 第三章 理解OOP:编程语言的历史
📄 一句话概括

结构化编程的目标很朴素:让程序从上往下读得下去——goto 版 6 行 2 处跳转,while 版 3 行 0 处。

📝 本节和前面几节的关系

3.4 让程序员有余力想结构,这一节讲结构本身。

一、先崩的是人不是机器

高级语言让写程序变容易,于是程序变大了。 程序一大,机器照样跑,人却读不动了。 结构化编程要解决的就是这个:不是让程序更快,是让人读得下去。

二、两种写法

把 1 加到 10,goto 版要6 行、2 处跳转、2 个标签。 while 版要3 行、0 处跳转、0 个标签。 实测:行数少了 3 行,更重要的是跳转没了。 没有跳转,读代码的人就不必满屏找 L1 在哪、L2 又从哪来。

三、阅读顺序=执行顺序

这就是【易懂】的全部含义:从上往下读,就是它跑的顺序。 一旦有 goto,这两件事就分家了——你必须模拟执行才能知道流程。 Dijkstra 那篇著名文章说的就是这个:GOTO 让程序的文本结构失去意义。

四、三种结构

顺序、选择、循环——三种结构各自只有一个入口一个出口。 随便怎么嵌套都不乱,因为每个块的进出点都是明确的。 这就是结构化编程的全部内容,听着简单,但它是后面一切的地基: OOP 的【方法】就是一结构化的小块,类的【接口】也是同样思路的延伸。

五、动手 Demo:重视易懂性的结构化编程

同一段【1 加到 10】,goto 版和 while 版各写一遍。 逐行数一数:行数、跳转数、标签数。

goto_src = [
    "i = 0; s = 0",
    "L1:",
    "if i > 10 goto L2",
    "s = s + i; i = i + 1",
    "goto L1",
    "L2:",
]
while_src = ["i = s = 0", "while i <= 10:", "    s += i; i += 1"]
for name, src in (("goto", goto_src), ("while", while_src)):
    jumps = sum(1 for s in src if "goto" in s)
    labels = sum(1 for s in src if s.endswith(":") and " " not in s)
    print(name, "行", len(src), "跳转", jumps, "标签", labels)

实跑输出:

--------------------------------------------------------------------
重视易懂性的结构化编程
--------------------------------------------------------------------

  程序一大,最先崩的不是性能,是**人看不懂**。
  **结构化编程的目标很朴素:让程序从上往下读得下去。**

  拿一段【把 1 到 10 加起来】看两种写法:

        i = 0; s = 0
        L1:
        if i > 10 goto L2
        s = s + i; i = i + 1
        goto L1
        L2:

      while 版:

        i = s = 0
        while i <= 10:
            s += i; i += 1

  实测:**goto 版 6 行、跳转 2 处;while 版 3 行、跳转 0 处。**

  **行数少了 3 行,更重要的是【跳转没了】。**
  没有跳转,读代码的人就不必满屏找 `L1` 在哪、`L2` 又从哪来。
  **阅读顺序=执行顺序**,这就是【易懂】的全部含义。

  所以结构化的三条规矩其实是同一件事:
  **顺序、选择、循环**——三种结构各自只有一个入口一个出口,**随便怎么嵌套都不乱。**

实测:goto 版 6 行、2 处跳转、2 个标签;while 版 3 行、两栏都是 0。 行数少了 3 行,更重要的是跳转没了——阅读顺序终于等于执行顺序。

30 秒实验

  1. 找一段带 break/continue 的循环,看看算不算【温和的 goto】。
  2. 把一个嵌套三层的 if 改写成提前返回,感受一下可读性的差别。

常见误区

  1. 以为结构化是为了性能。它只为人读得懂。
  2. 以为没有 goto 就没有跳转。break、continue、异常都是跳转。
自测三问(点开对答案) 1. 结构化编程要解决什么问题? —— 程序变大之后人读不动的问题——让阅读顺序等于执行顺序。 2. goto 版和 while 版各是什么指标? —— goto 版 6 行 2 处跳转 2 个标签;while 版 3 行 0 跳转 0 标签。 3. 三种基本结构是什么? —— 顺序、选择、循环,各自只有一个入口一个出口,随便怎么嵌套都不乱。

相关笔记