编程范式|青训营笔记

123 阅读4分钟

前言

青训营的笔记都是跟着大佬们缝缝补补按自己能理解的部分进行浅梳理总结的,自用笔记,顺便打卡

  1. JavaScript做为一种融合了多种编程范式的语言,灵活性非常高
  2. 前端开发人员需要根据场景在不同编程范式间自如切换

一、编程语言

  • 机器语言:二进制
  • 汇编语言:使用助记符来代替二进制代码
  • 中级语言:可移植的高级语言,比高级语言快,比机器语言易于编写【C】
  • 高级语言:【C++,JS,Lisp(函数式语言)】

JS特点:弱类型、解释型语言、基于原型和头等函数的多范式语言

多范式:过程式、面向对象、函数式、响应式

二、编程范式

a.命令式:1.面向过程、2.面向对象

b.声明式:3.函数式、4.响应式

1过程式:

自顶向下

697f285e3889e280ce9878532b86d3a.png

结构化编程

3fb9bf604d76c9cdc9b81924e0f3c07.png

结构化编程的优点在于:代码清晰、可维护性高、可扩展性强

js中的过程式编程

ES6的模块化方案和CommonJS都是JavaScript中常见的模块化方案,它们都支持导入和导出模块的功能,但是在具体的语法和使用方式上有所不同。 ES6使用import和export关键字来导入和导出模块 CommonJS使用require和module.exports来导入和导出模块

缺点:数据与算法关联弱、不利于修改和扩充、不利于代码重用,继而转向面向对象

2面向对象:

特点:封装 继承 多态 依赖注入

封装:将数据和行为封装在一个对象中,通过访问控制来保护对象的数据和行为,防止外部对象直接访问和修改

继承:无需重写的情况下进行功能扩充【super关键字】

多态:不同的结构可以进行接口共享,进而达到函数复用

定义一个printInfo函数,用于打印对象的信息。这个函数接受一个Person或Student对象作为参数,根据对象的类型,打印不同的信息。在函数中,使用instanceof关键字,判断对象的类型,便实现了多态

依赖注入:【Dependency Injection,简称DI】

目的是为了解耦合,使得代码更加灵活、可扩展和可维护

0958d4009ed856025a05f3021e9b577.png

通常:在类内部创建和管理依赖的对象,这样会导致代码的耦合性很高,一旦依赖的对象发生变化,就需要修改大量的代码,导致代码的可维护性很差。

依赖注入:将依赖的对象从类内部移动到类的外部,在类的构造函数或者方法中注入依赖的对象。

面向对象编程五大原则:

  • 单一职责原则SRP(Single Responsibility Principle)
  • 开放封闭原则OCP(Open-Close Principle)【对扩展开放,对修改关闭】
  • 里式替换原则LSP(the Liskov Substitution Principle LSP)【透明地使用子类的对象】
  • 依赖倒置原则DIP(the Dependency Inversion Principle DIP)【依赖于抽象】
  • 接口分离原则ISP(the Interface Segregation Principle ISP)

3函数式编程

特点:

  • 函数是"一等公民"、纯函数/无副作用、高阶函数跟闭包;
  • 可缓存、可移植、可测试、可推理、可并行

函数柯里化:

  • 在函数式编程中,我们其实往往希望一个函数处理的问题尽可能的单一,而不是将一大堆的处理过程交给一个函数来处理
  • 那么我们是否就可以将每次传入的参数在单一的函数中进行处理,处理完后在下一个函数中再使用处理后的结果

只传递给函数一部分参数来调用它,让它返回另一个函数处理剩下的参数

//正常结构
function add(x,y,z){
    return x+y+z
}

//柯里化
function sum(x){
    return function(y){
        return function(z){
            return x+y+z
        }
    }
}

//简化柯里化代码
var sum2 = x=>y=>z=>{
    return x+y+z 
}
//还能再次简化var sum2 = x=>y=>z=>x+y+z

组合函数:

针对某一数据,需要两个函数依次调用,将其合成一个函数,方便使用

function double(num){
    return num*2
}
​
function square(num){
    return num**2//平方
}
​
var count = 10
var result = square(double(count))
console.log(result);
​
//将double和square结合起来,实现简单的组合函数
function composeFn(m,n){
    return function(count){
        return n(m(count))
    }
}
​
var newFn = composeFn(double,square)
console.log(newFn(10));

容器式编程:

4响应式编程

观察者模式、迭代器模式

1fd5485ab39d4e5e2102698617f7d2f.png

总结

034ed7b78d3e6a7e6196833a76cff20.png

三、领域特定语言构建

Lexer:

9f756ff2a359148c52448fb7d17ee71.png

38a715371e50ed2917b261705d7237d.png

Parse语法规则:

上下文无关语法规则、LL:从右到左检查构建语法树、LR:从左到右检查构建语法树

tools:利用语法分析工具

e75c73ae8d0be5c1a86759fcbda495c.png

vositor:解释和编译

f30cab90463caf4871c8e13f94a0b7b.png

四课程总结

3767593d9f804a18fe3fb74a51391df.png