编程范式 | 青训营笔记

83 阅读3分钟

编程范式

01课程介绍

1.前端的主要编程语言为Javascript
2.JavaScript作为一种融合了多种编程范式的语言,灵活性非常高
3.前端开发人员需要根据场景在不同编程范式件自如切换
4.进一步需要创造领域特定语言抽象业务问题

02编程语言

1为什么需要编程语言

人 (instruction)-> 机器 

2机器语言

image.png

3汇编语言

image.png

4高级语言

image.png

5C/C++

C:"中级语言"过程是语言代表

  • 可对位、字节、地址直接操作
  • 代码和数据分离倡导结构化编程
  • 功能齐全:数据类型和控制逻辑多样化
  • 可移植能力强

C++:面向对象语言代表

  • C with Classes
  • 继承
  • 权限控制
  • 虚函数
  • 多态

image.png

Lisp:函数式语言代表

  • 与机器无关
  • 列表:代码即数据
  • 闭包

image.png

JavaScript:基于原型和头等函数的多范式语言

  • 过程式
  • 面向对象
  • 函数式
  • 响应式(通过印证函数)

总结

image.png

03编程范式

1什么是编程范式

image.png

2常见编程范式

image.png

3过程式编程

·自顶向下
·结构化编程

4自顶向下

image.png

5结构化编程

image.png

6JS中的面向过程

image.png

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.

image.png

eg4.

image.png

8面向对象编程_五大原则

  • 单一职责原则SRP
  • 开放封闭原则OCP 模块在扩展性方面是开放的,在更改性方面是封闭的
  • 里氏替换原则LSP 子类应该可以替换父类并出现在父类应该出现在的任何地方
  • 依赖倒置原则DIP 具体依赖抽象,上层依赖下层
  • 接口分离原则 任何时候的依赖要用接口进行区分

Q:面向对象编程有什么缺点?为什么更推荐函数式编程 A:面向对象编程语言的问题在于,他总是附带着所有它所需要的隐含环境。你想要一个香蕉,但得到的确实一个大猩猩拿着香蕉,还有整个丛林

9函数式编程

image.png

js推荐函数库:ramdajs

10函数式编程

image.png

鼓励纯函数(函数实习不依赖外部环境,不该有副作用)
优势
    可缓存
    可移植
    可测试
    可推理
    可并行

image.png

Currying

image.png

组合(手动组合)

image.png

Functor image.png

Monad image.png

Applicative(容器之间可以互相操作)

image.png

11响应式编程

·异步、离散的函数式编程
    ·数据流
    ·操作符
        ·过滤
        ·合并
        ·转化
        ·高阶

推荐工具库:RxJS e.g

image.png 即表格内的数值可以使任意的,我们应该把它看成一个输入输出流,这样的话最后最终就是调用函数求值

Observable

image.png

操作符

image.png

Monad

image.png

04领域特定语言

DSL

image.png

右:通用语言 DSL -> 通用, 但通用 X> DSL

1语言运行

image.png

2lexer(词法解析器)

SQL Token分类

  • 注释
  • 关键词
  • 操作符
  • 空格
  • 字符串
  • 变量

image.png

image.png

Paser_语法规则

image.png Paser_LL LL:从左到右检查,从左到右构建语法树

image.png Paser_LR LR:从左到右检查,从右到左构建语法树

image.png

tools

image.png 生成一颗语法树

Visitor

image.png

05总结

image.png