编程范式| 青训营笔记

104 阅读3分钟

为什么需要编程语言

人们需要通过某种方式与电脑“交流”,让它明白人们想要让它达成的目标并完成。这种交流语言一般称为编程语言。

编程语言

1.机器语言(根据机器的不同而不同) 2.汇编语言 3.中级语言(C) 4.高级语言(C++,Java)

此时产生了编译器的概念,编译器会将高级语言转换成汇编语言,再通过汇编语言与计算机“交流”。

C语言

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

C++

面向对象语言代表

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

Lisp

函数式语言代表

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

JavaScript

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

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

编程范式

首先根据程序的语言特性进行分类:是否允许副作用;操作的执行顺序;代码组织;状态管理;语法和词法。

由此,可以将程序范式分成两大类:命令式(程序员如何操作机器改变状态)和声明式(声明结果不管具体操作)。

命令式-面对过程

过程式编程两大特征:自顶向下,结构化编程

自顶向下:将程序分成各个模块,模块由变量和函数组成,变量代表了数据结构,而函数包含了函数和语句。

结构化编程:通过子程序,if结构,dowhile结构代替了原本的goto形式,避免了繁琐的结构

缺点

  • 数据与算法关联性弱(过多函数,差错困难)
  • 不利于修改和扩充(没有封装的概念,一个变量修改需要对无数条语句修改)
  • 不利于代码重用(无组件化,组件中各个参量错综负载)

面向对象编程

  • 封装
  • 继承
  • 多态
  • 依赖注入
  1. 封装:将数据和算法封装到类里,保护它们。
  2. 继承:在无需重写原有函数功能的情况下,对函数进行功能扩充
  3. 多态:不同结构可以进行接口共享,从而达到函数复用
  4. 依赖注入:去除代码耦合

五大原则:

  • 单一职责原则SRP
  • 开放封闭原则OCP
  • 里氏替换原则LSP
  • 依赖倒置原则DIP
  • 接口分离原则ISP

缺点 面向对象编程,它总是会附带着所有它需要的隐含环境,会得到很多与最终目标不相干的东西,过于繁琐

函数式编程

  • 函数是第一
  • 纯函数/无副作用
  • 鼓励使用高阶函数或者闭包解决问题

优势 不依赖于外部环境,也不改变外部环境,参数不应该修改

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

Currying:将重复的参数存入闭包中

Composition: 通过函数自动组合对代码进行优化重写

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

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

Applicative:直接对两个容器进行操作

响应式编程

  • 异步或离散的函数式编程
    • 数据流
    • 操作符
      • 过滤
      • 合并
      • 转化
      • 高阶

Observable:观察者模式,迭代器模式,Promise/EventTarget 超集

操作符:响应式编程的“compose”

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

Monad: 去除嵌套的Observable

领域特定语言

Domain-specific language(DSL):应用于特定领域的语言

  • HTML
  • SQL