Ho bisogno di usare le istanze che rappresentano le funzioni matematiche insieme ai loro parametri per consentire la loro valutazione. Posso prendere 2 approcci:
1: ha una singola classe che rappresenta tutte le funzioni matematiche:
class TrigonometricFunction extends Function {
private double param;
private String name;
public TrigonometricFunction(double param, String name) {
this.param = param;
this.name = name;
}
public double evaluate() {
double radParam = toRadians(param);
if ("sin".equals(name)) {
return Math.sin(radParam);
}
if ("cos".equals(name)) {
return Math.sin(radParam);
}
// about 10 more functions would go here...
}
}
Vantaggi di questo approccio:
- devono creare e testare solo una singola classe
- nessuna duplicazione del codice (conversione di parametri in radianti)
Svantaggi:
- valutazione inefficiente (devi fare molti confronti tra stringhe in evaluate () a seconda del nome della funzione), ma sarebbe anche un problema?
- sembra brutto e non sembra giusto
2: avere una classe separata per ogni funzione matematica:
class SinFunction extends Function {
private double param;
public SinFunction(double param) {
this.param = param;
}
public double evaluate() {
double radParam = toRadians(param);
return Math.sin(radParam);
}
}
class CosFunction extends Function {
private double param;
public CosFunction(double param) {
this.param = param;
}
public double evaluate() {
double radParam = toRadians(param);
return Math.cos(radParam);
}
}
I vantaggi:
- le piccole classi, una singola responsabilità, sembrano solo migliori
- valutazione più efficace come nella prima soluzione (senza confronti tra stringhe) (?)
Svantaggi:
- devono implementare e testare un sacco di piccole classi che sembrano fondamentalmente le stesse
- codice duplicato (chiamando la conversione in radianti in ogni classe)
- più costoso per creare istanze (devi fare il confronto String qui).
Quale approccio è migliore e perché? O hai una soluzione migliore?