编程范式|青训营笔记

93 阅读3分钟

课程知识:编程范式

前端主要编程语言: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