编程范式 | 青训营笔记
课件内容
- 课程介绍
- 编程语言
- 编程范式
- 领域特定语言
课程介绍
JavaScript 是一种广泛用于客户端和服务器端编程的脚本语言。它通常用于网页开发,可以与HTML和CSS一起使用以实现动态效果和交互性。
课程收益
- 了解不同编程范式的起源和适用场景
- 掌握 JavaScript 在不同的编程范式特别是函数式编程范式的使用
- 掌握创建领域特定语言的相关工具和模式
为什么需要编程语言
编程语言是用来描述计算机程序的一种人工语言。计算机只能理解机器语言,而编程语言可以将人类的思维转化为计算机可以理解的语言,并指示计算机执行一些任务。使用编程语言,可以让程序员写出各种应用程序、网站、游戏等软件,实现人类想象中各种场景的自动化处理和交互。因此,编程语言是现代计算机软件开发的必要基础。
编程语言
- 机器语言
- 机器语言是一种由二进制数字组成的计算机程序语言,它是计算机硬件直接执行的编程语言,与人类通常使用的自然语言和高级编程语言不同。
- 汇编语言
- 汇编语言是一种低级编程语言,通常用于计算机硬件或操作系统的底层编程。它将机器指令和数据指令转换为容易理解和使用的助记符,使程序员可以更方便地控制计算机的底层操作。
- 高级语言
- 高级语言是一种类似于数学语言或人语的自然语言,不依赖于计算机硬件,程序具有通用性。我们所使用的C语言就是高级程序设计语言的一种。
C/C++
C
"中级语言" 过程式语言代表
- 可对位,字节、地址直接操作
- 代码和数据分离倡导结构化编程
- 功能齐全:数据类型和控制逻辑多样化
- 可移植能力强
C++
面向对象代表
- C with Classes
- 继承
- 权限控制
- 虚函数
- 多条
Lisp
函数式语言代表
- 与机器无关
- 列表:代码即数据
- 闭包
JavaScript
基于原型和头等函数的多范式语言
- 过程式
- 面向对象
- 函数式
- 响应式
小结
编程范式
什么是编程范式
程序语言特性
- 是否允许副作用
- 操作的执行顺序
- 代码组织
- 状态管理
- 语法和词法
常见编程范式
编程范式
- 命令式
- 面向过程
- 面向对象
- 声明式
- 函数式
- 响应式
过程式编程
- 自顶向下
-
结构化编程
- 顺序结构
- 选择结构
- 循环结构
面向过程的问题
- 数据与算法关联弱
- 不利于修改和扩充
- 不利于代码重用
面向对象编程
- 封装
- 关联数据与算法
- 继承
- 无需重写的情况下进行功能扩充
- 多态
- 不同的结构可以进行接口共享,进而达到函数复用
- 依赖注入
- 去除代码耦合
面向对象五大原则
- 单一职责原则 SRP
- 规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分,提出对象不应该承担太多职责,如果一个对象承担了太多的职责,至少存在以下两个缺点:
- 一个职责的变化可能会削弱或者抑制这个类实现其他职责的能力
- 当客户端需要该对象的某一个职责时,不得不将其他不需要的职责全都包含进来,从而造成冗余代码或代码的浪费
- 优点
- 降低类的复杂度。一个类只负责一项职责,其逻辑肯定要比负责多项职责简单得多
- 提高类的可读性。复杂性降低,自然其可读性会提高
- 提高系统的可维护性。可读性提高,那自然更容易维护了
- 变更引起的风险降低。变更是必然的,如果单一职责原则遵守得好,当修改一个功能时,可以显著降低对其他功能的影响
- 规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分,提出对象不应该承担太多职责,如果一个对象承担了太多的职责,至少存在以下两个缺点:
- 开放封闭原则 OCP
- 软件实体(类、模块、函数等等)应该是可以扩展的,但是不可修改的
- 对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况
- 对修改封闭,意味着一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改
- 里式替换原则 LSP
- 核心思想就是在程序当中,如果将一个父类对象替换成它的子类对象后,该程序不会发生异常
- 优点
- 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性
- 提高代码的重用性
- 子类可以形似父类,但又异于父类
- 子与父的不同
- 提高代码的可扩展性
- 提高产品或项目的开放性
- 缺点
- 继承是侵入性的
- 降低代码的灵活性
- 增强了耦合性
- 依赖倒置原则 DIP
- 高层模块不应该依赖低层模块,两者都应该依赖其抽象
- 抽象不应该依赖细节
- 细节应该依赖抽象
- 接口分离原则
- 使用方不应该依赖于它不使用的方法
面向对象问题
总是附带着所以需要的隐含环境
函数式编程
- 函数是"第一等公民"
- 纯函数/无副作用
- 高阶函数/闭包
优势
- 可缓存
- 可移植
- 可测试
- 可推理
- 可并行
Functor
可以当做容器的类型,类型支持对容器内元素进行操作
Monad
可以去除嵌套容器的容器内容
Applicative
直接对两个容器直接操作
响应式编程
- 异步/离散的函数式编程
- 数据流
- 操作符
- 过滤
- 合并
- 转化
- 高阶
Observable
- 观察者模式
- 迭代器模式
- Promise/EventTarget 超集
操作符
响应式编程的"compose"
- 合并
- 过滤
- 转化
- 异常处理
- 多播
Monad
去除嵌套的 Observable
领域特定语言
什么是领域特定语言
- DSL:应用于特定领域的语言,例如
- HTML
- SQL
Lexer
SQL Token 分类
- 注释
- 关键字
- 操作符
- 空格
- 字符串
- 变量
Parser 语法规则
- 上下文无语法规则
- 推导式
- 表示 非终结符 到(非终结符或终结符)的关系
- 终结符
- 构成句子的实际内容,可以简单理解为词法分享中的token
- 非终结符
- 符合或变量的有限集合,它们表示在句子中不同类型的短语或子句
- 推导式
- LL
- 从左到右检查,从左到右构建语法树
- LR
- 从左到右检查,从右到左构建语法树