淺析MVC

MVC 三個對象分別做什么

每個模塊都可以寫成三個對象饥脑,分別是M、V懦冰、C

  • M(Model:數(shù)據(jù)模型): 負責操作所有的數(shù)據(jù)
  • V(View:視圖): 負責所有的UI界面
  • C(Controller:控制器): 負責其他

現(xiàn)在給出一個需求:給一個初始數(shù)字,然后用戶可以進行+谣沸、-刷钢、*、/的相關(guān)操作乳附,來看下MVC三個對象在代碼中的具體實現(xiàn)

  1. M對象操作所有的數(shù)據(jù)
    數(shù)據(jù)相關(guān)都放到m,(采用偽代碼内地,理解思路即可)
const m = {
  data: {數(shù)據(jù)A},
  create() {},
  delete() {},
  update(data) {
        Object.assign(m.data,data)//用新數(shù)據(jù)替換舊數(shù)據(jù)
        eventBus.trigger('m:update')//eventBus觸發(fā)'m:update'信息,通知View刷新界面
},
  get() {數(shù)據(jù)A}
}
  1. V對象負責所有的UI界面
    視圖相關(guān)都放到v赋除,代碼如下:
const v = {
  el: 需要刷新的元素,  
  html: `
       body里面的內(nèi)容
`,
  init(container) {
    v.el = $(container)
  },
  render(n) {刷新頁面}
}
  1. C對象負責其他
    其他都放到c對象中阱缓,代碼如下:
