编程范式
编程语言 = 范式(模型) + 语法与程序库(接口) + 运行时(实现)
编程范式也就说开发者们看待编程的方式,以不同的视角看待编程,某些方式相比某些方式自然就会有优点,也自然会有缺点,这些在现代编程语言的多范式融合中得到了很好的中和。
- 科学思维
- 理想化
- 将未知问题转换为已知问题
- 工程思维
- 受到实际因素制约
- 局部最优解
如何降低软件开发的复杂度:
- 分解与抽象
- 分层:分解与抽象组合使用对系统进行分层,缩小关注点,降低复杂性
非结构化 -> 结构化 -> 面向对象 -> 多范式
另一条线:函数式(多核、垃圾回收)
总体来看,共有3种方式:1. 命令式编程 2. 声明式编程 3. 逻辑式编程
声明式编程跟逻辑式编程都将大量工作交给运行时,让运行时处理底层细节,让开发者更专注高层的业务逻辑抽象。
关于软件开发
软件,是由顺序结构,分支结构,循环结构和间接转移几种行为组成,无可增加,也缺一不可
- 职责:执行一项任务或掌握某种信息的义务
- 变更是不可避免的
- 做好对可以预期到的变更的设计
- 可修改
- 可扩展
- 灵活
- 可操作性
结构化编程(命令式)
程序 = 算法 + 数据结构
主要表现:自顶向下/模块化/语句结构化(顺序、选择、循环)
结构化编程是对程序的控制权的直接转移进行了限制和规范
- 按算法分解
- 结构化的方式,使代码更好地被理解
- 是最接近计算机底层的编程方式(既是优点 也是缺点)
- 接近底层 性能高
- 接近底层 抽象能力弱
可推导性:通过数学化的证明法来证明程序是正确的(理想)
科学证明法:测试只能证明程序存在错误,而不能证明其正确
- 错误地使用goto是有害的
可将模块递归降解为可推导的单元
结构化编程自顶向上的依赖性较强,无法很好地隔离变化
面向对象编程(命令式)
程序 = 数据 + 行为
面向对象编程是对程序的控制权的间接转移进行了限制和规范
函数式编程(声明式)
程序 = 数据(list) + 函数(filter, map...)
函数式编程是对赋值操作进行限制和规范
函数式编程中的变量是不可变的
逻辑式编程
抽象的能力就更强,计算细节干脆不见了
通过描述逻辑来求解问题
- prolog
编程思想
面向切面编程AOP
- 静态接口
- 动态代理
- 字节码
面向元数据编程MOP
利用元数据(metadata)来定义和描述程序的数据结构、算法、逻辑和行为,以便程序在运行时能够根据元数据自动地生成代码或者运行,实现动态扩展和灵活适应需求变化的能力
- 泛型
- 反射
- 注解
面向契约编程COP
在开发过程中强调接口契约的重要性。契约指的是类、方法、接口等代码元素之间的约束条件,这些约束条件描述了这些元素在应用程序中的预期行为和使用方式,通过定义契约规范来描述代码元素的预期行为和使用方式来减少定义与使用的不一致性,降低出错的可能
模式驱动编程
将应用程序的开发过程分解成一些小的可复用的模式,通过接口、配置、注解、函数、模块等方式进行驱动程序的行为
- 接口驱动:通过定义接口来规范应用程序的行为
- 配置驱动:通过配置文件或者数据库中的数据来配置应用程序的行为
- 注解驱动
- 函数驱动
- 模块驱动