浅析 MVC 设计思想

654 阅读4分钟

MVC这个词似乎经常被包装的非常高大上,但对于它的理解,那是众说纷纭。不同人有不同理解,在不同的设计框架内,又衍生出 MVC 的各种变种。我们先从它的本质出发,MVC就是个英文缩写,三个单词model,view,controller,这就是它包含的核心内容。

MVC 的三大对象

MVC设计模式,也可以说是设计思想,就是将应用程序设计中需要实现的各种功能进行分离,抽离出 Model,View,Controller 三大类对象,分别实现不同的职责,提高程序的灵活性和复用性。

image.png

  • 模型model用于封装与应用程序的业务逻辑相关的数据以及处理方法,会有相关视图监听此模型。一旦模型的数据发生变化,模型将通知有关的视图。伪代码示例如:
let person = {
name: jack,
age: 22,
education: bachelor,
hello: function(){export("hello,I'm"+ this.name)}
}
  • 视图view是它在屏幕上的显示,描绘的是model的当前状态。当模型的数据发生变化,视图相应地进行刷新。它也是用户进行人机交互的界面。伪代码示例:
let html = `
<p>这里是{{name}}的个人档案</p>
<p>姓名{{name}}</p>
<p>年龄是{{age}}</p>
<p>教育程度是{{education}}</p>
<p>他的问候语: </p>
<p>{{hello()}}</p>`
  • 控制器controller定义用户界面对用户输入的响应方式,起到组织作用,用于控制应用程序的流程,它处理用户的行为,控制view和数据model的改变。伪代码示例:
delButton.addEventListener("click", function(){
    delete(data.person);
});
updateButton.addEventListener("click", function(){
    update(data.person, user_import); // 用用户输入user_import去更新数据库
});

EventBus的使用

EventBus 在开发中经常会被用来进行模块间和多组件之间的通信。EventBus 直译为事件公交车,又称为事件总线。它可以用来作为不同模块间的沟通桥梁,就像是所有模块共用的事件中心,可以向该中心注册发送事件或接收事件,所有组件之间通过它都可以发送通知和接受信息,实现不分上下级兄弟级的通信。如:

const eventBus = new Window()
let trigger1 = eventBus.listen(element1, event1)
if(trigger1 = true) {
eventBus.trigger(element2, event2)
}

表驱动编程理念

表驱动方法是一种使你可以在表中查找信息,而不必用逻辑语句(if 或 case)来把他们找出来的方法。事实上,任何信息都可以通过表来挑选。在简单的情况下,if类的逻辑语句往往更简单而且更直接。但随着逻辑链的复杂,if类的逻辑语句的分支链条会显得非常繁琐不清晰,这时表就变得越来越富于吸引力了。

表驱动编程的理念在于逻辑与数据的分离。

他的优点有:

  • 可读性强,数据处理流程一目了然。
  • 便于维护,只需要增、删数据索引和方法就可以实现功能。
  • 精简代码,降低圈复杂度。减少 if-else、switch-case 使用。
  • 在一些情况下可以提升程序运行速度。

比如 if 逻辑实现星期几的判断:

function weekday(day) {
    if (day === '1') {
        return '周一'
    } else if (day === '2') {
        return '周二'
    } else if (day === '3') {
        return '周三'
    } else if......
}

是不是非常繁琐,如果用表编程的思维,就非常清晰明了。

function weekday(day) {
    let map = {
        '1': '周一',
        '2': '周二',
        '3': '周三'
        ...
    }
    return map[day];
}

非常清晰,可读性强,后续的更新,可维护性也比单纯 if 逻辑强了 n 倍。

模块化编程思想

模块化开发是现在最重要的应用程序开发设计思想之一。

随着项目的功能越来越强大,内容越来越多,交互逻辑越来越复杂,系统的复杂度成倍上升。 代码文件越来越复杂,构建的交互逻辑过于繁杂,经常会纠缠不清,且一点小小的改动就会影响很大一部分组件,牵一发而动全身,后续的更新、维护和管理会非常困难。

解决方案就是使用模块化编程思想来构建项目,对整个系统进行模块化,规范化。 将属于同一类功能的业务逻辑代码抽离出来,组成一个模块,统一进行管理。这样可以精简代码逻辑,降低系统复杂度。它主要有以下几点优点:

  1. 结构清晰,各个模块的代码实现分离,不会纠缠在一起。在代码管理或者二次开发的时候一目了然,不再大海捞针去理清代码逻辑找功能代码。
  2. 便于更新和维护。每个模块的代码、资源文件可以随时更新,而将对其他模块的功能影响降到最低,不再牵一发而动全身。
  3. 各模块可独立调试和运行;基础组件很容易实现复用,提高效率;同时也方便同模块代码的权限管控。
  4. 多模块可分工协同开发。项目开发时候更灵活,缩短开发周期,降低成本。