const c = {
  init(container) {
        v.init()//初始化View
        v.render()//第一次渲染頁面
        c.autoBindEvents()//自動的事件綁定
        eventBus.on('m:update',()=>{v.render()}//當enentsBus觸發(fā)'m:update'是View刷新
    },
  events: {事件 },   //事件以哈希表的方式記錄存儲
  add() {+具體實現(xiàn)},
  minus() {-具體實現(xiàn)},
  mul() {*具體實現(xiàn)},
  div() {/具體實現(xiàn)},
  autoBindEvents() {自動綁定事件}
}

EventBus 有哪些 API,是做什么用的

  1. 什么是EventBus?
    簡單的說举农,就是一個以事件為驅(qū)動的消息服務(wù)總線

  2. Web平臺運行期為什么要用EventBus荆针?
    便于業(yè)務(wù)邏輯解耦
    提供豐富的擴展點,包括前擴展颁糟、后擴展和覆蓋
    使用事件驅(qū)動航背,讓事件觸發(fā)更加清晰
    讓代碼更加簡潔清楚

  3. Web平臺運行期在那些地方使用了EventBus?
    業(yè)務(wù)邏輯調(diào)度中心棱貌,包括前端玖媚、Web服務(wù)端任何地方
    通過EventBus集成各種超類、模板婚脱、頁面
    通過EventBus集成各種系統(tǒng)服務(wù)與業(yè)務(wù)組件

  4. EventBus 有哪些 API?
    on : 監(jiān)聽事件
    trigger(emit) : 觸發(fā)事件
    off : 取消監(jiān)聽

class EventBus {
    constructor() {
        this._eventBus = $(window)
    }
    on(eventName, fn) {
        return this._eventBus.on(eventName, fn)
    }
    trigger(eventName, data) {
        return this._trigger.trigger(eventName, data)
    }
    off(eventName, fn) {
        return this._eventBus.off(eventName, fn)
    }
}
export default EventBus
//new.js
import EventBus from 'EventBus.js'
const e = new EventBus()
e.on()
e.trigger()
e.off()

表驅(qū)動編程是做什么的

表驅(qū)動編程方法是一種使你可以在表中查找信息今魔,而不必用很多的邏輯語句(if或Case)來把它們找出來的方法勺像。在簡單的情況下,邏輯語句往往更簡單而且更直接错森。但隨著邏輯鏈的復雜吟宦,復雜度也會越來越高。表就可以減少重復代碼问词,只將重要的信息放在表里督函,然后利用表來編程,與邏輯語句相比較有著更穩(wěn)定的復雜度激挪。
以下兩段代碼進行對比即可發(fā)現(xiàn)用表驅(qū)動編程方法可以使代碼變得更為簡潔辰狡。

  1. 沒有使用表驅(qū)動編程的代碼
bindEvents(){
  v.el.on('click', '#add1', () => {
    m.data.n += 1
    v.render(m.data.n)
  })
  v.el.on('click', '#minus1', () => {
    m.data.n -= 1
    v.render(m.data.n)
  })
  v.el.on('click', '#mul2', () => {
    m.data.n *= 2
    v.render(m.data.n)
  })
  v.el.on('click', '#divide2', () => {
    m.data.n /= 2
    v.render(m.data.n)
  })
}
  1. 運用了表驅(qū)動編程的代碼(將事件提取出一個哈希表,使邏輯和數(shù)據(jù)分離開)
events: {
  'click #add1' : 'add',
  'click #minus1' : 'minus',
  'click #mul2' : 'mul',
  'click #divide2' : 'div'
},
add() {
  m.update( data: {n: m.data.n +1})
},
minus() {
  m.update( data: {n: m.data.n -1})
},
mul() {
  m.update( data: {n: m.data.n *2})
},
div() {
  m.update( data: {n: m.data.n /2})
}

會發(fā)現(xiàn)通過表驅(qū)動編程之后代碼邏輯變的更為清晰簡潔了垄分。

【擴展】

我是如何理解模塊化的宛篇?

  1. 代碼模塊化之后無論是代碼的整體性還是后期進行代碼維護都變的清晰簡單了起來。例如與邏輯相關(guān)的代碼統(tǒng)一放到JS文件中薄湿,與視圖相關(guān)的統(tǒng)一放到html文件中叫倍,與樣式相關(guān)的統(tǒng)一放到css文件中。
  2. 業(yè)務(wù)模塊化之后可以使業(yè)務(wù)流程更為清晰豺瘤,便于開展工作吆倦,各個業(yè)務(wù)模塊之間負責自己模塊的業(yè)務(wù),也避免了一些不必要的麻煩坐求,使得工作的效率也會更高蚕泽。
  3. 模塊化我覺得是一種高效的思想,這在編程過程中提供了一種優(yōu)化代碼以及重構(gòu)代碼的方向桥嗤。

與模塊相關(guān)的兩個命令

一般來說须妻,一個模塊就是一個獨立的文件,該文件內(nèi)部的所有變量泛领,外部無法獲取荒吏,如果你希望外部能夠讀取模塊內(nèi)部的某個變量,就必須使用export命令輸出該變量渊鞋,使用import命令輸入其他模塊提供的功能绰更。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市篓像,隨后出現(xiàn)的幾起案子动知,更是在濱河造成了極大的恐慌,老刑警劉巖员辩,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盒粮,死亡現(xiàn)場離奇詭異,居然都是意外死亡奠滑,警方通過查閱死者的電腦和手機丹皱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門妒穴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人摊崭,你說我怎么就攤上這事讼油。” “怎么了呢簸?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵矮台,是天一觀的道長。 經(jīng)常有香客問我根时,道長瘦赫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任蛤迎,我火速辦了婚禮确虱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘替裆。我一直安慰自己校辩,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布辆童。 她就那樣靜靜地躺著宜咒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪把鉴。 梳的紋絲不亂的頭發(fā)上荧呐,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音纸镊,去河邊找鬼。 笑死概疆,一個胖子當著我的面吹牛逗威,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播岔冀,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼凯旭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了使套?” 一聲冷哼從身側(cè)響起罐呼,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎侦高,沒想到半個月后嫉柴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡奉呛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年计螺,在試婚紗的時候發(fā)現(xiàn)自己被綠了夯尽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡登馒,死狀恐怖匙握,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陈轿,我是刑警寧澤圈纺,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站麦射,受9級特大地震影響蛾娶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜法褥,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一茫叭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧半等,春花似錦揍愁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至切距,卻和暖如春朽缎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谜悟。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工话肖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人葡幸。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓最筒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蔚叨。 傳聞我的和親對象是個殘疾皇子床蜘,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 【目錄】 一、MVC 三個對象分別做什么二蔑水、EventBus 有哪些 API邢锯,是做什么用的三、表驅(qū)動編程是做什么的...
    云卷云舒聽雨聲閱讀 414評論 0 0
  • MVC沒有嚴格的定義搀别,M - Model(數(shù)據(jù)模型丹擎,負責封裝數(shù)據(jù)以及數(shù)據(jù)的處理方法) V - View(視圖,負責...
    Marshall3572閱讀 189評論 0 0
  • 一领曼、MVC是什么? MVC是一種設(shè)計模式(那設(shè)計模式又是什么呢?簡單粗暴的說好用的東西就是設(shè)計模式)懂酱,MVC能夠使...
    浪味仙兒啊閱讀 336評論 0 2
  • 一演痒、MVC是什么? MVC是一種設(shè)計模式(那設(shè)計模式又是什么呢?簡單粗暴的說好用的東西就是設(shè)計模式),MVC能夠使...
    2b61575c37fd閱讀 215評論 0 0
  • 一、 MVC 設(shè)計模式 1. 設(shè)計模式 設(shè)計模式府适,是通用代碼(組織方式)的一種統(tǒng)稱 2. MVC 是什么 MVC ...
    x___h閱讀 274評論 0 0