Quindi, quello che stai dicendo è che il software agisce in un modo quando il software si trova in uno stato e un'altra cosa quando il software si trova in un altro stato. Bene, benvenuto nel Pattern di stato .
Il racconto è che vuoi due classi, ognuna delle quali implementa la stessa interfaccia. l'interfaccia dovrebbe avere due metodi: OnMachineConnectSelected e OnMachineDoubleClick.
La prima classe si chiama DisconnectedState, la seconda classe si chiama ConnectedState.
- DisconnectedState esegue Connect e ShowWindow da OnMachineConnectSelected.
- DisconnectedState esegue la connessione da OnMachineDoubleClick.
- ConnectedState esegue ShowWindow da OnMachineConnectSelected e OnMachineDoubleClick.
(È difficile dirlo senza ulteriori specifiche, ma è possibile e probabilmente dovresti avere Connect e ShowWindow come metodi sul tuo modulo o altro oggetto dell'applicazione e passare un riferimento, probabilmente tramite un'altra interfaccia, nel costruttore della tua classe di stato.)
Ora la tua applicazione ha semplicemente bisogno di un oggetto sul quale chiamare questi metodi, come si verificano le azioni, e puoi cambiare quell'oggetto tra un'istanza di DisconnectedState e ConnectedState mentre cambia lo stato reale delle tue applicazioni.
Vedi cosa fa questo per te?
In primo luogo, modella la tua applicazione molto bene. Guarda i punti elenco sopra. Non dovresti riorganizzare le parole molto per spiegare cosa stava succedendo a un utente o a un manager non tecnico. Stai separando i concetti di stato (decisioni software / hardware) e azioni (decisioni dell'utente) in modo ordinato.
In secondo luogo, consente l'estensibilità. Quando ti rendi conto che devi agire in modo molto diverso, mentre ti connetti e disconnetti, puoi semplicemente aggiungere due nuove classi di stato. Oppure, se devi aggiungere una nuova azione che dipende dallo stato, puoi semplicemente aggiungere un nuovo metodo a tutti gli oggetti di stato.
In terzo luogo, è più gestibile. Quando un uomo d'affari dice "Ehi, al momento, quando l'applicazione è Disconnected e selezioni Connetti su una macchina, connette e mostra la finestra, ma vogliamo semplicemente connettersi", sai ESATTAMENTE dove esiste quella logica nel codice e puoi modificarlo facilmente, con la certezza che non stai violando nessuna delle altre condizioni.
Infine, è più unità testabile. C'è solo un percorso attraverso ogni metodo. Passa un modulo fittizio al costruttore della classe, chiama il metodo OnX e assicurati che esegua le azioni giuste. E, sul modulo, puoi verificare che la tua azione chiami il metodo giusto, indipendentemente dallo stato in cui si trova.