意大利面条式代码
概述
意大利面条式代码(Spaghetti Code)指控制流像一团纠缠不清的面条般混乱的程序,由大量 goto 语句导致代码执行路径在行号之间来回穿梭,使任何人(包括原作者)都几乎无法理解程序逻辑。
关键内容
成因
在1960年代的编程实践中,主流语言(FORTRAN、COBOL、ALGOL、汇编语言)都大量依赖 goto 语句来实现控制流。程序员习惯于在代码中随意跳转,产生了蛛网般的控制流。
典型特征
一段典型的意大利面条式代码:
10 IF X > 0 GOTO 50
20 Y = Y + 1
30 IF Y > 10 GOTO 70
40 GOTO 10
50 X = X - 1
60 GOTO 30
70 IF Z = 0 GOTO 20
80 PRINT RESULT
90 GOTO 10
仅9行代码就包含5个 goto 跳转。程序员不得不用铅笔在打印出的代码清单上画线来追踪控制流——这些线条交叉缠绕,看起来就像一盘意大利面条。
危害
- 无法理解程序在运行时到底在做什么
- 修改一个 bug 往往会引入更多新 bug
- 程序的正确性只能靠运气而非推理
解决方案
结构化编程通过消除 goto、使用顺序/选择/循环三种基本结构,从根本上消除了意大利面条式代码的产生条件。
来源
- raw/books/计算机科学/06-dijkstra-goto-considered-harmful.md
相关
- Go To Statement Considered Harmful 论文 — 批判的对象
- Edsger Dijkstra — 批判者
- 结构化编程 — 解决方案