Лучше, чем использовать несколько, если - PullRequest
1 голос
/ 02 августа 2020

У меня простая проблема: мне нужно бросить два набора кубиков. Для каждого числа, возможного в первом броске, есть набор условий, которые я затем сравниваю со вторым броском. Условия для каждого броска разные.

Проблема, для меня, в том, что что-то подобное, повторенное примерно тридцать раз, кажется грубым занятием для моего кода: что мне делать? Есть ли более элегантный способ сделать это? Я думал о чем-то вроде этого:

    class Result {
        constructor(firstRoll, secondRollMin, secondRollMax, output) {
            this.firstRoll;
            this.secondRollMin;
            this.secondRollMax;
            this.output;
        }
    }

, а затем проверял рулоны на соответствие свойств в наборе объектов, но я не уверен, что, честно говоря, лучше. Приветствуются любые мысли.

Ответы [ 4 ]

4 голосов
/ 02 августа 2020

Небольшое улучшение, но вам нужно только проверить верхнюю границу диапазона в каждой подпоследовательности else if:

if (roll == 3) {
    if (secondRoll < 5) {
       do this
    }
    else if (secondRoll < 10) {  // secondRoll must be >= 5 already
       do this
    }
    else {
       do this
    }
}
1 голос
/ 02 августа 2020

Как насчет создания ключа для комбинации и немного попроще if/else? Вы можете комбинировать любую комбинацию с одинаковым действием.

const combo = `${roll}-${secondRoll}`;

if (['1-1', '1-2', '1-3', '3-4', '3-5', '3-6'].includes(combo) {
  // Do this
} else if (['1-4', '1-5', '1-6', '3-1', '3-2', '3-3'].includes(combo) {
  // Do this
// ...
} else if (['6-4', '6-5', '6-6'].includes(combo) {
  // Do this
}

Или создать switch/case:

const combo = `${roll}-${secondRoll}`;

switch (combo) {
  case '1-1':
  case '1-2':
  case '1-3':
  case '3-4':
  case '4-5':
  case '5-6':
    // Do this
    break;
  case '1-4':
  case '1-5':
  case '1-6':
  case '3-1':
  case '4-2':
  case '5-3':
    // Do this
    break;
  // ...
  case '6-4':
  case '6-5':
  case '6-6':
    // Do this
    break;
}
1 голос
/ 02 августа 2020

Используйте Switch для упрощения

switch (roll) {
    case 1-4: 
        // Do something.
        break;
    case 5-8: 
        // Do something.
        break;
    case 9-11: 
        // Do something.
        break;
    default:
        break;
}
0 голосов
/ 02 августа 2020

Вы можете попробовать сочетание if, else и switch блоков. Вы можете использовать разные методы вызова в зависимости от первого броска. Оператор switch обычно более эффективен, чем набор вложенных if.

class Result {
        constructor(firstRoll, secondRollMin, secondRollMax, output) {
            this.firstRoll;
            this.secondRollMin;
            this.secondRollMax;
            this.output;


            switch(firstRoll){
                case 1:
                    this.output = oneToXTime(secondRollMin,secondRollMin)
                    break;
                case 2:
                    this.output = twoToXTime(secondRollMin,secondRollMax)
                    break;
                case 3:
                    this.output = threeToXTime(secondRollMin,secondRollMax)
                    break;
                case 4:
                    this.output = fourToXTime(secondRollMin,secondRollMax)
                    break;
                case 5:
                    this.output = fiveToXTime(secondRollMin,secondRollMax)
                    break;
                case 6:
                    this.output = sixToXTime(secondRollMin,secondRollMax)
                    break;
            }
        }

          static String oneToXTime(secondRollMin,secondRollMin) {
            String result = ""

            if (secondRollMin < 5) {
               result = "My result"
            }
            else if (secondRollMin < 10) {
                result = "My result 2"
            }

            return result
        } 

         static String twoToXTime(secondRollMin,secondRollMin) {
            String result = ""
            if (secondRollMin < 5) {
               result = "My result"
            }
            else if (secondRollMin < 10) {
                result = "My result 2"
            }
            return result
        } 

         static String threeToXTime(secondRollMin,secondRollMin) {
          // Same as above...
        } 

        static Stfing fourToXTime(secondRollMin,secondRollMin) {
          // Same as above...
        } 

        static String fiveToXTime(secondRollMin,secondRollMin) {
          // Same as above...
        } 

        static String sixToXTime(secondRollMin,secondRollMin) {
          // Same as above...
        } 

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...