Requisiti: Abbiamo bisogno di uno strumento che simuli un dispositivo hardware che comunica tramite RS232 o TCP / IP per permetterci di testare la nostra applicazione principale che comunicherà con il dispositivo.
Flusso attuale:
- L'utente carica lo script
- Scrittura di script nei comandi
- L'utente esegue lo script
- Esegui comandi
Script / comandi (semplificati per la discussione):
- Connetti RS232 = > RS232ConnectCommand
- Connetti TCP / IP = > TcpIpConnectCommand
- Invia dati = > SendCommand
- Ricevi dati = > ReceiveCommand
- Disconnect = > DisconnectCommand
Tutti i comandi implementano l'interfaccia ICommand. Il comando runner esegue semplicemente una sequenza di implementazioni ICommand in modo sequenziale così ICommand deve avere un'esposizione Execute, pseudo codice:
- void Execute (contesto ICommunicator)
Il metodo Execute prende un argomento di contesto che consente alle implementazioni di comando di eseguire ciò che devono fare. Ad esempio, SendCommand chiamerà context.Send, ecc.
Il problema RS232ConnectCommand e TcpIpConnectCommand devono istanziare il contesto da utilizzare con i comandi successivi. Come gestisci questo elegantemente?
Soluzione 1: Cambia il metodo ICommand Execute in:
- Esegui ICommunicator (contesto ICommunicator)
Mentre funzionerà sembra un odore di codice. Tutti i comandi ora devono restituire il contesto che per tutti i comandi tranne quelli di connessione sarà lo stesso contesto in cui è passato.
Soluzione 2: Creare un ICommunicatorWrapper (ICommunicationBroker?) Che segue lo schema del decoratore e decora ICommunicator. Introduce una nuova esposizione:
- void SetCommunicator (comunicatore ICommunicator)
E ICommand è cambiato per usare il wrapper:
- void Execute (contesto ICommunicationWrapper)
Sembra una soluzione più pulita.
Domanda
È un buon design? Sono sulla strada giusta?