浅析 MVC

164 阅读3分钟

MVC 三个对象及各自的作用

MVC 包括三类对象,将他们分离以提高灵活性和复用性。

  • Mmodel 数据模型,用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法,会有一个或多个视图监听此模型。一旦模型的数据发生变化,模型将通知有关的视图。
  • Vview 视图,是它在屏幕上的表示,描绘的是model的当前状态。当模型的数据发生变化,视图相应地得到刷新自己的机会。
  • Ccontroller 控制器,定义用户界面对用户输入的响应方式,起到不同层面间的组织作用,用于控制应用程序的流程,它处理用户的行为和数据model上的改变。

代码示例如下:

const model = {
  data: {
    // 相关数据
     n: localStorage.getItem('n')
  },
  // 对数据的一些处理方法
  create() {},
  delete() {},
  update() {},
  get() {}
}

const view = {
  // 界面的显示
  html: `
  <div>
     <span id="number">{{n}}</span>
  </div>   
`,
// 当模型的数据发生变化,视图重新渲染
  render(n) {}
  
const controller = {
  init() {},
  // 监听用户事件、处理用户行为
  events: {},
  mul() {},
  div() {},
  autoBindEvents() {
  for (let key in c.events) {
      const value = c[c.events[key]]
      const spaceIndex = key.indexOf(' ')
      const part1 = key.slice(0, spaceIndex)
      const part2 = key.slice(spaceIndex + 1)
      v.el.on(part1, part2, value)
    }
  }
}

EventBus 的作用以及一些常用API

EventBus 主要用于对象间通信,它提供了 on、off 和 trigger 等 API,on 用于监听事件,off 用于取消事件监听, trigger 用于触发事件。使用 EventBus 可以满足最小知识原则,model 和 view 互相不知道对方的细节,但是却可以调用对方的功能。

class EventBus{
    constructor() {
        this._eventBus =$(window)
    }
    //监听函数
    on(eventName,fn){
        return this._eventBus.on(eventName,fn)
    }
    //触发函数
    trigger(eventName,data){
        return this._eventBus.trigger(eventName,data)
    }
    //取消函数
    off(eventName,fn){
        return this._eventBus.off(eventName,fn)
    }
}

关于表驱动编程

《代码大全》对表驱动编程的描述:

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

这里的表指的是哈希表,表驱动编程可以减少重复代码,只将重要的信息放在表里,然后利用表来编程。

它的作用有:

  1. 可读性强,数据处理流程一目了然。
  2. 便于维护,只需要增、删数据索引和方法就可以实现功能。
  3. 精简代码,降低圈复杂度。减少if else、switch、case使用。

如何理解模块化

真正的模块化,并不是简单文本意义上的,而是与逻辑相关的有逻辑意义的。一个模块应该像一个集成电路芯片,我们能见到能使用的都很清晰,它定义了良好的输入和输出。

模块化开发其实就是封装细节,提供使用接口,彼此之间互不影响,每个模块都是实现某一特定的功能。

软件编程模块是一套一致而互相有紧密关联的软件组织,每个模块完成一个特定的子功能,所有的模块按某种方法组装起来,成为一个整体,完成整个系统所要求的功能,这就是真正的模块化。

模块化开发不仅使我们在编程时更加容易,同时也更利于维护代码。

本文参考:

前端MVC变形记

如何写模块化的代码

谈谈代码的模块化