浅析MVC

79 阅读2分钟

1. MVC 三个对象分别做什么,给出伪代码示例

MVC分别指model模型,view视图,controler控制器。

model

model是和数据相关的代码集合的对象,这里是所有模块数据的来源,更新数据也要调用它的方法。如下代码中,data用来存放数据,update是更新数据的方法。

const m ={
       data:{n: parseInt(localStorage.getItem('n')},
        update(data) {//  更新数据,储存数据
            Object.assign(m.data, data)//  替换对象的属性
            localStorage.setItem('n', data.n)
            eventBus.trigger('dataUpdate')//  触发eventBus的dataUpdate事件
        }
       }

view

view是和视图相关代码集合的对象,这里是渲染页面的方法render,以及渲染页面要用到的页面内容html,容器el。

const v={
    el: null,
    html: `
    <div>
    <p class="data">{{data}}</p>
    <button class="add">+1</button>
    <button class="subtract">-1</button>
    <button class="multiply"2</button>
    <button class="divide"2</button>
    </div>
    `,
    render(n) {
        if (v.el.children.length !== 0) {
            v.el.empty()
        }
        $(v.html.replace('{{data}}', n))
            .appendTo(v.el)
    },
    init(container) {
        v.el = $(container)
        v.render(m.data.n)
}

controler

controler是衔接视图和数据间的代码集合的对象,是操作view和model代码的代码。在如下代码中,他需要绑定事件,调用view和model中的代码初始化页面。

let c = {
    init(container) {
        v.init(container)
        c.autoBindEvents()
        eventBus.on('dataUpdate', () => {//  监听’dataUpdate‘数据更新事件
            v.render(m.data.n)
        })
    },
    events: {//  把绑定事件的信息做成hash表,自动绑定事件
        'click .add': 'add',
        'click .subtract': 'subtract',
        'click .multiply': 'multiply',
        'click .divide': 'divide'
    },
    add() {
        m.update({ 'n': m.data.n += 1 })
    },
    subtract() {
        m.update({ 'n': m.data.n -= 1 })
    },
    multiply() {
        m.update({ 'n': m.data.n *= 2 })
    },
    divide() {
        m.update({ 'n': m.data.n /= 2 })
    },
    autoBindEvents() {
        for (let key in c.events) {
            const value = c.events[key]
            const spaceIndex = key.indexOf(' ')
            const part1 = key.slice(0, spaceIndex)
            const part2 = key.slice(spaceIndex + 1)
            v.el.on(part1, part2, c[value])
        }
    }
}

2. EventBus有哪些 API,是做什么用的,给出伪代码示例

EventBus可以完成模块间的通信,可以在model模块更新数据时触发事件eventBus.triggle('updateData'),可以controler模块监听'updateData'事件通知view模块的渲染EventBus.on('updateData',v.render),可以删除事件EventBus.off('updateData')

3.. 表驱动编程

像上面controler中出现多次绑定事件的代码,这些操作里有重复的部分也有不重复的,我们就将重复的部分做成hash表,这样

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

4. 我是如何理解模块化的

模块化根据功能将代码归类,有利于写出有条理的代码,也提高了可读性。而且模块间采用最小知识原则,将代码内部对外界依赖性降到最低,因此便于维护和因需求变动做出改动。