Sviluppo di una calcolatrice utilizzando lo schema di comando

2

Nel tentativo di consolidare la mia comprensione dello schema di comando, ho deciso di scrivere un'applicazione per la calcolatrice che l'ha utilizzata.

Dopo aver fatto alcuni progressi, mi sono reso conto che la mia scelta di applicazione potrebbe non essere stata la scelta ideale.

Hoiseguenticomponenti:

View.xml

Questaèl'interfacciautentedellacalcolatriceedèequivalenteal"client" nel diagramma. Questo è il mio livello di vista.

Controller.cs

Questo è l'equivalente del "invocatore" nel diagramma, questo contiene i comandi e le chiamate vengono eseguite su di essi. Questo è il mio controller layer

Model.cs

Questo è l'equivalente del "ricevitore" sul diagramma.

commandOne.cs, comandTwo.cs, commandMinus.cs ...... etc

Questi sono i miei comandi concreti, che definiscono un legame tra un'azione e il modello.

Oltre a eseguire i comandi, il controller inserisce anche una coda di comandi allo scopo di annullare e ripristinare.

Nell'applicare il modello di comando a un calcolatore, mi sono reso conto che l'esecuzione dei comandi è differita fino a quando l'intera espressione è stata creata e gli uguali sono stati premuti. Ho quindi impostato la ricodifica della sequenza di pressioni dei pulsanti nel livello del modello prima di rendermi conto che avevo già un contenitore che li memorizza nella forma della coda di annullamento / ripristino nel controller.

Quindi, la mia domanda è, dovrei passare il mio controller / invoker al livello del modello quando l'espressione è stata completata in modo che i comandi in coda possano essere eseguiti in sequenza per calcolare il risultato.

O devo mantenere una coda simile nel livello del modello allo scopo di valutare l'espressione quando il pulsante equals è stato premuto.

    
posta dangerousdave 24.03.2016 - 17:43
fonte

1 risposta

4

Il problema che stai descrivendo è che il modello deve conoscere lo stato interno del controller. Questo è un sintomo di un problema molto più grande, vale a dire: la maggior parte dello stato che appartiene al modello non viene memorizzato nel modello. La soluzione qui non è quella di duplicare lo stato del controller all'interno del modello o passare il controller nel modello, ma piuttosto di spostare quello stato nel modello.

Un problema strettamente correlato è che stai cercando di usare i comandi per rappresentare operazioni matematiche non ancora eseguite, quando dovresti davvero usarle per rappresentare gli ordini che l'utente sta dando all'app della calcolatrice. Può essere controintuitivo, ma quando l'utente preme il pulsante * su una calcolatrice, non sta dicendo alla calcolatrice di moltiplicare due numeri, in realtà gli stanno dicendo di aggiungere un simbolo di moltiplicazione all'espressione corrente.

In particolare, il tuo modello dovrebbe contenere una rappresentazione dell'espressione corrente , sia che si tratti di un numero singolo come "123" o di un'espressione complicata non ancora valutata come "3 + 4 * 90-8 "e valutare quell'espressione dovrebbe essere il suo comando , separare dai comandi per aggiungere un * e un 90 e un - e un 8 all'espressione corrente.

Ad esempio, se il tuo modello è attualmente "123" e l'utente preme il tasto *, il modello dovrebbe essere cambiato in "123 *", la vista dovrebbe essere avvisata di aggiornarsi, e gli stack di annullamento / ripetizione dovrebbero essere dati oggetti comando che aggiungono e rimuovono un *. Quindi, quando l'utente preme 4, il modello dovrebbe cambiare in "123 * 4", la vista dovrebbe essere informata di aggiornarsi, e gli stack di annullamento / ripetizione dovrebbero essere assegnati agli oggetti comando che aggiungono / rimuovono un 4. Infine, quando l'utente presses =, il modello dovrebbe essere detto di valutare la sua espressione in modo che cambi in "492", la vista dovrebbe essere detto di aggiornarsi, lo stack di annullamento dovrebbe essere dato un oggetto comando che reimposta l'espressione corrente a "123 * 4" e allo stack di ripetizione dovrebbe essere assegnato un oggetto comando che valuti l'espressione corrente. In questo modo, non è assolutamente necessario che il modello riceva mai un riferimento al controller o alla vista e nel controller è necessaria solo una coppia di stack di annullamento / ripetizione.

Si noti che il modello non deve essere una semplice stringa come ho appena descritto. In pratica è spesso meglio rappresentare un'espressione come questa come un AST e dare al modello un metodo che converte detto AST in una stringa per la visualizzazione da visualizzare. Ma per un'applicazione di calcolatrice molto semplice una stringa potrebbe essere sufficiente.

    
risposta data 25.03.2016 - 23:30
fonte

Leggi altre domande sui tag