《JavaScript設(shè)計模式》筆記一

原文地址:[Learning JavaScript Design Patterns]

前言

編寫可維護代碼很重要圈膏!好的設(shè)計模式可以幫助我們注意到代碼中重復(fù)出現(xiàn)的主題并對其進行優(yōu)化(更好地編寫可維護代碼)梭灿。

什么是模式曹铃?

設(shè)計模式是一種可重用的解決方案秸仙。在編寫應(yīng)用時飞蚓,可以在不同的情況下使用不同的設(shè)計模式來解決問題踱稍。

特性:

  • 經(jīng)過驗證

  • 易于重用

  • 具有解釋性:用集合或者簡單的詞匯來描述復(fù)雜的解決方案

模式并不能解決所有的設(shè)計問題弟跑,但能提供很多優(yōu)勢:

  1. 有助于發(fā)現(xiàn)可能導(dǎo)致開發(fā)過程中出現(xiàn)重大問題的小問題

  2. 設(shè)計模式是通用的灾前,不同的編程語言都可以應(yīng)用來改進代碼結(jié)構(gòu)

  3. 方便開發(fā)人員交流

  4. 基于設(shè)計模式的解決方案比臨時解決方案更穩(wěn)定強大

測試、原型模式孟辑、三法則

測試:完整的模式是經(jīng)過嚴格審查和測試的

原型模式:尚未通過測試的模式哎甲,可能來自個人、社區(qū)

一個好的模式需要:

  • 解決一個特定的問題

  • 問題的解決方案不是顯而易見的(好的設(shè)計模式通常間接地為問題提供解決方案)[?]

  • 所描述的概念必須是已經(jīng)被證明過的(設(shè)計模式需要證明它們的功能與描述的一致)

  • 必須描述一種關(guān)系(設(shè)計模式需要描述深層次的系統(tǒng)結(jié)構(gòu)和機制與代碼的關(guān)系)

三法則:

  1. 模型如何被認為是成功的扑浸?(how/適合解決某種問題)

  2. 為什么模型被認為是成功的烧给?(why/對于目標是起作用的)

  3. 具有普遍的/廣泛的適用性

設(shè)計模式的結(jié)構(gòu)

一個設(shè)計模式應(yīng)該包括(設(shè)計自己的模式時):

  1. 名稱和描述

  2. 上下文大綱

  3. 問題陳述

  4. 解決方案

  5. 設(shè)計:包括與用戶的交互行為

  6. 執(zhí)行(操作)指南

  7. 可視化表示

  8. 示例/舉例

  9. 其他支持:包括其他模式

  10. 與其他模式的關(guān)系描述(借鑒/類似)

  11. 實際應(yīng)用

  12. 討論

編寫設(shè)計模式(pass)

