编程范式 | 青训营笔记

59 阅读2分钟

编程语言

发展历程:汇编 -> c、c++ -> 高级语言

JavaScript:基于原型和头等函数的多范式语言,具有过程式,面向对象,响应式、函数式等特点

编程语言分为:
  • 机器语言
  • 汇编语言
  • 中级语言(面向过程语言,如C)
  • 高级语言
    • 高级语言具有面向对象代表C++
    • 函数式代表lisp
    • 多范式代表JavaScript

编程范式

面向对象编程特点:

封装、继承、多态、依赖注入等

封装:

将数据和算法分隔开,不直接修改数据

多态:接口复用。

依赖注入:

Snipaste_2023-05-11_22-05-15.png 这个给我的启发很大,给我种“原来js还能这么玩啊”的感觉。

面向对象编程的五大原则:
  • 单一职责原则
  • 开放封闭原则
  • 里式替换原则
  • 依赖倒置原则
面向对象缺点:

总是附带着所有它需要的隐含环境。

你想要一个香蕉,但得到的却是一个大猩猩拿着香蕉,而且还有整个丛林

这个表达的很抽象,但是很贴切。在面向对象编程中,要想用一个工具,那可能先要new出这个对象,然后再调用这个工具,这个对象可大可小,也是真能有带出“整个丛林”的效果。

函数式编程:

不能依赖外部环境,应当把要用的封装在函数内部

优势:

可缓存、可移植、可测试、可推理、可并行。

个人认为闭包很有用,很能体现函数式编程。

a.b != null ? (a.b.c != null ? (a.b.c.d != null ? {a.b.c.d.e : null): null) :null

new Maybe(a).map(prop('b')).map(prop('c')).map(prop('d')).map(prop('e'))

class Maybe{
    constructor(x){
        this.$value = x;
    }
    
    map(fn){
        return this.$value == null ? this : new Maybe(fn(this.$value));
    }
}

我感觉很神奇,竟然能这么写

去除嵌套:
[1, 2].flatMap(() => ([1, 2]))

特定领域语言

  • 语言运行:(创造DLS)

  • 词法解析器

  • 语法解析器 (语法树,树状结构)

  • 遍历

  • 执行