代码之家  ›  专栏  ›  技术社区  ›  dragonmnl

switch/if-elseif-else函数是否应该有一个默认的case,如果处理程序中没有匹配和处理的case,则返回null?

  •  1
  • dragonmnl  · 技术社区  · 4 年前

    案例1(抛出错误是没有开关案例匹配):

    function getColorName(c) {
      switch(c) {
          case Color.Red:
              return 'red, red wine';
          case Color.Green:
              return 'greenday';
          case Color.Blue:
              return "Im blue, daba dee daba";
          default:
              throw new Error('error');
      }
    }
    
    getColorName(Color.Yellow); // this results in an error thrown
    

    案例2(默认情况下返回null,在调用者中处理):

    function getColorName(c) {
      switch(c) {
          case Color.Red:
              return 'red, red wine';
          case Color.Green:
              return 'greenday';
          case Color.Blue:
              return "Im blue, daba dee daba";
          default:
              return null;
      }
    }
    
    if (getColorName(Color.Yellow)) {
      // do stuff here 
    }
    

    这可能不是一个完美的例子。然而, 这个问题的目标是了解在存在切换逻辑的情况下,如何在避免过度复杂的同时覆盖尽可能多的用例?

    虽然不在问题范围内,但作为澄清可能用例的一种手段,这种转换将通过以下方式实现

    1. 用一个 switch (如上所述)
    2. 作为一个 if-elseif-else 功能(如果开关情况复杂或只有少数情况)

    if-elseif else示例 (供参考):

    function getColorName(c) {
        if (Color.Red) { 
           return 'red, red wine';
        }
        else if (Color.Green) {
           //... 
        }
        // etc. (--cut--)
        else {
           return null;
        }
    }
    
    1 回复  |  直到 4 年前
        1
  •  1
  •   N Kiran Kumar Kowlgi    4 年前

    我最喜欢的练习是投掷 例外 不再返回 无效的 并拥有 来电者 函数决定接下来的步骤。你的 打电话 函数应该只关心它得到的数据输入,它是否有合适的信息基础来完成它的工作,并返回一个有效的响应基础作为输入,或者让 来电者 函数知道它无法处理输入。

    在您的示例中,返回一个 无效的 这意味着你的调用者函数必须对另一个条件循环进行null处理,然后将null进一步返回给它自己的调用者函数或执行其他操作。这使得代码非常繁琐,而特定的异常可以根据需要很容易地向上传播,并被证明对日志记录和修复问题非常有用。