1. 什么是MVC
网上有很多关于MVC的理解,经过我的理解后,MVC就是一种框架,将原来无序的代码划分在M(数据)、V(视图)、C(控制器)三个结构中,使代码结构变得非常清楚,可以针对不同的层进行优化,提高效率,同时能针对单一模块添加功能和重复使用相同模块。
-
M-Model(数据模型),负责操作所有数据。
如下,申明一个m对象,专门用来存储数据:
const m={
data:{
p:3,
n:Math.random()
},
upData(){
return this.data.p + this.data.n
}
}
- V-View(视图)负责所有界面视图
const v={
html:`
<div>
<p>点击数字将生成一个新的随机数</p>
<div id="btn">{{p}}</div>
</div>
`,
render(){
$(v.html.replace('{{p}}',m.data.p)).appendTo('body')
}
}
v.render()
- C-Controller(控制器),负责操作数据,达到改变界面视图,是View和Model的连接层
const c={
init(){
$('#btn').on('click',()=>{
m.upData()
})
}
}
c.init()
2. 浅析eventBus
eventBus在android界里很有名气,但这里所说的是JS里的eventBus,其实原理是一样的,作用是简化事件通讯,eventBus运用了下面几个DOM原生事件。
1)addEventListener(type, callback, scope) — 添加一个事件监听
2)removeEventListener(type, callback, scope) — 移除一个事件监听
3)dispatch(type, target) — 触发一个事件
4)getEvents() — 调试使用,仅仅打印添加的监听
5)hasEventListener() — 判断是否有事件监听
eventBus将这些事件方法作为继承的属性方法传递给子类 如:
class EventBus{
//封装这些事件方法
}
class Bus extends EventBus{
//继承EventBus的属性方法
}
let bus=new Bus()
//调用方法
bus.on(event,fn)
bus.emit(event)
bud.off(event)
这样做的优点在于可以动态设置事件处理线程,实现解耦让业务代码更加简洁。
3. 表驱动编程
所谓表驱动法(Table-Driven Approach),简单讲是指用查表的方法获取值。
function days(num){
if(num===1){return 31+'天'}
if(num===2){return 28+'天'}
if(num===3){return 31+'天'}
if(num===4){return 30+'天'}
if(num===5){return 31+'天'}
if(num===6){return 30+'天'}
if(num===7){return 31+'天'}
if(num===8){return 31+'天'}
if(num===9){return 30+'天'}
if(num===10){return 31+'天'}
if(num===11){return 30+'天'}
if(num===12){return 31+'天'}
}
上面是一个查月份天数的函数,可以说是非常冗长了,如果使用表驱动编程思想,再看看
let num=[1,2,3,4,5,6,7,8,9,10,11,12]
let value=[31,28,31,30,31,30,31,31,30,31,30,31]
function days(x){
for(let i=0;i<num.length;i++){
if(x===num[i]){
return value[i]+'天'
}
}
}
这代码的复杂度是恒定的,前端最重要的一个编程思想之一就是“事不过三,稳定代码复杂度”,而上面代码的复杂度是递增的,从这一点就可以看出表驱动法编程的重要性,当然,这里的“表”可以指代一切表(哈希表,键值对对象,数组)。
4. 我对模块化的理解
其实这篇文章,全程都在围绕模块化编程叙述,MVC就是一种模块化编程框架,或者说是一种思想方法;eventBus就是将事件作为一个类属性方法,或者说是一个版块封装在我们要操作的对象上;表驱动编程更是模块化编程思想的一大类思想。因此,模块化,就是将我们的代码分割成不同功能版块,使之更简洁,模块之间分工更加明确,提高代码优化效率的一种编程方法。