编程范式
一、编程范式总览
至今,编程范式只有三种:结构化编程、函数式编程、面向对象编程
结构化编程:结构化编程对程序控制权的直接转移进行了限制和规范。
函数式编程:函数式编程对程序中的赋值进行了限制和规范。
面向对象编程:面向对象编程对程序控制权的间接转移进行了限制和规范。
没有一个范式是增加新能力的,每个编程范式都是从某一方面限制和规范了程序员的能力。也就是说,过去50年我们学到的东西主要是——什么不应该做。
多态是我们跨越架构边界的手段,函数式编程是我们规范和限制数据存放位置与访问权限的手段,结构化编程则是各模块的算法实现基础。
这和软件架构的三大关注点不谋而合:功能性、组件独立性以及数据管理。
二、结构化编程
1.可推导性
借鉴数学推导(公理、定理、推论),程序员可以用代码将一些已证明可用的结构串联起来,只要自行证明这些额外代码正确,就可以推导出整个程序的正确性。
可以用顺序结构、分支结构、循环结构这三种结构构造出任何程序。
2.功能性降解拆分
既然结构化编程范式可以将模块递归降解拆分为可推导单元,这就意味着模块也可以按功能进行降解拆分。我们就可以将一个大问题拆分为一系列高级函数的组合,而这些高级函数又可以拆分成一系列低级函数,如此无限递归。每一个被拆分出来的函数也都可以用结构化编程范式来书写。
三、面向对象编程
1.封装
封装并不是面向对象编程的必要条件,很多面向对象编程语言对封装性并没有强制性的要求。(这里应该指语法层面)
2.继承
继承也不是面向对象编程所特有
3.多态
一种事物可以有多种表现形态
比如组件的概念以及插件式架构,程序应该与设备无关
4.依赖反转
依赖关系和控制流是相反的,我们称之为依赖反转。
通过多态特性,软件架构师完全可以控制采用了面向对象这种编程方式的系统中所有的源代码依赖关系,而不再受系统控制流的限制。这就是面向对象编程的好处,也是面向编程范式的核心本质。
总结:面向对象编程就是以多态为手段来对源码中的依赖关系进行控制的能力,这种能力让软件架构师可以构建出某种插件式架构,让高层策略性组件与底层实现性组件相分离,底层组件可以被编译成插件,实现独立于高层组件的开发和部署。
四、函数式编程
1.不可变量
函数式编程语言中的变量是不可变的。
2.可变性的隔离
一个架构设计良好的应用程序应该将状态修改的部分和状态不需要修改的部分隔离成单独的组件,然后用合适的机制来保护可变量。
架构师应该着力于将大部分处理逻辑都归于不可变组件中,可变状态组件的逻辑应该越少越好。
3.事件溯源
在这种体系下,我们只存储事务记录,不存储具体状态。当需要具体状态时,我们只需要从头开始计算所有的事务即可。
这种体系需要无限容量存储和无限处理能力,但是只存在CR,不存在更新和删除,也就不存在并发问题,我们就可以用函数式编程来写程序,源码管理工具就是这种工作原理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构