编程范式 | 青训营笔记

101 阅读3分钟

编程范式

编程语言

机器语言

汇编语言

高级语言

C/C++

C:“中级语言”过程式语言代表 可对位,字节,地址直接操作 代码和数据分离倡导结构化编程 功能齐全:数据类型和控制逻辑多样化 可移植能力强

C++:面向对象语言代表 C with Classes 继承 权限控制 虚函数 多态

Lisp

LISP:函数式语言代表 与机器无关 列表:代码即数据 闭包

JavaScript

基于原型和头等函数的多范式语言 过程式 面向对象 函数式 响应式*

总结

编程范式

什么是编程范式

常见编程范式

过程式编程

自顶向下

结构化编程

自顶向下

结构化编程

JS中的面向过程

面向过程

面向过程问题

数据与算法关联弱

不利于修改和扩充

不利于代码重用

面相对象编程

封装

继承

多态

依赖注入*

面向对象编程_封装

关联数据与算法

面向对象编程_继承

无需重写的情况下进行功能扩充

面向对象编程_多态

不同的结构可以进行接口共享,进而达到函数复用

面向对象编程_依赖注入

去除代码耦合

面向对象编程_五大原则

单一职责原则SRP(Single Responsibility Principle) 开放封闭原则OCP(Open-Close Principle) • 里式替换原则LSP(the Liskov Substitution Principle LSP) • 依赖倒置原则DIP(the Dependency Inversion Principle DIP) • 接口分离原则ISP(the Interface Segregation Principle ISP)

函数式编程

纯函数/无副作用

高阶函数/闭包

函数式编程_First Class Function

函数式编程_Pure Function

优势 可缓存 可移植 可测试 可推理 可并行

函数式编程_Currying

函数式编程_Composition

associativity: compose(f, compose(g, h)) === compose(compose(f, g), h); map's composition law: compose(map(f), map(g)) === map(compose(f, g));

函数式编程_Functor

可以当做容器的类型,类型支持对容器内元素进行操作 常见的 functor:Array (Iterable).map, Promise.then

函数式编程_Monad

可以去除嵌套容器的容器类型 常见 monad: Array.flatMap Promise.then

函数式编程_Applicative

直接对两个容器直接操作

Identity: Maybe(id).ap(v) === v; Homomorphism: Maybe(f).ap(Maybe(x)) === Maybe(f(x)); Interchange: v.ap(Maybe(x)) === Maybe(f => f(x)).ap(v); Composition: Maybe(compose).ap(u).ap(v).ap(w) === u.ap(v.ap(w));

响应式编程

异步/离散的函数式编程

数据流

操作符 ​ 过滤 ​ 合并 ​ 转化 ​ 高阶

响应式编程_Observable

观察者模式

迭代器模式

Promise/EventTarget 超集*

响应式编程_操作符

响应式编程的"compose"

合并 ​ 过滤 ​ 转化 ​ 异步处理 ​ 多播

响应式编程_Monad

去除嵌套的Observable

总结

领域特定语言

什么是领域特定语言

lexer

SQL Token分类 注释 操作符 空格 字符串 变量

Parser_语法规则

上下文无关语法规则

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

Parser_LL

LL:从左到右检查,从左到右构建语法树select name from user

Parser_LR

LR:从左到右检查,从右到左构建语法树select name from userLL(K) > LR(1) > LL(1)

tools

exp ::= exp '+' exp exp ::= exp '*' exp exp ::= 'NUMBER'

npx kison –m llk –g grammar.js –o cal.js

visitor

课程总结

附录

• 函数式编程 • mostly-adequate.gitbook.io/mostly-adeq…ramdajs.com/rxjs.dev/ • 创建 DSL parser 工具 • pegjs.org/github.com/antlr/antlr…github.com/yiminghe/ki…