编程范式

108 阅读3分钟

编程语言

C语言 【中级语言】

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

C++

  • 继承
  • 虚函数
  • 多态

JavaScript

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

多范式代表

编程范式

程序语言特性

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

编程范式

  • 命令式

    侧重于程序员如何操作机器改变机器状态

    • 面向过程

      把操作用过程进行分组
      • 自顶向下
      • 结构化编程 使用顺序结构、选择结构和循环结构代替goto
      • JS面向过程
      • 问题
        • 数据和算法关联弱
        • 不利于修改和扩充
        • 不利于代码的重用
    • 面向对象

      根据操作和它对应的状态进行分组,外部不能直接操作数据项,限制数据的访问
      • 封装
      • 继承
      • 多态 不同的结构可以接口共享,进而达到函数复用【覆盖基类的接口】
      • 依赖注入 不用在类定义时创建对象,而是使用依赖注入方式。耦合特定实现->声明依赖 声明实现 得到注入对象【Inversify.js | Nest.js】
      • 五大原则
        • 单一职责原则
        • 开放封闭原则
        • 里氏替换原则
        • 依赖倒置原则
        • 接口分离原则
      • 问题 无法进行细功能的功能导入

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

  • 声明式

    声明想要的结果而不是操作【声明“我需要什么”而不考虑如何得到】SQL就是声明式的语言

    • 函数式编程【ramdajs】

      通过一系列的函数声明逻辑,尽量减少变化的部分,使代码逻辑更清晰

      • 聚合转发 一等函数
      • 纯函数【不依赖外部环境,不应该修改参数,通过返回新对象表达函数功能】
        • 可缓存
        • 可移植
        • 可测试
        • 可推理
        • 可并行
      • Currying 【闭包,高阶函数】
      • 使用函数组合【手动组合/自动组合(数据从右往左流入,处理后返回)】
        • 交换律
        • 结合律
      • Functor 不用考虑异常情况 将特殊情况的处理封装至容器中
        • Array
        • Promise
      • Monad
        • 去除嵌套容器的容器类型
        • Array.flatMap Promise.then
      • Applictive
        • 直接对两个容器直接操作
    • 响应式

      通过数据流和映射函数表示结果,没有纯粹的响应式编程语言,需要借助工具库(RxJS)

      • 数据流
      • 操作符
        • 合并
        • 过滤
        • 转化
        • 异常处理
        • 多播
      • Observable Promise EventTarget 超集
      • Monad

领域语言

  • 语言运行

    • 词法解析
      • token分类
    • 语法解析
      • 语法规则(推导式)
      • LL 从左到右检查 从左到右构建语法树
      • LR 从左到右检查,从右到左构建语法树
    • 遍历语法树【执行或转换成其他语言(编译)】