Как уменьшить if else операторов в этом коде? - PullRequest
1 голос
/ 27 октября 2019

Код здесь в основном используется для определения строки на основе броска кубика. Есть много утверждений в этом, я действительно мог бы использовать некоторую помощь в сокращении этого. Я посмотрел на некоторые методы в Интернете, но они не подходят.

public String generatePassageSection(){
        int roll = roll();
        if(roll<=2 && roll>=1) 
        {
            return "passage goes straight for 10 feet.";
        }

        else if(roll<=5 && roll>=3) 
        {
            return "passage ends in door to a chamber.";
        }

        else if(roll<=7 && roll>=6) 
        {
            return "door to right (main passage continues straight for 10 ft)";
        }

        else if(roll<=9 && roll>=8) 
        {
            return "door to left (main passage continues straight for 10 ft)";
        }

        else if(roll<=11 && roll>=10) 
        {
            return "passage turns to left and continues for 10 ft";
        }

        else if(roll<=13 && roll>=12) 
        {
            return "passage turns to right and continues for 10 ft";
        }

        else if(roll<=16 && roll>=14) 
        {
            return "passage ends in door to chamber";
        }

        else if(roll==17) 
        {
            return "Stairs, (passage continues straight for 10 ft)";
        }

        else if (roll<=19 && roll>=18) 
        {
            return "Dead end";
        }

        else if(roll==20)
        {
            return "Wandering Monster (passage continues straight for 10 ft)";
        }

        else 
        {
            return null;
        }

Ответы [ 3 ]

3 голосов
/ 27 октября 2019

Это действительно отличный вопрос. Так как каждый if-else одинаков;Вы проверяете, находится ли какой-то бросок в определенных границах, а затем возвращаете строку, вы можете просто использовать перечисление. Можно улучшить имя перечисления, а также имена элементов относительно того, над чем вы работаете и представляете эти данные.

    public String generatePassageSection() {
        int roll = roll();

        Message message = Stream.of(Message.values()).filter(m -> m.inBounds(roll)).findAny().orElse(null);

        return message == null ? null : message.message;
    }

    enum Message {
        FIRST(1, 2, "passage goes straight for 10 feed."),
        SECOND(3, 5, "passage ends in the door to a chamber."),
        THIRD(6, 7, "door to right (main passage continues straight for 10 ft)"),
        FOURTH(9, 10, "door to left (main passage continues straight for 10 ft)"),
        FIFTH(10, 11, "passage turns to left and continues for 10 ft"),
        SIXTH(12, 13, "passage turns to right and continues for 10 ft"),
        SEVENTH(14, 16, "passage ends in door to chamber"),
        EIGHTH(17, 17, "Stairs, (passage continues straight for 10 ft)"),
        NINTH(18, 19, "Dead end"),
        TENTH(20, 20, "Wandering Monster (passage continues straight for 10 ft)");

        ;
        private final int minimumRollInclusive;

        private final int maximumRollInclusive;

        private final String message;

        Message(int minimumRollInclusive, int maximumRollInclusive, String message) {
            this.minimumRollInclusive = minimumRollInclusive;
            this.maximumRollInclusive = maximumRollInclusive;
            this.message = message;
        }

        boolean inBounds(int roll) {
            return roll >= minimumRollInclusive && roll <= maximumRollInclusive;
        }

    }

    int roll() {
        return 0; // use ur code
    }

Кроме того, следует отметить, что значения Enum # создают новый объект массива каждый раз, когда он вызывается, поэтому его стоит кэшировать.

1 голос
/ 27 октября 2019

Если вы просто хотите уменьшить количество операторов if, вы можете добавить массив возможных результатов, индексировать каждый результат при соответствующем броске костей, а затем возвращать значение по этому индексу. Я не собираюсь выписывать все это для вас, но это будет выглядеть примерно так:

public String generatePassageSection(String[] diceRolls){
   return diceRolls[roll()];
}
1 голос
/ 27 октября 2019

Предпочитать структуры данных над кодом.

final private static String text[] = {
    "passage goes straight for 10 feet.", // 1, 2
    "passage ends in door to a chamber.", // 3, 4, 5
    "door to right (main passage continues straight for 10 ft)", // 6, 7
    "door to left (main passage continues straight for 10 ft)", // 8, 9
    "passage turns to left and continues for 10 ft", // 10, 11
    "passage turns to right and continues for 10 ft", // 12, 13
    "passage ends in door to chamber", // 14, 15, 16
    "Stairs, (passage continues straight for 10 ft)", // 17
    "Dead end", // 18, 19
    "Wandering Monster (passage continues straight for 10 ft)" // 20
}

final private static int index[] = {
    0, 0, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 8, 8, 9
}

public String generatePassageSection() {
    return text[index[roll()-1]];
}

Построенный вручную индексный массив имеет неявные предположения о порядке и содержимом текстового массива. Я считаю это разумным с учетом обстоятельств и масштабов этой рутины;Я не рекомендую это в качестве общей практики.

Это неявно предполагает, что roll (), как известно, надежно возвращает результат в диапазоне от 1 до 20 включительно;если вы не можете доверять этому, следует добавить проверку ошибок.

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