Programma di valutazione delle espressioni

Programmazione con la JVM.

Moderator: Falcon

Programma di valutazione delle espressioni

Postby iceseyes on Mon Oct 30, 2006 3:34 am

Ho deciso di aprire un nuovo thread perchè mi sembra di essere andato un po' OT. JCalc è un software in Java per processare espressioni matematiche (ma non solo). Nella versione precedente si doveva usare una "notazione polacca" (inversa), adesso potete scrivere cose tipo:
Code: Select all
e^((2 + 3*4/5)/sqrt(4))


in più c'è la parte di gestione dei comandi per abilitare il debug e avere un po' di help.

Il codice lo trovate qui: http://www.dreamfactory.it/massimo/wp-content/uploads/2006/10/jcalctar.gz

dentro la cartella src

all'indirizzo http://www.dreamfactory.it/massimo/archives/56 un minimo di commento.
Ci sono solo 10 tipi di persone al mondo: chi capisce il binario e chi no!
User avatar
iceseyes
Help Programmer
 
Posts: 137
Joined: Sun Jul 02, 2006 5:12 pm

Programma di valutazione delle espressioni

Sponsor

Sponsor


Postby k8 on Mon Oct 30, 2006 4:02 pm

mm ancora non ho scaricato la calcolatrice, ho letto il commento sul tuo blog, e dici che hai evitato gli if e gli else, usando il polimorfismo, cioè?
User avatar
k8
Admin
 
Posts: 2115
Joined: Tue Jun 06, 2006 4:00 pm

Postby iceseyes on Thu Nov 02, 2006 3:00 pm

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!
Ci sono solo 10 tipi di persone al mondo: chi capisce il binario e chi no!
User avatar
iceseyes
Help Programmer
 
Posts: 137
Joined: Sun Jul 02, 2006 5:12 pm

Postby k8 on Thu Nov 02, 2006 3:38 pm

più o meno ho capito ;)
User avatar
k8
Admin
 
Posts: 2115
Joined: Tue Jun 06, 2006 4:00 pm


Return to Java

Who is online

Users browsing this forum: No registered users and 1 guest

cron