《冒号课堂:编程范式与OOP思想》 写得非常有趣,对了解编程语言的发展、不同的编程范式有非常大的帮助。
1.4 编程范式
编程范式是计算机编程中的基本风格和典范模式,引导人们带着其特有的倾向和思路去分析和解决问题。
抽象的编程范式必须通过具体的编程语言来体现。范式的世界观体现在语言的核心概念中,范式的方法论体现在其表达机制中。一种语言的语法和风格与其所支持的编程范式密切相关。
1.5 开发技术
在宏观上选取一些框架以控制整体的结构和流程,在微观上利用库和工具包来解决具体的细节问题。
-
框架:使设计者在特定领域的整体设计上不必重新发明轮子,是一种设计重用。利用控制反转机制实现对模块的统一调度,给程序员带来约束。
-
库/工具包:使开发者摆脱底层编码,专注特定问题和业务逻辑;是代码重用。为程序员带来自由。
-
设计模式(design pattern)和架构(architecture)不是软件产品,而是软件思想。设计模式是战术思想,架构是战略思想。
-
设计模式:是针对某些经常出现的问题而提出的行之有效的设计解决方案,侧重思想重用,因此比框架更抽象、更普适,但多局限于局部解决方案,没有框架的整体性。
-
惯用法(idiom):也是针对常发问题的解决方案,偏重实现而非设计,与实现语言密切相关,是一种更底层更具体的编程技巧。
-
架构:一般指一个软件系统的最高层次的整体结构和规划,一个架构可能包含多个框架,而一个框架可能包含多个设计模式。
重要范式
2.1 命令范式
用命令式编写的程序由命令序列组成,即一序列祈使句 “先做这,再做那”,强调”怎么做”。模拟电脑运算。
其世界观是:程序有若干行动指令组成的有序列表;其方法轮是:用变量来存储数据,用语句来执行命令。
过程式编程是指引入了过程(procedure)、函数(function)或子程序(subroutine/subprogram)的命令式编程。
结构化编程, structured programming:在过程式编程基础上发展起来的,本质是一种编程原则。提倡在宏观上采用 自顶向下 的设计,在微观上采用顺序、选择和循环的逻辑结构,摒弃或限制 goto 语句,以保证程序易于读写、测试、维护和优化。
从左到右呈包含关系:命令式 > 过程式 > 结构化
2.2 声明范式
声明式编程由若干规范的声明组成,即一序列陈述语句,强调的是做什么,而非怎么做;声明式编程是人脑思维方式的抽象,即利用梳理逻辑或既定规范对已知条件进行推理或运算。
声明式编程主要包括函数式编程和逻辑式编程。
函数式编程通过数学函数的表达式变换和计算来求值。
逻辑式编程通过一序列事实和规则,利用数理逻辑来推导或论证结论。
命令式编程 是行动导向的,因而算法是显性而目标是隐性的;声明式编程是目标驱动的,因而目标是显性而算法是隐性的。
命令式:自动机机制,通过设计指令完成从初始状态到最终状态的转变;
函数式:数学变换机制,通过设计函数完成从自变量到因变量的计算;
逻辑式:逻辑证明机制,通过逻辑推理完成从题设到结论的正面。
2.3 对象范式
OOP 的核心思想可以归纳为:以数据为中心组织逻辑,将系统视为相互作用的对象集合,并利用继承与多态来增强可维护性、可扩展性和可重用性。
可维护性、可扩展性和可重用性是所有范式和语言的共同目标,但 OOP 更具易用性。
- 过程式编程 以过程为中心,自顶向下,逐步求精。
- 对象式编程 以数据为中心,自底向上,逐步合并。
封装使得对象拥有个体身份,继承使得对象拥有家庭身份,多态使得对象拥有社会身份。
2.4 并发范式
并发式编程以进程为导向,以任务为中心,以资源共享与竞争为主线。
并发誓编程有助于提高运行效率、充分利用资源、提高软件的响应能力、改善用户体验、保证公平竞争,同时以进程为单位将系统模块化,更加真实地模拟现实世界。
合理的并发式设计应该做到:软件易于重用、维护和测试;有效地利用资源,优化程序性能;保障进程安全和活性;减少性能损失和复杂度。
对象式和并发式在传统编程的基础上,分别从不同的方向进行拓展:对象式在数据类型上进行推广–允许运算作为数据类型的成员;并发式在执行顺序上进行推广–允许不同运算的执行在时间上交替或重合。
2.5 范式对比
范式 | 体系 | 模块 | 模块关系 |
---|---|---|---|
过程式 | 君主体系 | 过程 | 授命与听命 |
函数式 | 数学体系 | 函数 | 替换与合成 |
逻辑式 | 逻辑体系 | 断言 | 归纳与演绎 |
对象式 | 明主体系 | 对象 | 交流与服务 |
并发誓 | 生产体系 | 进程 | 竞争与合作 |
第 3 课 常用范式
3.1 泛型范式 — 抽象你的算法
泛型编程, Generic Programming, 其基本思想是:将算法与其作用的数据结构分离,并将后者尽可能泛化,最大限度地实现算法重用。
泛型编程不仅能泛化算法中涉及的概念(数据类型),还能泛化行为(函数、方法、运算)。
泛型编程是算法导向的,以算法为中心,逐渐将其所涉及的概念内涵模糊化、外延扩大化,并将其所设计的运算抽象化、一般化,从而提高算法的可重用性。
3.3 切面范式
SoC, Separation of Concerns,关注点分离;
DRY, Don’t Repeat Yourself, 即尽量减少重复代码。
抽象是前提,分解是方式,模块化是结果。
抽象与分解的原则有两条:单一化、正交化。每个模块职责明确专一,模块之间互相独立,即高内聚低耦合。
接入点(join point)是附加行为 (Advice) 的执行点,切入点(pointcut)是指定的接入点的集合,这些接入点共享一段插入代码。切入点与建议组成了切面(aspect),是模块化的横切关注点。编织是将附加的切面逻辑嵌入到主题应用程序之中的过程。
AOP 的实施分 3 步:切面分解、切面实现和切面合成。
OOP 只能沿继承树的纵向方向重用,AOP 可以沿横向方向重用。
3.4 事件驱动
4.3 汇总范式
同样的思想用在整体系统的结构设计上,则称为架构模式;用在局部模块的细节实现上,则称为设计模式;用在引导编程实践上,则称为编程范式。
闭包:所谓包是指函数与其周围的环境变量捆绑打包;所谓闭,指这些变量是封闭的,只能为该函数所专用。
5.2 数据类型–规则与变通
数据类型包含两个要素:一个是允许取值的集合,一个是允许参与的运算。
所谓动态类型语言,是指类型检查发生在运行期间的语言,静态类型语言是类型检查发生在编译期间的语言。
类型的动静与强弱是完全正交的两个概念。前者以类型的绑定时间来划分,后者以类型的约束强度来划分。
通常若类型语言允许一种类型的值隐式转化为另一种类型。
Duck 类型的哲学是:名字不重要,重要的是能力。
欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。