编程范式
编程范式是对程序的限制和规范,
- 结构化编程限制了程序控制权的「直接转移」,即goto语句
- 面向对象编程(OOP)限制了程序控制权的「间接转移」,具体来说,是利用多态来限制用户对函数指针的使用
- 函数式编程(FP)限制了程序的「变量赋值」语句,即状态的直接变化
结构化编程
结构化编程的核心是以下几点,
- 程序是「顺序」运行的
- 可以通过 if-else-switch 来控制条件分支
- 可以通过 for-while 等语句来控制循环分支
- 不可以使用 goto 语句
Dijkstra 证明了结构化编程是可以形式化验证的,现代编程语言也都默认采用了这种范式。具体来说,顺序运行通过程序的输入/输出以及执行流来验证,条件分支可以测试每个分支来验证,循环语句可以通过数学归纳法来验证。
测试是一种证伪的过程
因为程序的规模庞大对每一段程序都进行形式化验证是实践不可行的,所以需要QA(质量保证)来对程序进行证伪,这是一种科学的验证手段。
OOP、多态和控制反转
面向对象编程通过多态的形式来实现依赖反转,这就提供了插件式的能力,高层架构可以按任意顺序调用底层模块,底层模块的实现也可以独立地开发和部署。
不可变性
为什么函数式编程要强调不可变性?一切问题都是可变性导致的。
假设有无限的处理能力和储存,那么通过仅保存事务日志就可以实现不储存状态(不可变性质),程序仅需要 Create 和 Read,也就不会有并发问题。
优秀架构的衡量标准就是在程序有限的生命周期和有限的资源下尽可能把状态设计为不可变。
插件式架构
软件架构中的组件是指程序运行时插入的动态链接文件,也称为组件化的插件式架构。
如今,我们用 .jar,DLL和共享库的方式来部署应用的插件已经司空见惯了。如果我们现在想要给 Minecraft 增加一个模块,只需要将 .jar 文件放到一个指定的目录中即可。同样的,如果你想给 Visual Studio 增加插件,也只需要安装对应的 DLL 文件即可。
软件架构之组件的不可能三角
指导组件复用和切分的逻辑:在三个原则中寻求平衡点。
避免循环依赖
循环依赖让组件形成复杂的干扰,也让测试和发布变得困难,打破循环依赖的方法是依赖反转,或者让它们共同依赖于一个新组件。
组件的稳定性
组件的稳定性由入度/(入度+出度)决定,入度是指有多少组件依赖它,一个底层组件的稳定性应该趋近于1,这意味着底层组件尽量少依赖其他组件。
稳定抽象原则
组件的抽象度是抽象接口的数量除以总数量。
稳定抽象原则是指一个组件的稳定性和抽象性应该成正比,稳定的组件应该尽可能抽象(作为底层组件),具体的组件应该尽可能灵活(作为外层业务组件)。
依赖关系、稳定抽象原则是衡量系统设计的一类指标。
架构的弊端
软件架构在早期开发中可能反而会成为一种障碍。
什么是软件架构
软件架构需要考虑:开发,部署,运行,维护,四个层面。运行时的错误往往最被业务方关注,但这些错误通常是因为没做好其他事情导致的。
💡 这是cesc的读书笔记系列,如果你觉得还不错的话,转评赞随便给一个就行!如果人气还行的话将会继续更新此书😆~