【问题标题】:How to reduce the complexity of this if else statements in Javascript?如何降低 JavaScript 中 if else 语句的复杂性?
【发布时间】:2020-03-04 09:25:10
【问题描述】:

我有以下场景,它有多个 if else 条件。

以下代码的圈复杂度显示为 7。

有没有更好的方法来使用 Javascript 编写下面的代码 sn-p 来降低代码的复杂性?

function setTime() {

var currentTime = "3/4/2020, 2:53:42 PM"
var selectedTime = "3/5/2020, 2:53:42 PM"

if( Date.parse(currentTime) < Date.parse(selectedTime)) {
    callThisMethod('Current time less than selected time');
} else if (Date.parse(currentTime) > Date.parse(selectedTime)) {
    callThisMethod('Current time Greater than selected time');
} else {
    callThisMethod('Current time is equal to selected time');
}
}

function callThisMethod(message) {
 console.log(message);
}

setTime();

【问题讨论】:

  • 顺便提一下,如果您的代码有效,也许合适的地方是 CodeReview codereview.stackexchange.com
  • 抱歉回复晚了。是的,它对我有用。非常感谢。

标签: javascript cyclomatic-complexity


【解决方案1】:

可能的选项之一:

const currentTime = new Date("3/4/2020, 2:53:42 PM"),
      selectedTime = new Date("3/5/2020, 2:53:42 PM")

callThisMethod(`Current time is ${currentTime < selectedTime ? 'less than' : currentTime > selectedTime ? 'greater than' : 'equal to'} selected time`)

【讨论】:

    【解决方案2】:

    您可以先获取 ISO 日期,然后比较此日期。

    function setTime() {
      var currentTime = "3/4/2020, 2:53:42 PM",
          selectedTime = "3/5/2020, 2:53:42 PM",
          current = new Date(currentTime).toISOString(),
          selected =  new Date(selectedTime).toISOString();
    
      if (current < selected) {
        callThisMethod('Current time less than selected time');
      } else if (current > selected) {
        callThisMethod('Current time Greater than selected time');
      } else {
        callThisMethod('Current time is equal to selected time');
      }
    }
    
    function callThisMethod(message) {
      console.log(message);
    }
    
    setTime();

    【讨论】:

      【解决方案3】:
      function setTime() {
      
          var currentTime = "3/4/2020, 2:53:42 PM";
          var selectedTime = "3/5/2020, 2:53:42 PM";
          let a = new Date(currentTime).getTime();
          let b = new Date(selectedTime).getTime();
          let str = ['less than','is equal','greater than'];
          let n = (a-b)/Math.abs(a-b) || 0;
      
          callThisMethod(`Current time ${str[n]} selected time`);
      }
      
      function callThisMethod(message) {
       console.log(message);
      }
      
      setTime();
      

      根据https://jshint.com/,这个函数的圈复杂度数是2。

      【讨论】:

        【解决方案4】:

        也许你应该写“减少代码”或“制作更好的代码”。这个 if 或 else if 语句并不复杂。

        其实,你为什么不 console.log 来自 if/else if 的消息,你避免调用另一个函数?

        function setTime() {
              var currentTime = "3/4/2020, 2:53:42 PM",
                  selectedTime = "3/5/2020, 2:53:42 PM",
                  current = new Date(currentTime).toISOString(),
                  selected =  new Date(selectedTime).toISOString();
        
              if (current < selected) {
                console.log('Current time less than selected time');
              } else if (current > selected) {
                console.log('Current time Greater than selected time')
              } else {
                console.log('Current time is equal to selected time');
              }
            }
        
            setTime();
        

        【讨论】:

          【解决方案5】:

          这种方法可能有几种可能的答案。 您可以做的一件事是使条件免于评估。因此,不是在条件表达式中解析日期,而是在比较之前解析它。之后,您可以将最常见的条件(您认为可能经常出现的情况)作为第一个条件,并使用二进制搜索方法打破其他条件。考虑以下代码 sn-p:

          function setTime() {
              var currentTime = Date.parse("3/4/2020, 2:53:42 PM")
              var selectedTime = Date.parse("3/5/2020, 2:53:42 PM")
              if(currentTime < selectedTime) {
                 callThisMethod('Current time less than selected time');
              } else {
                 if (currentTime > selectedTime) {
                   callThisMethod('Current time Greater than selected time');
                 } else {
                    callThisMethod('Current time is equal to selected time');
                   }
                }
          }
          
          function callThisMethod(message) {
           console.log(message);
          }
          
          setTime();
          

          注意条件句是如何使用拆分技术分解的。 或者你可以使用 switch case 而不是条件。与 if-else 条件相比,已发现 Switch case 在后续条件上的增量成本更少。 考虑以下 sn-p:

          function setTime() {
                  var currentTime = Date.parse("3/4/2020, 2:53:42 PM")
                  var selectedTime = Date.parse("3/5/2020, 2:53:42 PM")
                  switch(true){
                      case (currentTime > selectedTime):
                          callThisMethod('Current time Greater than selected time');
                          break;
                      case (currentTime < selectedTime):
                          callThisMethod('Current time less than selected time')
                          break;
                      default:
                           callThisMethod('Current time is equal to selected time')    
          }
              }
          
              function callThisMethod(message) {
               console.log(message);
              }
          
              setTime();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-04-14
            • 2021-09-08
            • 1970-01-01
            • 1970-01-01
            • 2021-03-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多