Как уменьшить сложность этого оператора if в Javascript? - PullRequest
0 голосов
/ 04 марта 2020

У меня есть сценарий ниже, который имеет несколько условий if else.

Сложность приведенного ниже кода cyclomati c отображается как 7.

Есть ли лучший способ написать приведенный ниже фрагмент кода с использованием Javascript, что снижает сложность кода?

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();

Ответы [ 5 ]

5 голосов
/ 04 марта 2020

Один из возможных вариантов:

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`)

1 голос
/ 04 марта 2020
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/, число цикломати c для этой функции равно 2.

1 голос
/ 04 марта 2020

Вы можете сначала получить дату 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();
0 голосов
/ 04 марта 2020

Там может быть несколько возможных ответов на этот подход. Одна вещь, которую вы могли бы сделать, это сохранить состояние без оценки. Поэтому вместо разбора даты в выражении условия ее нужно проанализировать перед сравнением. После этого вы можете поставить наиболее частое условие, которое, по вашему мнению, часто бывает, в качестве первого условия и нарушить другие условия с использованием подхода бинарного поиска. Рассмотрим следующий фрагмент кода:

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();

Обратите внимание на то, как условные выражения разбиваются на части с использованием техники разбиения. Или вы можете использовать переключатель вместо условных. Было обнаружено, что случай переключения требует меньших дополнительных затрат на последующие условия по сравнению с условными операциями if-else. Рассмотрим следующий фрагмент:

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();
0 голосов
/ 04 марта 2020

Может быть, вам следует написать «чтобы уменьшить код» или «чтобы сделать код лучше». В этом нет никаких операторов 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();
...