浅析MVC

作者: 饥人谷_折纸大师 | 来源:发表于2022-08-11 11:12 被阅读0次

    MVC是什么

    每一个模块可以写成三个对象,分别是M、V、C
    M——Model(数据模型),负责操作所有数据
    V——View(视图),负责所有UI界面
    C——Controller(控制器),负责其他

    其中涉及到的一些抽象思维

    • 抽象思维1
      最小知识原则
      引入一个模块需要引入HTML、CSS、JS
      需要知道的东西越少越好,模块化为这一点奠定了基础
      但是这样做刚开始页面会是空白的,没有内容没有样式
      可以添加载入动画或者骨架图或者站位内容
    • 抽象思维2
      以不变应万变
      每个模块都可以用m+v+c来写,每个模块都这样写,不用思考类似需求怎么写了
      但是有时会有多余用不到的代码,遇到特殊情况时难以变通
    • 抽象思维3
      view = render(data)
      比起操作DOM对象,直接render更为容易,只要改变data就能得到对应的view
      但是render渲染会比DOM更加浪费性能
    • 抽象思维4
      表驱动编程
      表指的是哈希表
      表驱动编程可以减少重复代码,只讲重要的信息放在表里,然后利用表来编程(数据结构)
    • 抽象思维5
      事不过三
      同样的代码写三遍,应该抽成一个函数
      同样的属性写三遍,应该做成共有属性(原型或类)
      同样的原型写三遍,应该用继承
    • 抽象思维6
      俯瞰全局
      eventbus 负责事件通信
      把所有的对象看成点,实现点与点的通信

    Model:是应用程序中用于处理应用数据逻辑的部分。
    用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法,会有一个或多个视图监听此模型。一旦模型数据发生变化,模型将通知有关视图。

    const m = {
      data: {数据A},
      create() {},
      delete() {},
      update(data) {
            Object.assign(m.data,data)//用新数据替换旧数据
            eventBus.trigger('m:update')//eventBus触发'm:update'信息,通知View刷新界面
    },
      get() {数据A}
    }
    

    View:是应用程序处理应用数据显示的部分。
    它是在屏幕上面表示,描绘的是Model当前的状态。当模型的数据发生变化,相应的得到刷新自己的机会。

    const v = {
      el: 需要刷新的元素,  
      html: `
           body里面的内容
    `,
      init(container) {
        v.el = $(container)
      },
      render(n) {刷新页面}
    }
    

    Controller:是应用程序处理人机交互的部分。
    Controller定义用户界面对用户输入的响应式,起到不同层面间的组织作用,用于控制应用程序的流程,它处理用户的行为和数据Model上的变化。

    const c = {
      init(container) {
            v.init()//初始化View
            v.render()//第一次渲染页面
            c.autoBindEvents()//自动的事件绑定
            eventBus.on('m:update',()=>{v.render()}//当enentsBus触发'm:update'是View刷新
        },
      events: {},   //事件以哈希表的方式记录存储
      add() {},
      minus() {},
      mul() {},
      div() {},
      autoBindEvents() {自动绑定事件}
    }
    

    EventBus

    • on : 监听事件
    • trigger(emit) : 触发事件
    • off : 取消监听
      用于模块间的通讯,view组件层面,父子组件、兄弟组件通信都可以使eventbus处理。
    const eventBus = $(window)
    eventBus.trigger('m:update') // 自动触发事件update
    eventBus.on('m:update', () => {console.log('触发';)}) //监听事件 然后执行函数
    
    

    表驱动编程

    表驱动编程的意义在于逻辑与数据的分离

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

    使用if-else

    function translate(term) {
        if (term === '1') {
            return '一'
        } else if (term === '2') {
            return '二'
        } else if (term === '3') {
            return '三'
        } else {
            return '???'  
        }
    }
    
    // 如果想添加一个新的名词翻译,需要再添加一个if-else逻辑,例如:
    function translate(term) {
        if (term === '1') {
            return '一'
        } else if (term === '2') {
            return '二'
        } else if (term === '3') {
            return '三'
        } else if (term === '4') {   
            // 此处添加了一个新的名词翻译
            return '四'
        } else {
            return '???'  
        }
    }
    

    如果使用表

    function translate(term) {
        let terms = {
            '1': '一',
            '2': '二',
            '3': '三'
        }
        return terms[term];
    }
    
    // 如果想添加一个新的名词翻译,只需要在terms中添加一个新的表项,不需要修改整个逻辑
    function translate(term) {
        let terms = {
            '1': '一',
            '2': '二',
            '3': '三'
            '4': '四'   // 添加一个新的名词翻译
       
        return terms[term];
    }
    

    显而易见,容易了很多。根本不用修改代码逻辑。


    模块化的理解

    • 模块化可以避免阻断。每个模块之前互相独立,互不影响,削弱了不同模块之间的联系,不影响其他模块的调用,此外其中一个模块产生了bug也不会影响到其他模块。这样子可以更好的优化和重构代码,方便维护。
    • 如果是多人协作开发,模块化可以有效避免代码覆盖和冲突的问题。

    相关文章

      网友评论

          本文标题:浅析MVC

          本文链接:https://www.haomeiwen.com/subject/tdpxgrtx.html