01 课程介绍
课程背景: 1.前端的主要编程语言为JavaScript。 2. JavaScript做为一种融合了多种编程范式的语言,灵活性非常高。 3. 前端开发人员需要根据场景在不同编程范式间自如切换。 4.进一步需要创造领域特定语言抽象业务问题。
课程收益: 1.了解不同编程范式的起源和适用场景。 2.掌握JavaScript在不同的编程范式特别是函数式编程范式的使用。 3.掌握创建领域特定语言的相关工具和模式。
02 编程语言
机器语言
汇编语言:
高级语言:
C/C++
js:
- 基于原型和头等函数的多范式语言
- 过程式
- 面向对象
- 函数式
- 响应式
总结:
03 编程范式
(1)什么是编程范式
(2)常见编程范式
命令式:程序语言如何果操作机器改变状态
- 面向过程:把操作用过程进行分组
- 面向对象:根据操作和对应的状态进行分组
声明式:程序员声明想要的结果,而不指明具体的操作
- 函数式:通过一系列的函数组合来声明逻辑
- 响应式:通过数据流和映射函数来表示结果
(3)过程式编程 特点:
- 自顶向下
- 结构化编程
算法+数据结构=程序
- 把程序分为多个模块
- 结构化编程是过程式编程下的最佳实践
- 替换了传统的goto这种形式
面向过程问题
- 数据与算法关联弱
- 不利于修改和扩充
- 不利于代码重用
(4)面向对象编程 特点:
- 封装
- 继承
- 多态
- 依赖注入
- 封装就是把一些客观的事务封装成具体的类,类可以把自己的数据和方法是让可信的对象来操作,对于不可信的进行一些隐藏
- 一个类就是封装了一些数据和操作这些数据的代码逻辑形式
- 对象对内部数据提供了一些保护,可以防止程序中无关数据的意外改变
- 继承可以让某个类型的对象可以获得另一个类型对象的属性和方法
- 继承可以使用现有类的所有功能,并且可以在无需重写的情况下进行功能扩充
- 一个类实例的相同方法在不同的情景下有不同的表现形式
- 多态允许具有不同内部结构的对象可以共享相同的外部接口,这意味着虽然针对不同对象的具体操作不同,但是可以通过一个公共的类,这些操作可以通过相同的方式来调用
- 从而达到了函数复用的效果
- 依赖注入只在程序运行中需要对另一个对象写入的时候无需在代码中创建被调用者,而是依赖于外部注入,又叫控制反转
- 可以降低代码之间的耦合度
面向对象编程_五大原则
- 单一职责原则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 lSP) 依赖需要通过接口来实现,而不依赖于具体接口的实现
(5)函数式编程 特点:
- 函数是“第一等公民”
- 纯函数/无副作用
- 高阶函数/闭包
- 用纯函数组合来描述计算过程,根据ramda演算,如果一个问题能够用一系列函数组合的算法来描述,那么就说明这个问题是可计算的,就可以用编程语言的函数组合来实现这样的计算过程
- 函数式编程式尽量减少变化的部分,由此让代码逻辑变得更加清晰
- 需要进行包装
- 如果使用一等函数,就可以直接导出
- 不依赖外部的变量
- 函数内部不应该修改参数
- 柯里化利用函数和高阶函数来解决参数重复的问题,并且延迟参数的传递工作
- 组合:来实现复杂的功能
- 容器:原子操作不用考虑异常情况
- 将异常和数据处理逻辑保存在容器中
(6)响应式编程
异步/离散的函数式编程
- 数据流
- 操作符 过滤 合并 转化 高阶
- 响应式编程,数据可以是离散的、异步的
- 但是对于函数式编程中组合中,是同步的数据
04 领域特定语言
领域特定语言需要使用通用语言来实现
词法解析器---(短语)---语法解析器---(语法树,树状结构)---遍历---执行(解释),转为机器语言或者低版本的语言(编译)(代码生成)
词法解析器:把语言切分为有意义的token,通过正则表达式来实现
表达能力强,效率高
- K、1代表从上往下构建的时候需要看的token的数量