编程范式
面向对象编程
特点
- 封装 将数据和算法封装到一个类中去
- 继承 某一个对象可以继承另一个类的方法,扩充而不需要改变原有类
- 多态 接口、函数复用
- 依赖注入 也叫控制反转,降低计算机代码间的耦合度(需要用到库inversify.js, Nest.js)
五大原则
- 单一职责原则SRP
- 开放封闭原则 OCP
- 里式替换原则LSP
- 依赖倒置原则DIP
函数式编程
first class function
聚合转发
pure fiction
- 可缓存
- 可移植
- 可测试
- 可推理
- 可并行
currying
composition
- 对代码可以进行优化重写
functor
- 可以当作容器的类型,类型支持对容器内元素进行操作
- 常见的functor:Array.map, Promise.then
- 把一些值是否为null及其处理放到容器中去处理
Monad
- 可以去除嵌套容器的容器类型
- 常见:Array.flatMap, Promise.then
- 打瓶操作(?),返回值仅一个容器,而不会嵌套
Applicative
- 直接对两个容器直接操作
响应式编程
- 异步/离散的函数式编程
- 数据流,操作符
Observable
- 观察者模式
- 迭代者模式
- 观察者订阅发布者,发布者推送数据给观察者
操作符
- 数据流管道中的操作过程
- 例如:pipe的过程中会把嵌套去除
领域特定语言
- 什么是领域特定语言?
- DSL(domain- specific Language)应用于特定领域的语言,例如HTML,SQL等,与general language例如Java和C++相对
- 步骤:lexer词法解析器,parser语法解析器(得到树状结构),遍历
Lexer词法解析器
- 把字符串解析成有意义的token
Parser_LL
- LL:从左到右检查,从左到右构建语法树
- 自顶向下的函数调用
Parser_LR
- 从左到右检查,从右到左构建语法树
- 效率高,表达能力弱一点(?)
tools
- 工具辅助
visitor
- 遍历操作,解析语法树并运行
个人感受
这一章真的很抽象……比如之前看到js里的语法,构建函数的方法就很发怵,现在知道这些事遵循了一些法则但是并不知道实际运用的时候会怎么处理,唉,继续加油实践吧。(编程语言部分的笔记好像遗失了。。well反正理解高级(中级)语言、汇编语言、机器语言就行)