現(xiàn)代JavaScript語法和特征

  • 解耦應(yīng)用程序的重要性:模塊化可以使程序更容易維護

  • import、export:模塊化鼓勵代碼重用

    .mjs is an extension used for JavaScript modules that helps us distinguish between module files and classic scripts (.js).

  • 遠程加載模塊

  • 動態(tài)導(dǎo)入:靜態(tài)導(dǎo)入需要先下載喝噪、執(zhí)行模塊圖后再運行代碼础嫡,這可能會導(dǎo)致初始頁面加載時間過長;按需加載可以提高初始加載時的性能

    form.addEventListener("submit", e => {
      e.preventDefault();
      import("/modules/cakeFactory.js")
        .then((module) => {
          // Do something with the module.
          module.oven.makeCupcake("sprinkles");
          module.oven.makeMuffin("large");
        });
    });
    
    let module = await import("/modules/cakeFactory.js");
    
  • 服務(wù)器模塊:node 15.3.0開始支持js-modules(npm)

  • Classes With <u>Constructors, Getters & Setters</u>:

    class Cake{
    
        // We can define the body of a class" constructor
        // function by using the keyword "constructor" 
        // with a list of class variables.
        constructor( name, toppings, price, cakeSize ){
            this.name = name;
            this.cakeSize = cakeSize;
            this.toppings = toppings;
            this.price = price;
        }
    
        // As a part of ES2015+ efforts to decrease the unnecessary
        // use of "function" for everything, you'll notice that it's
        // dropped for cases such as the following. Here an identifier
        // followed by an argument list and a body defines a new method
    
        addTopping( topping ){
            this.toppings.push( topping );
        }
    
        // Getters can be defined by declaring get before
        // an identifier/method name and a curly body.
        get allToppings(){
            return this.toppings;
        }
    
        get qualifiesForDiscount(){
            return this.price > 5;
        }
    
        // Similar to getters, setters can be defined by using
        // the "set" keyword before an identifier
        set cakeSize( size ){
            if ( size < 0){
                throw "Cake must be a valid size - either small, medium or large";
            }
           this._cakeSize = size;//寫成“cakeSize”會報錯“ Maximum call stack size exceeded”
        }
    }
    
    // Usage
    let cake = new Cake( "chocolate", ["chocolate chips"], 5, "large" );
    
    // 繼承
    class BirthdayCake extends Cake {
      surprise() {
        console.log(`Happy Birthday!`);
      }
    }
    
    let birthdayCake = new BirthdayCake( "chocolate", ["chocolate chips"], 5, "large" );
    birthdayCake.surprise();
    
    class Cookies {
      constructor(flavor) {
        this.flavor = flavor;
      }
    
      showTitle() {
        console.log(`The flavor of this cookie is ${this.flavor}.`);
      }
    }
    
    class FavoriteCookie extends Cookies {
      showTitle() { 
        // super 調(diào)用父類的構(gòu)造函數(shù)
        super.showTitle();
        console.log(`${this.flavor} is amazing.`);
      }
    }
    
    let myCookie = new FavoriteCookie('chocolate');
    myCookie.showTitle();
    
    class CookieWithPrivateField {
    // 創(chuàng)建私有類字段
      #privateField;
    }
    
    class CookieWithPrivateMethod {
      #privateMethod() {
        return 'delicious cookies';
      }
    }
    

Anti-Patterns

  1. 描述對導(dǎo)致不良情況發(fā)生的特定問題的<u>不良解決方案</u>

  2. 描述<u>如何擺脫上述情況</u>以及如何從那里找到一個好的解決方案

每個設(shè)計都始于努力去解決問題和其解決方案之間的適應(yīng)性。在程序投入生產(chǎn)并準備進入維護模式之后榴鼎,創(chuàng)建anti-patterns可以避免發(fā)生常見的錯誤伯诬,重構(gòu)代碼時可以使解決方案的整體質(zhì)量立即得到提高。

總而言之巫财,反模式是一個值得記錄的糟糕設(shè)計盗似。 JavaScript 中的反模式示例如下:

  • 通過在全局上下文中定義大量變量來污染全局命名空間

  • 將字符串而不是函數(shù)傳遞給 setTimeout 或 setInterval,因為這會在內(nèi)部觸發(fā) eval() 的使用

  • 修改 Object 類原型

  • 在內(nèi)聯(lián)表單中使用 JavaScript

  • 嚴重濫用document.write平项,像 document.createElement 這樣的原生 DOM 替代品更合適

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載赫舒,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末闽瓢,一起剝皮案震驚了整個濱河市接癌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扣讼,老刑警劉巖缺猛,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異椭符,居然都是意外死亡荔燎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門销钝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來有咨,“玉大人,你說我怎么就攤上這事曙搬∷だ簦” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵纵装,是天一觀的道長。 經(jīng)常有香客問我据某,道長橡娄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任癣籽,我火速辦了婚禮挽唉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘筷狼。我一直安慰自己瓶籽,他們只是感情好,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布埂材。 她就那樣靜靜地躺著塑顺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上严拒,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天扬绪,我揣著相機與錄音,去河邊找鬼裤唠。 笑死挤牛,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的种蘸。 我是一名探鬼主播墓赴,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼航瞭!你這毒婦竟也來了竣蹦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤沧奴,失蹤者是張志新(化名)和其女友劉穎痘括,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滔吠,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡纲菌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了疮绷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翰舌。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖冬骚,靈堂內(nèi)的尸體忽然破棺而出椅贱,到底是詐尸還是另有隱情,我是刑警寧澤只冻,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布庇麦,位于F島的核電站,受9級特大地震影響喜德,放射性物質(zhì)發(fā)生泄漏山橄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一舍悯、第九天 我趴在偏房一處隱蔽的房頂上張望航棱。 院中可真熱鬧,春花似錦萌衬、人聲如沸饮醇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽朴艰。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呵晚,已是汗流浹背蜘腌。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留饵隙,地道東北人撮珠。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像金矛,于是被迫代替她去往敵國和親芯急。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

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