vue3设计与实现-框架设计的基本概念

108 阅读5分钟

编程范式

针对于目前的前端开发而言,主要存在两种 编程范式,这两种范式一般是相对来说的。

  1. 命令式编程
  2. 声明式编程

命令式编程

那么首先我们先来说什么叫做命令式

具体例子:

张三的妈妈让张三去买酱油

那么张三怎么做呢?

  1. 张三拿起钱
  2. 打开门
  3. 下了楼
  4. 到商店
  5. 拿钱买酱油
  6. 回到家

以上的流程详细的描述了,张三在买酱油的过程中,每一步都做了什么。那么这样一种:详细描述做事过程 的方式就可以被称为 命令式

那么如果把这样的方式放到具体的代码实现之中,又应该怎么做呢?

我们来看一下这样的一个事情:

在指定的div中展示”hello world“

//html 部分
<div id="app"></div>
//js 部分
//获取div
const divEle=document.querySelector('#app')
//为该div设置innerHTMl为hello world
divEle.innerHTML="hello world"

改代码虽然只有两步,但是它清除的描述了:完成这件事情,所需要经历的过程

那么假设我们所做的事情,变得更加复杂了,则整个过程也会变得更加复杂。

比如:

为指定的的div的子元素的子元素p标签,展示变量msg

那么通过命令式完成以上功能,则会得出如下逻辑与代码:

//html 部分
<div id="app">
  <div>
  <p></p>
  </div>
</div>
//js部分
// 1.获取到第一层的 div
const divEle=document.querySelector('#app')
// 2. 获取它的子 div
const subDivEle=divEle.querySelector('div')
// 3. 获取第三层的 p
const subPEle=subDivEle.querySelector('p')
// 4. 定义变量msg
const msg='hello world'
// 5. 为该 p 元素设置innerHtML 为 hello world
subPEle.innerHtML=msg

那么通过以上的例子,相信大家可以对命令式的概念有了一个基础的认识。

最后做一个总结,什么叫做命令式呢?

命令式是:关注过程的一种编程范式,他描述了完成一个功能的详细逻辑与步骤

声明式编程

针对于声明式而言,大家其实都是非常熟悉的了。

比如以下代码,就是一个典型的声明式

<div>{{msg}}</div>

对于这个代码,大家是不是感觉有些熟悉?

没错就是vue中非常常见的双大括号语法。所以当我们写vue模板语法的时候、其实一直写的就是声明式编程。

那么声明式编程具体指的是什么意思呢?

还是已刚才的例子为例:

张三的妈妈让张三去买酱油

那么张三怎么做呢?

  1. 张三拿起钱
  2. 打开门
  3. 下了楼
  4. 到商店
  5. 拿钱买酱油
  6. 回到家

在这个例子中,我们说:张三所做的事情就是命令式,那么张三的妈妈所做的就是事情就是声明式

在这样的一个事情中,张三妈妈只是发布了一个声明,她并不关系张三如何去买的酱油,只是关心最后的结果。

所以说,所谓的声明式指的是:不关注过程,只关注结果的范式。

同样,如果我们通过代码来进行表示的话,以下例子:

为指定的的div的子元素的子元素p标签,展示变量msg

<div id="app">
  <div>
  <p>{{msg}}</p>
  </div>
</div>

再这样的代码中,我们完全不关心 msg 是怎么渲染到 p 标签的,我们所关心的只是:在 p 标签中,渲染指定文本而已。

最后做一个总结,什么叫做声明式呢?

声明式是:关注结果的一种编程范式,它并不关心完成一个功能的详细逻辑与步骤。(注意:这并不意味着声明式不需要过程!声明式只是把过程进行了隐藏而已!)

命令式vs声明式

在我们了解了命令式与声明式之后,对比这两种编程范哪一种比较好?

通常情况下,我们评价一个编程范式通常会从两个方面入手:

  1. 性能
  2. 可维护性

那么接下来我们就通过这两个方面,来分析一下命令式和声明式。

性能

性能一直是我们在进行项目开发时特别关注的方向,那么我们通常如何来表述一个功能的性能好坏呢?

我们来看一个例子:

为指定 div 设置文本为 "hello world"

那么针对于这个需求而言,最简单的代码就是:

div.innerText="hello world" //耗时为1

你应该找不到比这个更简单的代码实现了。

那么此时我们把这个操作的耗时比作:1。(ps:耗时越少,性能越强

然后我们来看声明式,声明式的代码为:

//耗时为1+n  将msg修改为hello world
<div>
  {{msg}}
</div>

那么:已知修改 text 最简单的方式是 innerText,所以说无论声明式的代码是如何实现的文本切换,那么它的耗时一定是>1的,我们把它比作1+n(对比的性能消耗)

所以,由上所述得出的结论就是:命令式的性能>声明式的性能

可维护性

可维护性代表的维度非常多,但是通常情况下,所谓的可维护性指的是:针对代码可以方便的 阅读、修改、删除、增加

那么想要达到这个目的,说白了就是:代码的逻辑要足够简单,让人一看就懂。

那么明确了这个概念,我们来看下命令式和声明式在同一段业务下的代码逻辑:

//命令式
// 1.获取到第一层的 div
const divEle=document.querySelector('#app')
// 2. 获取它的子 div
const subDivEle=divEle.querySelector('div')
// 3. 获取第三层的 p
const subPEle=subDivEle.querySelector('p')
// 4. 定义变量msg
const msg='hello world'
// 5. 为该 p 元素设置innerHtML 为 hello world
subPEle.innerHtML=msg
//声明式
<div id="app">
  <div>
  <p>{{msg}}</p>
  </div>
</div>

对于以上代码而言,声明式的代码明显更加利于阅读,所以也更加利于维护。

所以,由上举例可知:命令式的可维护性<声明式的可维护性