Упростите код, чтобы обнулить слишком много операторов if-else - PullRequest
0 голосов
/ 20 января 2019

Я пытался разработать систему вознаграждения на Java, которая будет вознаграждать пользователей на основе их текущей информации о транзакциях.Я должен вернуть разные веса вознаграждения на основе определенных критериев, которым соответствует транзакция. Это пример кода для класса, который присваивает веса вознаграждения.

class RewardWeight {

    #condition 1
    public boolean is50thTransactionOfDay(Transaction t){
        //logic to find 50th Transaction
    }

    #condition 2
    public boolean is200thTransactionOfWeek(Transaction t){
        //logic to find 200th Transaction
    }


    #condition 3
    public boolean isTransactionAbove2000(Transaction t){
        //logic goes here
    }

    #condition 4
    public boolean isTransactionRepeated(Transaction t){
        //logic goes here
    }

    public int getRewardWeight(){
        // if condition 1 and condition 2 satisfied return 1
        // if condition 2 and condition 3 satisfied return 2
        // if condition 1 and condition 3 satisfied return 3
        // if condition 3 and condition 4 satisfied return 4
        // if condition 3 and condition 4 satisfied return 8
        // if condition 1 , 2 and 3 satisfied return 5
        // if condition 1 , 2 and 3,4 satisfied return 6
    }
}

Есть ли способ вернуть разные веса, как в

getRewardWeight ()

, не имея слишком много условий if else.Кроме того, он должен быть гибким, чтобы поддерживать любую новую функцию. (, например, новый критерий вознаграждения ).

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Вы можете реализовать с помощью шаблона проектирования Chain of Responsibility:

    public abstract class Condition {

    private final boolean condition1;
    private final boolean condition2;
    private Condition next;

    public Condition(boolean condition1, boolean condition2) {
        this.condition1 = condition1;
        this.condition2 = condition2;
    }

    public void setNext(Condition next) {
        this.next = next;
    }

    public abstract void execute();

    public boolean isCondition1() {
        return condition1;
    }

    public boolean isCondition2() {
        return condition2;
    }

    public Condition getNext() {
        return next;
    }
}

Первый класс реализации Condition

  public final class Condition12 extends Condition {

    public Condition12(boolean condition1, boolean condition2) {
        super(condition1, condition2);
    }

    @Override
    public void execute() {
        if (isCondition1() && isCondition2()) {
            System.out.println(1);
        }
        getNext().execute();
    }
}

Второй класс реализации Condition

  public final class Condition23 extends Condition {

    public Condition23(boolean condition1, boolean condition2) {
        super(condition1, condition2);
    }

    @Override
    public void execute() {
        if (isCondition1() && isCondition2()) {
            System.out.println(2);
        }
        getNext().execute();
    }
}

Третий класс реализации Condition

  public final class Condition34 extends Condition {

    public Condition34(boolean condition1, boolean condition2) {
        super(condition1, condition2);
    }

    @Override
    public void execute() {
        if (isCondition1() && isCondition2()) {
            System.out.println(3);
        }
    }
}

Тестовая программа

   public class TestProgram {

    public static void main(String[] args) {
        //Case1
        Condition condition12 = new Condition12(true, false);
        Condition condition23 = new Condition23(true, true);
        Condition condition34 = new Condition34(true, false);

        condition12.setNext(condition23);
        condition23.setNext(condition34);
        // Output is 2
        condition12.execute();

        //Case2
        condition23 = new Condition23(false, true);
        condition34 = new Condition34(true, true);

        condition12.setNext(condition23);
        condition23.setNext(condition34);
        // Output is 3
        condition12.execute();
    }
}

Сообщите мне, если у вас возникнут дополнительные вопросы.

0 голосов
/ 21 января 2019

Не уверен, что вы можете уменьшить количество операторов if, но лучше всего улучшить удобство обслуживания (поскольку вы ожидаете большего количества критериев вознаграждения).

Вместо 5 различных функций вознаграждения создайте простую ипройти номер критерия.В этой функции вы можете снова разделить их с помощью оператора switch.Это не уменьшает if, но у вас есть одна точка входа, поэтому вы можете вызывать критерии вознаграждения в цикле for.Пусть цикл for возвращает значения в массиве.Чем вы можете объединить значения массива в одно число, чтобы найти окончательную награду.

Как псевдокод:

class RewardWeight {
    public boolean checkReward(int number)
    {
        bool reward = False
        switch (number)
        {
        case 0: // 200th order
           // Logic or call function
        case 1: // Next
           ...
        }
        return reward
    }

Альтернатива 1:

    bool weights[MAX_REWARDS];

    public int getRewardWeight() {
        for (int reward = 0; reward < MAX_REWARDS; reward++) { 
            weights[reward] = checkReward(reward) ? 1 : 0;

        // Here you can  use all if statements for the conditions.

Альтернатива 2:

Если у вас будет действительно большой список, вы можете поместить объединенный коэффициент в одно значение и создать большой массив, содержащий весовые коэффициенты:

    Rewards[] = { 1, 6, 3, 4, 6, ..., 25, 2, 3, 4, 3} // Means e.g.
        // Assuming there are 4 conditions, there are 16 values, the 5th value 
        // from the end
        // which is 0101 binary, means: condition 1 false, condition 2 true,
        // condition 3 false, condition 4 true has value 25.

    public int getRewardWeight() {
        for (int reward = 0; reward < MAX_REWARDS; reward++) { 
            weights += Power(2, reward) * checkReward(reward) ? 1 : 0;

        return Rewards[weights];

Обратите внимание:Альтернатива 2 может привести к большому массиву.

...