课程知识:编程范式
前端主要编程语言:JavaScript
编程语言发展历程
机器语言——汇编语言——中级语言——高级语言
中级语言:
- C(过程式语言代表)
高级语言:
-
C++(面向对象语言代表)
-
Lisp(函数式语言代表)
-
JavaScript(基于原型和头等函数的多范式语言)
什么是编程范式
程序语言特性
- 是否允许副作用
- 操作的执行顺序
- 代码组织
- 状态管理
- 语法和词法
种类
分为命令式:面向过程、面向对象和声明式:函数式、响应式
过程式:需要自顶向下、结构化编程:使用顺序结构、选择结构、循环结构
问题:数据与算法关联性弱、不利于修改与扩充、不利于代码重用
面向对象:封装(数据与算法关联)、继承(无需重写下进行功能扩充)、多态(不同的结构可以进行接口共享,达到函数复用)、依赖注入(去除代码耦合)
面向对象编程的五大原则:
- 单一职责原则
- 开放封闭原则
- 里式替换原则
- 依赖倒置原则
- 接口分离原则
函数式编程
推荐:函数式编程——纯函数/无副作用/高阶函数/闭包
一等函数(First-class Function)
可以用变量命名 可以提供给过程作为参数 可以由过程作为结果返回 可以包含在数据结构中
纯函数(pure function)
same arguments, same returns no side effects
优势:可缓存、可移植、可测试、可推理、可并行
柯里化(Currying)
柯里化(Currying)是一种处理多元函数的方法。它产生一系列连锁函数,其中每个函数固定部分参数,并返回一个新函数,用于传回其它剩余参数的功能。
优势:
- 语义更加清晰
- 可复用性更高
- 可维护性更好
- 作用域局限,副作用少
组合(Composition)
将多个函数的能力合并,创造一个新的函数。compsoe函数可以接受任意的参数,所有的参数都是函数,且执行方向是自右向左的,初始函数一定放到参数的最右面。
函子(Functor)
函子是用来将两个范畴关联起来的。一般约定,函子的标志就是容器具有map方法。该方法将容器里面的每一个值,映射到另一个容器。并且需要满足下面两个条件:
fx.map(f).map(g) == fx.map(x => g(f(x)))
fx.map(x => x) == fx;
单子(Monad)
单子(Monad)是一种将函子组合应用的方法,一个 Monad 就是拥有of以及chain函数的对象。 Chain 类似于 map只不过它会扁平化最终求得的嵌套式结果。Monad 要满足的一些定律如下:
Left identity: M.of(a).chain(f) === f(a)
Right identity: m.chain(M.of) === m
Associativity: m.chain(f).chain(g) === m.chain(x => f(x).chain(g))
应用函子(Applicative)
Applicative由三部分组成:
一个类型构造函数f –例如 List、Maybe 一个函数pure : a -> f a,其中a可以是任何类型(包括函数类型) 一个函数apply(<*>) : f (a -> b) -> f a -> f b,其中a和b可以是任何类型(包括函数类型)
参考链接:
zhuanlan.zhihu.com/p/108594470…
响应式编程
数据流
操作符:合并、过滤、转化、异常处理、多播
Monad:去除嵌套的Observable
Observable:观察者模式、迭代器模式
领域特定语言
领域特定语言(英语:domain-specific language、DSL)指的是专注于某个应用程序领域的计算机语言。如sql、html
创建过程:
lexer:词法分析器
parser:编译器
tools
visitor