久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      消除if else, 讓你的代碼看起來更優(yōu)雅

      javascript欄目介紹如何消除if else, 讓你的代碼看起來更優(yōu)雅,一起來看看吧。

      消除if else, 讓你的代碼看起來更優(yōu)雅

      前言

      應(yīng)該有不少同學(xué)有遇到過充斥著if else的代碼,面對這樣的一團(tuán)亂麻,簡單粗暴地繼續(xù)增量修改常常只會讓復(fù)雜度越來越高,可讀性越來越差。那么是時候重構(gòu)了,花幾分鐘看看這篇文章, 說不定對你有一丟丟幫助。

      場景一: 根據(jù)status顯示對應(yīng)名稱

      優(yōu)化方案1:object對象

      const statusStr = {   '1': '待付款',   '2': '待發(fā)貨',   '3': '已發(fā)貨',   '4': '交易完成',   '5': '交易關(guān)閉',   'default': '', } const getStatus = (status) =>{   return statusStr[status] || statusStr['default'] }

      將判斷條件作為對象的屬性名,將處理邏輯作為對象的屬性值,在按鈕點擊的時候,通過對象屬性查找的方式來進(jìn)行邏輯判斷.

      優(yōu)化方案2: Map對象

      const statusStr = new map([   '1': ['待付款'],   '2': ['待發(fā)貨'],   '3': ['已發(fā)貨'],   '4': ['交易完成'],   '5': ['交易關(guān)閉'],   'default': [''], ]) const getStatus = (status) =>{   let actions = statusStr.get(status) || statusStr.get('default')   return  actions[0]; }

      這樣寫用到了es6里的Map對象,那么Map對象和Object對象有什么區(qū)別呢?

      一個對象通常都有自己的原型,所以一個對象總有一個"prototype"鍵。 一個對象的鍵只能是字符串或者Symbols,但一個Map的鍵可以是任意值。 你可以通過size屬性很容易地得到一個Map的鍵值對個數(shù),而對象的鍵值對個數(shù)只能手動確認(rèn)。

      場景二:多個condition對應(yīng)名稱

      現(xiàn)在把問題升級一下, 以前按鈕點擊時候只需要判斷status,現(xiàn)在還需要判斷用戶的身份:
      「舉個栗子:」

      const onButtonClick = (status,identity)=>{   if(identity == 'guest'){     if(status == 1){       //do sth     }else if(status == 2){       //do sth     }else if(status == 3){       //do sth     }else if(status == 4){       //do sth     }else if(status == 5){       //do sth     }else {       //do sth     }   }else if(identity == 'master') {     if(status == 1){       //do sth     }else if(status == 2){       //do sth     }else if(status == 3){       //do sth     }else if(status == 4){       //do sth     }else if(status == 5){       //do sth     }else {       //do sth     }   } }

      上面的例子我們可以看到,當(dāng)你的邏輯升級為二元判斷時,你的判斷量會加倍,你的代碼量也會加倍,這時怎么寫更清爽呢?

      優(yōu)化方案1: 將condition用字符拼接形式存在Map對象里

      const actions = new Map([   ['guest_1', ()=>{/*do sth*/}],   ['guest_2', ()=>{/*do sth*/}],   ['guest_3', ()=>{/*do sth*/}],   ['guest_4', ()=>{/*do sth*/}],   ['guest_5', ()=>{/*do sth*/}],   ['master_1', ()=>{/*do sth*/}],   ['master_2', ()=>{/*do sth*/}],   ['master_3', ()=>{/*do sth*/}],   ['master_4', ()=>{/*do sth*/}],   ['master_5', ()=>{/*do sth*/}],   ['default', ()=>{/*do sth*/}], ]) const onButtonClick = (identity,status)=>{   let action = actions.get(`${identity}_${status}`) || actions.get('default')   action.call(this) }

      上述代碼核心邏輯是:把兩個條件拼接成字符串,并通過以條件拼接字符串作為鍵,以處理函數(shù)作為值的Map對象進(jìn)行查找并執(zhí)行,這種寫法在多元條件判斷時候尤其好用。

      優(yōu)化方案2: 將condition用字符拼接形式存在Object對象里

      const actions = {   'guest_1':()=>{/*do sth*/},   'guest_2':()=>{/*do sth*/},   //.... } const onButtonClick = (identity,status)=>{   let action = actions[`${identity}_${status}`] || actions['default']   action.call(this) }

      優(yōu)化方案3: 將condition用Object對象形式存在Map對象里

      可能用查詢條件拼成字符串有點別扭,那還有一種方案,就是用Map對象,以O(shè)bject對象作為key:

      const actions = new Map([   [{identity:'guest',status:1},()=>{/*do sth*/}],   [{identity:'guest',status:2},()=>{/*do sth*/}],   //... ]) const onButtonClick = (identity,status)=>{   let action = [...actions].filter(([key,value])=>(key.identity == identity && key.status == status))   action.forEach(([key,value])=>value.call(this)) }

      場景三:根據(jù)status做出相應(yīng)操作

      「舉個栗子:」

      function init () {     if (isAnswer === 1) {         if (isOldUser === 1) {             // ...         } else if (isOldUser === 2) {             // ...         }     } else if (isAnswer === 2) {         if (isOldUser === 1) {             // ...         } else if (isOldUser === 2) {             // ...         }     } else if (isAnswer === 3) {         if (isOldUser === 1) {             // ...         } else if (isOldUser === 2) {             // ...         }     } }

      優(yōu)化方案1: 查找表,職責(zé)鏈查找表

      const rules = [     {         match (an, old) {if (an === 1) {return true}},         action (an, old) {         if (old === 1) {// ...}          else if (old === 2) {// ...}         }     },     {         match (an, old) { if (an === 2) {return true } },         action (an, old) {             if (old === 1) {// ...}              else if (old === 2) {// ...}         }     },     {         match (an, old) {if (an === 3) {return true}},         action (an, old) {             if (old === 1) {// ...}              else if (old === 2) {// ...}         }     } ] function init (an, old) {     for (let i = 0; i < rules.length; i++) {         // 如果返回true         if (rules[i].match(an, old)) {             rules[i].action(an, old)         }     } } init(isAnswer, isOldUser)

      雖然可能看著是治標(biāo)不治本,其實不然,init函數(shù)的復(fù)雜度大大的降低了。我們已經(jīng)把控制流程的復(fù)雜邏輯,拆分到determineAction函數(shù)中

      優(yōu)化方案2: 函數(shù)式編程

      import R from 'ramda' var fn = R.cond([   [R.equals(0),   R.always('water freezes at 0°C')],   [R.equals(100), R.always('water boils at 100°C')],   [R.T,           temp => 'nothing special happens at ' + temp + '°C'] ]); fn(0); //=> 'water freezes at 0°C' fn(50); //=> 'nothing special happens at 50°C' fn(100); //=> 'water boils at 100°C'

      場景四: 根據(jù)范圍去進(jìn)行不同處理

      「舉個栗子:」比如大家可能會遇到類似下面的需求:比如某平臺的信用分?jǐn)?shù)評級,超過700-950,就是信用極好,650-700信用優(yōu)秀,600-650信用良好,550-600信用中等,350-550信用較差。

      function showGrace(grace) {     let _level='';     if(grace>=700){         _level='信用極好'     }     else if(grace>=650){         _level='信用優(yōu)秀'     }     else if(grace>=600){         _level='信用良好'     }     else if(grace>=550){         _level='信用中等'     }     else{         _level='信用較差'     }     return _level; }

      優(yōu)化方案1: 用look-up表,把配置數(shù)據(jù)和業(yè)務(wù)邏輯分離

      function showGrace(grace,level,levelForGrace) {     for(let i=0;i<level.length;i++){         if(grace>=level[i]){             return levelForGrace[i];         }     }     //如果不存在,那么就是分?jǐn)?shù)很低,返回最后一個     return levelForGrace[levelForGrace.length-1]; } let graceForLevel=[700,650,600,550]; let levelText=['信用極好','信用優(yōu)秀','信用良好','信用中等','信用較差'];

      小結(jié)

      很多情況下我們都可以使用更靈活的方式去替代if else以及switch, 但也不是所有的if else都需要替代, 視情況而定。

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號