parametr metody

0

Potrzebuję podać do metody zmienną będącą parametrem definiującym działanie metody. Przykładowo załóżmy, że mam metodę działanie i parametr typ:

public double działanie(int typ, double a, double b){
        double wynik = 0;
        if(typ==0){
            wynik = a+b;
        }
        if(typ==1){
            wynik = a*b;
        }
        return wynik;
    }

Pytanie jest o to jak to robić dobrze i elegancko, jakie są w tej kwestii wzorce?

Oczywiście podany przykład pewnie lepiej by było rozbić na dwie metody (np. add i mul) ale chodzi mi o ogólne podejście do tematu, kiedy metoda jest jakimś większym kodem, i jakiś parametr decyduje o szczegółach algorytmu w tej metodzie.

No bo można określić typ jako int i założyć, że przyjmuje wartości 0,1,2,....
Można by też zdefiniować go jako String i założyć, że przyjmuje wartości "add", "mul" itd...
Czy może można albo powinno się to zrobić jakoś inaczej?

1

Wzorzec projektowy command się nada idealnie.

Jako typ dajesz obiekt i jeśli będzie obiektem mul, to będzie mnożyć dwa parametry i tak samo z resztą.

Ewentualnie możesz wstawić funkcje w tablice['add','sub','mul','div'] i potem jak tab[instruction](a, b);
Polimorfizm tablicowy.

0

A czemu nie mozesz zrobic:

public double calculate(BiFunction<Double, Double, Double> operation, double a, double b){
    return operation.apply(a,b);
}

I wywoływać np.:

double x = 2.0;
double y = 3.0;
calculate((a,b)->a+b, x,y);
calculate((a,b)->a*b, x,y);

Jeśli bardzo chcesz to te funkcje możesz wrzucic do jakiegoś Map<String, BiFunction<Double, Double, Double>> albo EnumMap<OperationType, BiFunction<Double, Double, Double>>

0

zamiast
BiFunction<Double, Double, Double> można napisać BinaryOperator<Double>

1

@Shalom'a odpowiedz mi sie bardzo podoba, a takie bardziej prymitywne rozwiazanie, mozna chyba dac enum na rodzaje operacji i switch case, do okreslania co wykonac?

0

Enum to jest to o co mi chodziło!

Ja w swoim amatorskich przyzwyczajeniach najczęściej podawałem w takich przypadkach do metody parametr w postaci np. int, który dla określonych wartości definiował szczegóły wykonania metody, przykładowo:
int parametr ;
jeśli parametr==0 to rob cośtam
jeśli parametr==1 to rób cośtam innego

ale właśnie Enum chyba jest bardziej eleganckim i czytelnym sposobem i o taka podpowiedź własnie mi chodziło, dzięki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1