编程范式 | 青训营笔记

79 阅读3分钟

Programming Paradigm

背景

  • 前端的主要编程语言为 JavaScript。
  • JavaScript 作为一种融合多种编程范式的语言,灵活性非常高。
  • 前端开发人员需要根据场景在不同编程范式间自如转换。
  • 进一步需要创造领域特定语言抽象业务问题。

目的

  • 了解不同编程范式的起源和适用场景。
  • 掌握 JavaScript 在不同的编程范式特别是函数式编程范式的使用。
  • 掌握创建领域特定语言的相关工具和模式。

编程语言

人需要指令告诉计算机应该做什么,通常把这种指令称为编程语言。

部分语言介绍

C:“中级语言”过程式语言代表

  • 可对位、字节、地址直接操作
  • 代码和数据分离倡导结构化编程
  • 功能齐全:数据类型和控制逻辑多样化
  • 可移植能力强

C++:面向对象语言代表

  • C With Classes
  • 继承
  • 权限控制
  • 虚函数
  • 多态

Lisp:函数式语言代表

  • 与机器无关
  • 列表:代码即数据
  • 闭包

JavaScript:基于原型和头等函数的多范式语言

  • 过程式

  • 面向对象

  • 函数式

  • 响应式

  • 机器语言(二进制)

  • 汇编语言

  • 中级语言(C,面向过程)

  • 高级语言

    • C++,面向对象
    • lisp,函数式
    • javascript,多范式

编程范式

程序语言特性

  • 是否允许副作用
  • 操作的执行顺序
  • 代码组织
  • 状态管理
  • 语法和词法

命令式

  • 面向过程编程
  • 面向对象编程

声明式

  • 函数式编程
  • 响应式编程

面向过程编程

  • 自顶向下
  • 结构化编程(顺序结构、选择结构、循环结构)
  • 数据与算法关联弱、不利于修改和扩充、不利于代码调用

面向对象编程

  • 封装(关联数据与算法)
  • 继承(无需重写 class 进行功能扩充)
  • 多态(不同结构可以进行接口共享,进而达到函数复用)
  • 依赖注入(去除代码耦合)

面向对象编程的五大原则

  • 单一职责原则,SRP(Single Responsibility Principle) 一个类的功能应该保持单一
  • 开放封闭原则,OCP(Open-Close Principle) 开放扩展性,封闭更改性
  • 里式替换原则,LSP(the Liskov Substitution Principle) 子类可以替换父类,并出现在父类应该出现的任意位置
  • 依赖倒置原则,DlP(the Dependency Inversion Principle)
  • 接口分离原则,ISP(the Interface Segregation Principle)

函数式编程

  • 函数是“第一等公民”

  • 纯函数 / 无副作用

  • 高阶函数 / 闭包

  • First Class Function(聚合转发)

  • Pure Function(可缓存、可移植、可测试、可推理、可并行)

  • Currying

  • Composition

  • Functor

  • Monad

  • Applicative

响应式编程

  • 异步 / 离散的函数式编程
    • 数据流
    • 操作符(compose)
      • 过滤
      • 合并
      • 转化
      • 高阶
      • 异常处理
      • 多播
  • Observable(观察者模式、迭代者模式、Promise / EventTarget 超集)
  • Monad

领域特定语言

  • DSL(Domain-specific language,应用于特定领域的语言)
    • HTML
    • SQL
  • General-purpose language(通用语言)
    • C / C++
    • JavaScript
    • ...

语法规则

  • 上下文无关语法规则
    • 推导式:表示 非终结符 到 非终结符 / 终结符 的关系
    • 终结符:构成句子的实际内容,可简单理解为词法分析中的 token
    • 非终结符:符号或变量的有限集合,表示在句子中不同类型的短语或子句
  • LL(从左到右检查,从左到右构建语法树)
  • LR(从左到右检查,从右到左构建语法树)

附录