编程范式 | 青训营

155 阅读4分钟

JS多范式语言,灵活度极高

需要根据不同场景在不同范式间自如切换

进一步需要创造领域特定语言抽象业务问题

Programming paradigm

前端框架,基础组件,文档技术等开发与架构

instructions

C:中级语言 过程式语言

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

C++:面向对象

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

Lisp:函数式语言

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

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

  • 过程式
  • 面向对象
  • 函数式
  • 响应式

编程范式

程序语言特性:

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

编程范式分为:

  • 命令式

    • 面向过程
    • 面向对象
  • 声明式

    • 函数式
    • 响应式

过程式编程

算法 + 数据结构 = 程序

函数 + 变量 = 程序

自顶向下

程序:

  • 模块

    • 变量

      • 数据结构
    • 函数

      • 函数
      • 语句

结构化编程:顺序、选择、循环、goto

而面向过程变量与函数关系错综复杂,乱七八糟:

  • 数据与算法关联微弱
  • 不利于修改与扩充
  • 不利于代码复用

OOP

  • 封装

关联数据与算法

  • 继承

无需重写的情况下进行功能扩充(数据and算法

  • 多态

不同结构可以接口共享,总而实现函数复用

  • 依赖注入

去除代码耦合

声明依赖,声明实现,得到注入对象

Inversify.js | Nest.js

OOP五大原则SOLID

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

OOP语言的问题有很多:

面向对象编程是一个极其糟糕的主意,只有加利福尼亚才会产出这种东西

Edsger Dijkstra(图灵奖获得者)

面向对象设计是基于罗马数字进行计算

Rob Pike(Go语言之父)

“面向对象”这个词可以用来指很多东西。其中一半是显而易见的,而另一半是错误的

Paul Graham(美国互联网创业教父)

实现上的继承就跟过度使用goto语句一样,使程序拧巴和脆弱。结果就是,面向对象系统通常需要承受复杂性和难以复用的痛苦

John Ousterhout( Tcl语言之父)

有时,优雅的实现仅仅是一个函数。不是一个方法。不是一个类,不是一个框架。只是一个方法。

John Carmack(id Software的创始人)

面向对象编程语言的问题在于,它总是附带着所有它需要的隐含环境。你想要一个香蕉,但得到的却是一个拿着香蕉的大猩猩,背后是整个丛林。

Joe Armstrong(Erlang语言发明人)

我一度曾经迷恋上了面向对象编程。现在我发现自己更倾向于认为面向对象是一个阴谋,企图毁掉我们的编程乐趣。

Eric Allman(sendmail作者)

FP 函数式编程

  • 函数一等公民
  • 纯函数/无副作用
  • 高阶函数/闭包

ramdajs

  • First Class Functions

聚合转发

  • No Side Effects

  • Lazy Evaluation

  • Statelessness

  • Immutable data

  • Pure Functions

    • 可缓存
    • 可移植
    • 可测试
    • 可推理
    • 可并行

Currying

闭包 参数重复

在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术

Composition

associativity 结合性

map's composition law

Functor

可以当做容器的类型,类型支持对容器内的元素进行操作

常见的functor: Array(Iterable).map, Promise.then

Monad

可以去除嵌套容器的容器类型

常见的monad: Array.flatMap Promise.then

Applicative

直接对两个容器操作

  • Identity
  • Homomorphism
  • Interchange
  • Composition

响应式编程 FRP

异步/离散de函数式编程

  • 数据流

  • 操作符

    • 过滤
    • 合并
    • 转化
    • 高阶

RxJS

Observable

  • 观察者模式
  • 迭代器模式
  • Promise/EventTarget 超集

操作符

RFP的compose:

  • 合并
  • 过滤
  • 转化
  • 异常处理
  • 多播

DSL

Domain-specific language

应用于特定领域的语言

HTML,SQL

区别于General-purpose language如C、C++、JS...

lexer

Parser

LL:从左到右检查,从左到右构建语法树

LR:从左到右检查,从右到左构建语法树