编程范式 | 青训营笔记

128 阅读3分钟

编程语言:

机器语言
汇编语言
中级语言——面向过程代表——C
高级语言——面向对象代表——C++
       ——函数式代表——lisp
       ——多范式代表——javascript

面向过程的问题:

数据与算法关联弱;
不利于修改和补充;
不利于代码重用;

面向对象——依赖注入(代码反转)可以去除代码耦合度

依赖注入前: Pasted Graphic 76.png

依赖注入后: Pasted Graphic 77.png 当需要修改car这个类的内容时,直接调整声明实现的内容即可,无需对car这个类进行操作

可以使用Inversify.js 和Nest.js这两种库来达到依赖注入的特性

面向对象编程——五大原则

单一职责原则SRP(Single Responsibility Principle):一个类的功能要单一,不能包罗万象;

开放封闭原则OCP(Open-Close Principle):一个模块在扩展性方面应该是开放的,在更改性方面应该是封闭的;

里式替换原则LSP(the Liskov Substitution Principle LSP):子类应该可以替换父类,并出现在父类应该出现的任何地方;

依赖倒置原则DIP(the Dependency Inversion Principle DIP):具体依赖抽象,上层依赖下层;举例:假设B是较A低的一个模块,B需要使用A的某功能,此时B不应该直接使用A中具体的类,而是应该由B定义一个抽象接口,由A来实现这个抽象接口,B去依赖这个抽象接口,这样就达到了依赖倒置的目的,B解决了对A的依赖,这样想替换A的时候就可以随时替换,只要实现这个接口就可以,并不会影响B的功能;

接口分离原则ISP(the Interface Segregation Principle ISP):对依赖倒置原则抽象化的一个原则,即任何时候依赖要通过接口进行区分,不要依赖于具体类的实现。

函数式编程

函数是“第一等公民”

纯函数/无副作用:优势:可缓存、可移植、可测试、可推理、可并行

高阶函数/闭包:currying,将常用的参数闭包处理

Functor:可以当作容器的类型,类型支持对容器内元素进行操作。常见的functor:Array、Promise

Monad:可以去除嵌套容器的容器类型。常见Monad:Array、Promise

Applicative:直接对两个容器直接操作

响应式编程:异步/离散的函数式编程,包括数据流和操作符

Observable:观察者模式、迭代器模式、Promise/EventTarget超集(前端的类比模式,结合了观察者和迭代器模式)

操作符:合并、过滤、转化、异常处理、多播

Monad:去除嵌套的Observable

语法规则

  • 推导式:表示非终结符到(非终结符或终结符)的关系。
  • 终结符:构成句子的实际内容。可以简单理解为词法分析中的token。
  • 非终结符:符号或变量的有限集合。它们表示在句子中不同类型的短语或子句。

在具体的语法分析中,有两种方式:

一、LL:从左到右检查,从左到右构建语法树

二、LR:从左到右检查,从右到左构建语法树。特点是构建能力强、表达效率高

表达能力排序(k和1表示当我们构建语法节点时,需要往下看的token的数量)