1. 程式人生 > >javascript設計模式和開發實踐(階段一)

javascript設計模式和開發實踐(階段一)

amp 出現 sta == 無法 錘子 可靠性 () 靈活

1,設計模式的作用:讓人們寫出可復用和可維護性高的程序,代價可能是,額外增加代碼量;

比較形象的例子:空房間裏面放東西,如果日復一日的往裏面扔東西,時間久了,很難找到自己想要的東西,調整也不容易,但是做一些櫃子放東西,雖然前期增加了成本,但是在維護階段帶來了極大的好處。【櫃子存放東西】,或許就是一種模式。

2,所有設計模式的實現遵循一條原則:找出程序中變化的地方,並將變化封裝起來。程序中不變和穩定的部分是很容易復用,所以需要封裝變化的部分。

初學者針對設計模式很容易出現“錘子理論”:當我們有一把錘子,看什麽都是釘子。意思是:設計模式的深刻意圖,只有結合實際項目場景靈活使用。

3,編程語言分類:靜態類型,動態類型。

靜態類型語言:在編譯時候便已經確定變量的類型。動態類型語言:變量被賦值後,才具有某種類型。

靜態語言和動態語言的優缺點:靜態語言明確規定了數據類型,迫使程序員按照契約來寫程序,輔助程序員編寫可靠性高的代碼,動態語言優點是編寫代碼量減少,更加簡潔,但是無法保證變量類型,可能在運行過程中發生跟類型相關的錯誤。Javascript是一門典型的動態類型語言,動態類型語言對變量類型帶來了很大的寬容性。

“鴨子類型”:如果它走起路來像鴨子,叫起來也是鴨子,那麽它就是鴨子。通俗易懂的來講:我們關註的是對象的行為,不關註對象本身。

(我覺著這本書寫的好棒,下面還有個鴨子的故事程序)

var duck = {
    duckSinging(){
        console.log(‘嘎嘎嘎‘)
    }
}
var chicken = {
    duckSinging(){
        console.log(‘嘎嘎嘎‘)
    }
}
var choir = [];  //合唱團
var joinChoir = function(animal){
    if(animal && typeof animal.duckSinging === ‘function‘){
        choir.push(animal);
        console.log(‘恭喜加入合唱團‘);
        console.log(‘合唱團已有成員數量:‘+choir.length)
    }
}
joinChoir(duck);
//恭喜加入合唱團
//合唱團已有成員數量:1
joinChoir(chicken);
//恭喜加入合唱團
//合唱團已有成員數量:2  

對於加入合唱團的動物,無論小狗,小雞,小貓,只要擁有duckSinging的方法,就能夠加入進來。在動態類型語言的面向對象方法中,“鴨子類型”概念至關重要。

利用“鴨子類型”思想,“面向接口編程,而不是面向實現編程”。面向接口編程,意思就是不是很關註實現,只關註接口API的輸出,對象內部的變化對其他對象而言是透明的,也就是不可見的,透明的意思是:你不知道它是如何做到的,反正它就是能做到。

var makeSound = function(animal){
    if(animal instanceof Duck){
        console.log(‘嘎嘎嘎‘)
    }else if(animal instanceof Chiken){
        console.log(‘咯咯咯‘)
    }
}
var Duck = function(){};
var Chiken = function(){};
makeSound(new Duck()); //嘎嘎嘎
makeSound(new Chiken())  //咯咯咯

上面的代碼體現了“多態”,將“做什麽”和“怎麽做”分開,就是當我們對調用一些函數時,函數會返回不同的執行結果,這就是多態性的一種體現。

javascript設計模式和開發實踐(階段一)