Ti faccio un esempio:
nella calcolatrice devi decidere che operazione eseguire giusto. questo lo puoi fare con un switch case:
- Code: Select all
switch (scelta) {
case 1: somma();break;
case 2: molt(); break;
...
}
la versione OO è quella che crea una classe astratta operazione con un metodo "exec()", ad esempio e ogni operazione eredita da questa classe
ad esempio:
- Code: Select all
interface operazione { public double exec(); }
class somma implements operazione { ... }
class molt implements operazione { ... }
main()
Operazione o=getOperazioneFromInput();
o.exec();
end
in questo modo non uso un if o un case per selezionare l'operazione ma il fatto che l'oggetto o può essere instanziato in modo diverso (se voglio la somma con la classe Somma, se voglio Molt la class Molt... ecc..). L'ovvio vantaggio è che posso aggiungere nuove operazioni modificando solo il metodo factory (ciò quello che restituisce l'istanza "opportuna" di operazione, ad esempio getOperationFromInput()) ed aggiungendo un nuova classe che è un'unità logica a parte e quindi non influenza il codice preesistente se non in un unico punto ben preciso!
I switch e gli if annidati tendono a creare replicazione del codice! quindi qualcuni li paragona ai goto per la programmazione strutturata.
La domanda potrebbe essere quindi se l'if sta dentro il metodo factory. In realtà basta UN SOLO if perchè posso ad esempio:
- Code: Select all
List<Operation> ops = new ArrayList();
public static getOperationFromInput(String x) {
for (Operation o : ops)
if(o.getSymbol().equals(x)) return o;
return null;
}
}
Invece di scrive 4, 5, 20 case o if ne scrivo uno solo ed è l'unico responsabile dell'stanziazione degli oggetti Operation. Le probabilità di errore o incoerrenza fra i vari casi sono ridotte e limitate alla specifica classe (e non a uno dei 50 case!).
ovviamente la soluzione con i switch è piu' adatta per casi semplici (come il progetto originale). Ma non si sà mai che cosa possa diventare un programma nel tempo. Io stesso quando ho iniziato la calcolatrice non pensavo di spingermi così in la!
PS. Il codice è un po farlocco, ma sono in biblio cn una tastera dura come poche cose!