Il modo orientato agli oggetti per farlo sarebbe utilizzare un'enumerazione delle operazioni possibili. In questo modo ogni operazione poteva solo consumare un oggetto in memoria.
public enum Operation {
ADD() {
public int perform(int a, int b) {
return a + b;
}
},
SUBTRACT() {
public int perform(int a, int b) {
return a - b;
}
},
MULTIPLY() {
public int perform(int a, int b) {
return a * b;
}
},
DIVIDE() {
public int perform(int a, int b) {
return a/b;
}
};
public abstract int perform(int a, int b);
}
Per chiamare tale codice, si dovrebbe quindi fare qualcosa di simile:
int result = Operation.ADD(5, 6);
Poi si potrebbe creare una mappa di stringhe di operazioni, in questo modo:
Map<String, Operation> symbols = new Map<String, Operation>();
symbols.put("+", Operation.ADD);
symbols.put("-", Operation.SUBTRACT);
symbols.put("/", Operation.DIVIDE);
symbols.put("*", Operation.MULTIPLY);
...
Infine, per utilizzare un tale sistema:
symbols.get(n.getString(1).apply(tmp1, tmp2));
Un vantaggio di utilizzare enumerazioni in questo modo è che si ha il lusso di confronto tra le operazioni sui dati, se si sceglie di farlo
Operation operation = symbols.get("*");
if (operation != Operation.MULTIPLY) {
System.out.println("Foobar as usual, * is not multiply!");
}
Inoltre, si ottiene una posizione centralizzata per tutte le operazioni, l'unico il lato negativo di questo è che il file Operation.java potrebbe diventare grande con un insieme sufficientemente grande di operatori.
L'unico problema che potrebbe esistere a lungo termine è che mentre un tale sistema è utile e di facile lettura e comprensione, in realtà non tiene conto della precedenza. Supponendo che la tua formula sia stata valutata nell'ordine di precedenza, questo problema non ha importanza. Esempi di esprimere la formula nell'ordine di precedenza possono essere trovati in Reverse Polish Notation, Polish Notation, ecc
Dove precedenza che conta è quando si è permesso di esprimere elementi come:
4 + 5 * 2
dove secondo alla convenzione tipica, il 5 * 2 dovrebbe essere valutato prima del 4 + 5. L'unico modo corretto di gestire la precedenza è quello di formare un albero di valutazione in memoria, o di garantire che tutti gli input maneggiano la precedenza in modo semplice e univoco (Notazione polacca , Notazione polacca inversa, ecc.).
Suppongo che tu sappia dei problemi di precedenza, ma grazie per avermi fatto menzionare per il beneficio di coloro che non hanno ancora dovuto scrivere un tale codice.
+1 Simile alla mia descrizione, ma più corto e ben inserito. –