编程范式(一):结构化编程

简介: 编程范式(一):结构化编程

总览


上一篇文章: 寒草与《架构整洁之道》|树叶飞舞,故事开始🌟简要介绍了什么是设计与架构,以及架构的价值所在,本篇文章将介绍编程范式。


编程范式指的是程序的编写模式,与具体的编程语言关系相对较小。这些范式会告诉你应该在什么时候采用什么样的代码结构。直到今天,我们也一共只有三个编程范式:


  • 结构化编程

结构化编程对程序控制权的直接转移进行了限制和规范。Dijkstra 论证了使用 goto 这样的无限制跳转语句将会损害程序的整体结构,也是这位 Dijkstra 最先主张用我们现在熟知的 if/then/else 语句和 do/while/until 语句来代替跳转语句的。

  • 面向对象编程

面向对象编程对程序控制权的间接转移进行了限制和规范。

  • 函数式编程

函数式编程对程序中的赋值进行了限制和规范。


这三个编程范式都从某一方面限制和规范了程序员的能力。没有一个范式是增加新能力的。也就是说,每个编程范式的目的都是设置限制。这些范式主要是为了告诉我们不能做什么,而不是可以做什么。


另外,我们应该认识到,这三个编程范式分别限制了 goto 语句、函数指针和赋值语句的使用。


结构化编程


可推导性


编程是一项难度很大的活动。一段程序无论复杂与否,都包含了很多的细节信息。如果没有工具的帮助,这些细节的信息是远远超过一个程序员的认知能力范围的。而在一段程序中,哪怕仅仅是一个小细节的错误, 也会造成整个程序出错。

对于上面的问题,Dijkstra 提出的解决方案是采用数学推导方法。即:程序员可以用代码将一些己证明可用的结构串联起来,只要自行证明这些额外代码是正确的,就可以推导出整个程序的正确性。


Dijkstra 在研究过程中发现了一个问题: goto 语句的某些用法会导致某个模块无法被递归拆分成更小的、可证明的单元,这会导致无法采用分解法来将大型问题进一步拆分成更小的、可证明的部分。


goto 语句的其他用法虽然不会导致这种问题,但是 Dijkstra 意识到它们的实际 效果其实和更简单的分支结构 if-then-else 以及循环结构 do-while 是一致的 。 如果代码中只采用了这两类控制结构,则一定可以将程序分解成更小的、可证明的单元。


Bohm 和 Jocopini 证明了人们可以用顺序结构、分支结构、循环结构这三种结构构造出任何程序。这个发现非常重要: 因为它证明了我们构建可推导模块所需要的控制结构集与构建所有程序所需的控制结构集的最小集是等同的。 这样一来,结构化编程就诞生了。


科普一下:顺序结构和分支结构的正确性可以用枚举法证明,但是循环结构需要采用**数学归纳法**:具体来说就是,首先要用枚举法证明循环 1 次的正确性,接下来再证明如果循环 N 次是正确的,那么循环 N+1 次也同样也是正确的。


GOTO 是有害的


这是一段有趣的故事:


1968 年,Dijkstra 曾经给 CACM 的编辑写过一封信 。 这封信后来发表于 CACM 3 月刊,标题是 Go To Statement Considered Harmfu/1, Dijkstra 在信中具体描绘了他对三种控制结构的看法。

由于当时还没有互联网,大家还不能直接上网发帖来对 Dijkstra 进行冷嘲热讽,他们唯一能做的,也是大部分人的选择,就是不停地给各种公开发表的报刊的编辑们写信。

有的信件的措辞并不那么友善,甚至是非常负面的。但是,也不乏强烈支持者。总之,这场火热的争论持续了超过 10 年 。


中间吐槽一句:这一幕像极了现在网上的各种骂战,哈哈哈


这场辩论最终还是逐渐停止了。原因很简单: Dijkstra是对的。随着编程语言的演进,goto 语句的重要性越来越小,最终甚至消失了。如今大部分的现代编程语言中都己经没有了 goto 语句。


现如今,无论是否自愿,我们都是结构化编程范式的践行者了,因为我们用的编程语言基本上都己经禁止了不受限制的直接控制转移语句。


功能性降解拆分


既然结构化编程范式可将模块递归降解拆分为可推导的单元,这就意味着模块也可以按功能进行降解拆分。这样一来,我们就可以将一个大型问题拆分为一系列高级函数的组合,而这些高级函数各自又可以继续被拆分为一系列低级函数,如此无限递归。更重要的是,每个被拆分出来的函数也都可以用结构化编程范式来书写。


通过采用这些技巧,程序员可以将大型系统设计拆分成模块和组件,而这些模块和组件最终可以拆分为更小的、可证明的函数。


网络异常,图片无法展示
|


其中思想至今仍被沿用🌟


结束语


网络异常,图片无法展示
|


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


最后还有一句话印象深刻:一段程序可以由一个测试来证明其错误性,但是却不能被证明是正确的。


✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

少年向来不识天高地厚
放眼处皆自负才高八斗
虽是自命风流
倒也坦诚无忧
我爱这样的少年
谦和而狂妄
骄傲又坦然☀️

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

相关文章
红警源代码居然开源了....
红警源代码居然开源了....
773 0
|
12月前
|
数据可视化 算法 安全
智能体赋能企业管理:数据驱动决策的治理现代化实践
北京某互联网公司HR每月核算百人绩效耗时3天、准确率仅85%。引入“智能体来了”HR智能系统后,通过API整合Jira、企业微信、CRM数据,采用Drools规则引擎实现考核逻辑可配置,ECharts可视化分析,将核算压缩至2小时,准确率达99%,离职预测准确率82%,助力企业迈向数据驱动管理,符合国家智能化升级与数据安全规范要求。
|
11月前
|
Python Windows
Miniconda 安装与环境配置全流程图解(2025 最新版)
Miniconda 可以看作是 Anaconda 的“轻装版”,只自带 conda 包管理器与基础的 Python 运行时。它体积小、部署速度快,特别适合按需创建与管理虚拟环境的用户。与 Anaconda 相比,Miniconda 不会预先安装一大堆科学计算库,你可以根据项目需求再单独选择、安装需要的包,因此整体更轻巧、更灵活。 本文将手把手演示在 Windows 下安装 Miniconda 的全过程:从下载安装器、完成向导配置、设置环境变量,到最后的基础验证与简单示例,帮助你迅速把 Miniconda 用起来。
11510 12
|
机器学习/深度学习 Java 编译器
解锁硬件潜能:Java向量化计算,性能飙升W倍!
编译优化中的机器相关优化主要包括指令选择、寄存器分配、窥孔优化等,发生在编译后端,需考虑目标平台的指令集、寄存器、SIMD支持等硬件特性。向量化计算利用SIMD技术,实现数据级并行,大幅提升性能,尤其适用于图像处理、机器学习等领域。Java通过自动向量化和显式向量API(JDK 22标准)支持该技术。
513 4
|
机器学习/深度学习 算法 PyTorch
YOLO如何入门?
YOLO如何入门?
|
存储 编解码 开发者
基于STM32和OLED的小恐龙游戏项目设计与实现【免费开源】
小恐龙游戏最初是作为浏览器离线小游戏而广为人知,其简单的操作与生动的画面使其深受用户喜爱。本项目将经典的小恐龙跳跃游戏移植到嵌入式平台上,使用STM32微控制器作为核心控制器,OLED屏幕进行显示,搭配按键或触摸实现用户交互。通过本项目,既可以体验游戏开发在嵌入式系统上的实现方式,又能掌握STM32 GPIO、定时器、OLED驱动、按键扫描及简单动画实现技术。
基于STM32和OLED的小恐龙游戏项目设计与实现【免费开源】
|
存储 缓存 人工智能
阿里云Tair KVCache:打造以缓存为中心的大模型Token超级工厂
Tair KVCache 是阿里云推出的面向大语言模型推理场景的缓存加速服务,基于分布式内存池化和分级缓存体系,解决显存墙与带宽瓶颈问题。为万亿参数模型的高效推理提供技术保障,推动 AI 算力进化与规模化应用。
|
缓存 网络协议 安全
【计算巢】DNS 解析过程详解:域名如何转换为 IP 地址
【5月更文挑战第31天】DNS(域名系统)将人类可读的域名转换为IP地址,涉及本地DNS缓存、层次化DNS服务器系统,包括根DNS、顶级域名DNS和权威DNS。当查询域名时,通过DNS服务器间的交互找到对应IP并返回给浏览器。Python示例展示了DNS查询过程。尽管DNS面临安全挑战,如欺骗和缓存中毒,采取安全措施可确保其稳定性和安全性。它是互联网的重要基础,连接域名与IP,支持便捷的网络访问。
1028 0
|
编解码 人工智能 安全
【01】AE特效开发制作特技-Adobe After Effects-AE特效制作快速入门-制作飞机,子弹,爆炸特效以及导出png序列图-优雅草央千澈
【01】AE特效开发制作特技-Adobe After Effects-AE特效制作快速入门-制作飞机,子弹,爆炸特效以及导出png序列图-优雅草央千澈
657 20
【01】AE特效开发制作特技-Adobe After Effects-AE特效制作快速入门-制作飞机,子弹,爆炸特效以及导出png序列图-优雅草央千澈
|
存储 人工智能 程序员
一文彻底搞清楚C语言的数据类型和变量
本文介绍了数据类型(基本、构造、指针、空类型)、变量(使用、命名规则、作用域)和常量(字面、符号、枚举、表达式),帮助初学者理解编程基础概念。坚持学习,定能创造奇迹!
2298 1
一文彻底搞清楚C语言的数据类型和变量

热门文章

最新文章