架构整洁之道书摘四——结构化编程

科学方法论不需要证明某条结论是正确的,只需要想办法证明它是错误的。如果某个结论经过一定的努力无法证伪,我们则认为它在当下是足够正确的。

我们的程序也是如此,我们不能证明我们的代码是绝对正确的,而是做各种case覆盖证明它可能存在错误。如果没有,就认为相对稳定的

Dijkstra曾经说过“测试只能展示Bug的存在,并不能证明不存在Bug”,换句话说,一段程序可以由一个测试来证明其错误性,但是却不能被证明是正确的。测试的作用是让我们得出某段程序已经足够实现当前目标这一结论。

这种证伪过程只能应用于可证明的程序上。某段程序如果是不可证明的,例如,其中采用了不加限制的goto语句,那么无论我们为它写多少测试,也不能够证明其正确性。

结构化编程范式促使我们先将一段程序递归降解为一系列可证明的小函数,然后再编写相关的测试来试图证明这些函数是错误的。如果这些测试无法证伪这些函数,那么我们就可以认为这些函数是足够正确的,进而推导整个程序是正确的。

结构化编程范式中最有价值的地方就是,它赋予了我们创造可证伪程序单元的能力。这就是为什么现代编程语言一般不支持无限制的goto语句。更重要的是,这也是为什么在架构设计领域,功能性降解拆分仍然是最佳实践之一。