编程范式
01课程介绍
1.前端的主要编程语言为Javascript
2.JavaScript作为一种融合了多种编程范式的语言,灵活性非常高
3.前端开发人员需要根据场景在不同编程范式件自如切换
4.进一步需要创造领域特定语言抽象业务问题
02编程语言
1为什么需要编程语言
人 (instruction)-> 机器
2机器语言
3汇编语言
4高级语言
5C/C++
C:"中级语言"过程是语言代表
- 可对位、字节、地址直接操作
- 代码和数据分离倡导结构化编程
- 功能齐全:数据类型和控制逻辑多样化
- 可移植能力强
C++:面向对象语言代表
- C with Classes
- 继承
- 权限控制
- 虚函数
- 多态
Lisp:函数式语言代表
- 与机器无关
- 列表:代码即数据
- 闭包
JavaScript:基于原型和头等函数的多范式语言
- 过程式
- 面向对象
- 函数式
- 响应式(通过印证函数)
总结
03编程范式
1什么是编程范式
2常见编程范式
3过程式编程
·自顶向下
·结构化编程
4自顶向下
5结构化编程
6JS中的面向过程
Q:面向过程式编程有什么缺点,为什么后面会出现面向对象?
A:数据与算法关联蒻、不利于修改和扩充(即增加新功能)、不利于代码重用(大量之后)
7面向对象编程
封装
关联数据与算法(即将数据和算法封装到一个类里面)
如eg1
继承
让某个类型的对象获得另一个类型对象的属性和方法(按级分类)
无需重写的情况下进行功能扩充
如eg2
多态
相同的方法在不同的情形下有不同的编译方式(雾)
不同的结构可以进行接口共享,进而达到函数复用
依赖注入
去除代码的耦合度
eg1
Class Car{
meter = 200
speed = 100
advance(meter) {
while(this.meter < meter) this.meter = this.speed;
}
getSpec() {
return `meter: ${this.meter}; speed: $(this.speed);`;
}
}
}
调用时
function main() {
var car = new Car();
car advance(2000);
}
eg2.
class FlyCar extends Car {
height = 100 ->新数据
fly(height){
while(this.height < height){
this.height += this.speed ->新算法
}
}
}
eg3.
eg4.
8面向对象编程_五大原则
- 单一职责原则SRP
- 开放封闭原则OCP 模块在扩展性方面是开放的,在更改性方面是封闭的
- 里氏替换原则LSP 子类应该可以替换父类并出现在父类应该出现在的任何地方
- 依赖倒置原则DIP 具体依赖抽象,上层依赖下层
- 接口分离原则 任何时候的依赖要用接口进行区分
Q:面向对象编程有什么缺点?为什么更推荐函数式编程 A:面向对象编程语言的问题在于,他总是附带着所有它所需要的隐含环境。你想要一个香蕉,但得到的确实一个大猩猩拿着香蕉,还有整个丛林
9函数式编程
js推荐函数库:ramdajs
10函数式编程
鼓励纯函数(函数实习不依赖外部环境,不该有副作用)
优势
可缓存
可移植
可测试
可推理
可并行
Currying
组合(手动组合)
Functor
Monad
Applicative(容器之间可以互相操作)
11响应式编程
·异步、离散的函数式编程
·数据流
·操作符
·过滤
·合并
·转化
·高阶
推荐工具库:RxJS e.g
即表格内的数值可以使任意的,我们应该把它看成一个输入输出流,这样的话最后最终就是调用函数求值
Observable
操作符
Monad
04领域特定语言
DSL
右:通用语言 DSL -> 通用, 但通用 X> DSL
1语言运行
2lexer(词法解析器)
SQL Token分类
- 注释
- 关键词
- 操作符
- 空格
- 字符串
- 变量
Paser_语法规则
Paser_LL
LL:从左到右检查,从左到右构建语法树
Paser_LR
LR:从左到右检查,从右到左构建语法树
tools
生成一颗语法树
Visitor