《冒号课堂:编程范式与OOP思想》之编程范式笔记

《冒号课堂:编程范式与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 类型的哲学是:名字不重要,重要的是能力。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据