• 编写高质量可维护的代码之优化逻辑判断


    if else、switch case 是日常开发中最常见的条件判断语句,这种看似简单的语句,当遇到复杂的业务场景时,如果处理不善,就会出现大量的逻辑嵌套,可读性差并且难以扩展。

    编写高质量可维护的代码,我们先从最小处入手,一起来看看在前端开发过程中,可以从哪些方面来优化逻辑判断?

    JavaScript 语法篇

    1.嵌套层级优化

    function supply(fruit, quantity) {
      const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];
      // 条件 1: 水果存在
      if(fruit) {
        // 条件 2: 属于红色水果
        if(redFruits.includes(fruit)) {
          console.log('红色水果');
          // 条件 3: 水果数量大于 10 个
          if (quantity > 10) {
            console.log('数量大于 10 个');
          }
        }
      } else {
        throw new Error('没有水果啦!');
      }
    }

    分析上面的条件判断,存在三层 if 条件嵌套。

     

    如果提前 return 掉无效条件,将 if else 的多重嵌套层次减少到一层,更容易理解和维护。

    优化如下:

    function supply(fruit, quantity) {
      const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];
      if(!fruit) throw new Error('没有水果啦');     // 条件 1: 当 fruit 无效时,提前处理错误
      if(!redFruits.includes(fruit)) return// 条件 2: 当不是红色水果时,提前 return
        
      console.log('红色水果');
        
      // 条件 3: 水果数量大于 10 个
      if (quantity > 10) {
        console.log('数量大于 10 个');
      }
    }

    2.多条件分支的优化处理

    当需要枚举值处理不同的业务分支逻辑时,第一反应是写下 if else ?我们来看一下:

     

    function pick(color) {
      // 根据颜色选择水果
      if(color === 'red') {
        return ['apple', 'strawberry']; 
      } else if (color === 'yellow') {
        return ['banana', 'pineapple'];
      } else if (color === 'purple') {
        return ['grape', 'plum'];
      } else {
        return [];
      }
    }

    在上面的实现中:

    • if else 分支太多

    • if else 更适合于条件区间判断,而 switch case 更适合于具体枚举值的分支判断

     优化如下:

    function pick(color) {
      // 根据颜色选择水果
      switch (color) {
        case 'red':
          return ['apple', 'strawberry'];
        case 'yellow':
          return ['banana', 'pineapple'];
        case 'purple':
          return ['grape', 'plum'];
        default:
          return [];
      }
    }

    switch case 优化之后的代码看上去格式整齐,思路很清晰,但还是很冗长。继续优化:

    • 借助 Object 的 { key: value } 结构,我们可以在 Object 中枚举所有的情况,然后将 key 作为索引,直接通过 Object.key 或者 Object[key] 来获取内容

    const fruitColor = {                        
      red: ['apple', 'strawberry'],
      yellow: ['banana', 'pineapple'],
      purple: ['grape', 'plum'],
    }
    function pick(color) {
      return fruitColor[color] || [];
    }

    使用 Map 数据结构,真正的 (key, value) 键值对结构:

    const fruitColor = new Map()
    .set('red', ['apple', 'strawberry'])
    .set('yellow', ['banana', 'pineapple'])
    .set('purple', ['grape', 'plum']);
    
    function pick(color) {
      return fruitColor.get(color) || [];
    }

    总结

     

    以上我们总结了一些常见的逻辑判断优化技巧。当然,编写高质量可维护的代码,除了逻辑判断优化,还需要有清晰的注释、含义明确的变量命名、合理的代码结构拆分、逻辑分层解耦、以及更高层次的贴合业务的逻辑抽象等等,相信各位在这方面也有自己的一些心得,欢迎一起留言讨论~

    转载自infoQ

     

     

     

     

     

     

     

     

    stay hungry stay foolish!
  • 相关阅读:
    linux网络编程-socket(36)
    linux网络编程-socket(2)
    linux网络编程-socket(1)
    jni不通过线程c回调java的函数
    jni 字符串的梳理 2 字符串的处理操作
    jni 字符串的梳理
    android studio 中jni底层日志的打印
    事件冒泡与事件捕获
    盒子模型
    比较好的前端面试题
  • 原文地址:https://www.cnblogs.com/shog808/p/14692644.html
Copyright © 2020-2023  润新知