架构整洁之道笔记(二)-编程范式

第三章 编程范式总览

结构化编程对程序控制权的直接转移进行了限制和规范。

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

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

编程范式和软件架构的关系?
多态是我们跨越架构边界的手段,函数式编程是我们规范和限制数据存放位置与访问权限的手段,结构化编程是各模块的算法实现基础。这和软件架构的三大关注重点不谋而合:功能性、组件独立性、数据管理。

第四章 结构化编程

人们可以用顺序结构、分支结构、循环结构这三种结构构造出任何程序。这个发现非常重要:因为它证明了我们构建可以推导模块所需要的控制结构集与构建所有程序所需的控制结构集的最小集是等同的。
结构化编程范式可以将模块递归降解拆分为可推导的单元,这就意味着模块也可以按功能进行降解拆分。
程序员可以将大型系统设计拆分成模块和组件,而这些模块和组件最终可以拆分为更小的、可证明的函数。

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

Dijkstra曾经说过“测试只能展示Bug的存在,并不能证明不存在Bug”。

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

第五章 面向对象编程

面向对象编程的出现使得这种插件式架构(通过多态)可以在任何地方被安全地使用。

对软件架构师来说,面向对象编程就是以多态为手段来对源代码中的依赖关系进行控制的能力。这种能力让架构师可以构建出某种插件式架构,让高层策略性组件与底层实现性组件相分离,底层组件可以被编译成插件,实现独立于高层组件的开发和部署。

第六章 函数式编程

函数式编程语言中的变量是不可变的,一旦被初始化之后,就不会再被更改。

为什么不可变性是软件架构设计需要考虑的重点?

所有的竞争问题、死锁问题、并发更新问题都是由可变变量导致的。如果变量永远不会被更改,那就不可能产生竞争或者并发更新问题。

一个架构设计良好的应用程序应该将状态修改的部分和不需要修改状态的部分隔离成单独的组件,然后用合适的机制来保护可变量。

软件架构师应该着力于将大部分处理逻辑都归于不可变组件中,可变状态组件的逻辑应该越少越好。

事件溯源,只存储事务记录,不存储具体状态,当需要具体状态时,我们只要从头开始计算所有的事务即可。

这种数据存储模式中不存在删除和更新的情况,我们的应用程序不是CRUD,而是CR。因为更新和删除这两种操作都不存在了,自然也就不存在并发问题。
如果我们有足够大的存储量和处理能力,应用程序就可以用完全不可变的、纯函数式的方式来编程。
源代码管理程序就是用这种方式工作的。