Полиморфизм вместо условного перехода с дженериками - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть код. Я нашел несколько постов на тему «Рефакторинг кода в ООП-коде без использования операторов if / else, switch / case или ?. Пожалуйста, помогите мне использовать его с обобщениями. Я потратил слишком много времени, но пока не могу найти решение. А можете ли вы дать свое видение рефакторина в ООП?

public class Main {

    public static void main(String[] args) throws Exception {
        System.out.println("result is :"+function(6,4,0));
        System.out.println("result is :"+function(6,4,1));
        System.out.println("result is :"+function(6,4,2));
        System.out.println("result is :"+function(6,4,3));
        System.out.println("result is :"+function("6", "4", 0));
    }

    public static int function(int a, int b, int action) throws Exception
    {
        if (action == 0)
            return a+b;
        else if (action == 1)
            return a-b;
        else if (action == 2)
            return a*b;
        else if (action == 3)
            return a/b;
        throw new Exception();
    }

    public static String function(String a, String b, int action) throws Exception
    {
        if (action == 0)
            return a+b;
        throw new Exception();
    }

}

1 Ответ

0 голосов
/ 04 ноября 2018

Примерно так:

interface BinaryOperation<T> {
    double evaluate(T operand1, T operand2);
}

class AddOperation<T> {
    private Function<T,Double> toDouble;
    public AddOperation(Function<T,Double> toDouble){this.toDouble=toDouble;}
    public double evaluate(T operand1, T operand2){ return toDouble.apply(operand1)  + toDouble.apply(operand2); }
}

class SubOperation<T> {
    private Function<T,Double> toDouble;
    public SubOperation (Function<T,Double> toDouble){this.toDouble=toDouble;}
    public double evaluate(T operand1, T operand2){ return toDouble.apply(operand1)  - toDouble.apply(operand2); }
}

public static void main(String[] args) {
    System.out.println("result is :" + new AddOperation<>(Integer::doubleValue).evaluate(6, 4));
    System.out.println("result is :" + new AddOperation<>(Double::parseDouble).evaluate("6", "4"));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...