MVC是一個很是經典的設計思想,大概在上世紀七十年代malltalk系統誕生時就有了,通過幾十年的發展,MVC衍生出了其餘設計思想,好比MVVM,MVP,EventBus等。下面介紹其中幾個。php
MVC,由Model,View,Controller三部分組成, 每塊的分工以下,編程
Model(){ 數據 } View(){ 視圖 } Controller(){ 數據的操做 } 複製代碼
當代碼裏有多個對象,對象之間須要一座信息溝通的橋樑時,若是每個對象都本身實現本身的通訊方法,那未免過低效了,最好的辦法是咱們能夠抽象出一個專門負責事件通訊的對象,這個對象就是EventBus,DOM API也發揚了一樣的思想,把EventTarget這個對象放在原型鏈的倒數第二層,比Element,Node都高,爲的就是全部的元素、節點均可以經過EventTarget裏的方法(好比addEventListener)來通訊。數組
表示原則:把知識疊入數據以求邏輯質樸而健壯。 ——《UNIX編程藝術》bash
表驅動編程(Table-Driven Approach)是一種把數據和邏輯解耦的編程思想,目的是增長代碼的可讀性和邏輯的獨立性。markdown
表驅動編程中,數據一般有三種訪問方式:mvc
以一個月的天數爲例,咱們要寫一串if/else 或者switch/case 來表達邏輯。oop
if(1 == iMonth) {iDays = 31;} else if(2 == iMonth) {iDays = 28;} else if(3 == iMonth) {iDays = 31;} else if(4 == iMonth) {iDays = 30;} else if(5 == iMonth) {iDays = 31;} else if(6 == iMonth) {iDays = 30;} else if(7 == iMonth) {iDays = 31;} else if(8 == iMonth) {iDays = 31;} else if(9 == iMonth) {iDays = 30;} else if(10 == iMonth) {iDays = 31;} else if(11 == iMonth) {iDays = 30;} else if(12 == iMonth) {iDays = 31;} 複製代碼
可是咱們把數據放在一張表裏,就不須要這麼冗餘的邏輯了,spa
const month = { monthTable: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], get days(month, year) { // (year % 4 === 0) && (year % 100 !== 0 || year % 400 === 0) return [month - 1]; } } 複製代碼
有時經過一次鍵值轉換(對象或者數組),依然沒法找到鍵值。此時可將轉換的對應關係寫到一個索引表裏,即索引訪問。並且能夠多重索引,或者使用正則匹配。設計
const c = { n: 0, events : { 'click #add': 'add', 'click #minus': 'minus', 'click #mul': 'mul', 'click #div': 'div' }, add(n){ return n+1 }, minus(n){ return n-1 }, mul(n){ return n*2 }, div(n){ return n/2 }, 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) // 點擊事件 } } } 複製代碼
對於一些無規則的數據,例如等級劃分。咱們無法使用簡單的轉換將數據轉換爲索引,可是咱們可使用一個循環,依次檢查區間的上下限。code
須要注意的細節:
const grade = [59,79,84,89,94,100]; const level = ["F","E","D","C","B","A"]; const getLevel = g =>{ for(let i = 0 ; i < grade.length ; i++){ if(g <= grade[i]) return level[i]; } } 複製代碼