Esistono molti approcci validi per risolvere il tuo problema. Basile Starynkevitch ha proposto un approccio "zero-burocrazia" che ti lascia con un'interfaccia semplice e fa affidamento sul programmatore che usa appropriatamente l'interfaccia. Mentre mi piace questo approccio, presenterò un altro che ha più eingineering ma consente al compilatore di rilevare alcuni errori.
-
Identifica i vari stati in cui può essere inserito il tuo dispositivo, come Uninitialised
,
Started
, Configured
e così via. L'elenco deve essere finito.¹
-
Per ogni stato, definisci struct
contenente l'ulteriore necessario
informazioni pertinenti a tale stato, ad es. %codice%,
DeviceUninitialised
e così via.
-
Comprimi tutti i trattamenti in un oggetto DeviceStarted
dove i metodi usano
strutture definite in 2. come input e output. Quindi, potresti avere
un metodo DeviceStrategy
(o qualunque cosa l'equivalente potrebbe essere secondo le convenzioni del tuo progetto).
Con questo approccio, un programma valido deve chiamare alcuni metodi nella sequenza imposta dai prototipi del metodo.
I vari stati sono oggetti non correlati, questo a causa del principio di sostituzione. Se è utile che queste strutture condividano un antenato comune, ricorda che il pattern visitor può essere utilizzato per recuperare il tipo concreto dell'istanza di una classe astratta.
Mentre ho descritto in 3. una classe DeviceStarted DeviceStrategy::start (DeviceUninitalised dev)
unica, ci sono situazioni in cui potresti voler dividere la funzionalità che fornisce su diverse classi.
Per riassumerli, i punti chiave del disegno che ho descritto sono:
-
A causa del principio di sostituzione, oggetti che rappresentano stati del dispositivo
dovrebbe essere distinto e non avere speciali relazioni di ereditarietà.
-
Comprime i trattamenti del dispositivo in oggetti di tipo stella anziché negli oggetti
rappresentando i dispositivi stessi, in modo che ogni stato del dispositivo o dispositivo
vede solo se stesso, e la strategia vede tutti loro ed esprimere la possibilità
transizioni tra di loro.
Giuro di aver visto una volta una descrizione di un'implementazione di un client telnet
seguendo queste linee, ma non ero in grado di trovarlo di nuovo. Avrebbe
stato un riferimento molto utile!
¹: Per questo, segui la tua intuizione o trova le classi di equivalenza dei metodi nella tua implementazione effettiva per la relazione "metodo₁ ~ metodo₂ iff. è valido utilizzarli sullo stesso oggetto "- assumendo che tu abbia un grosso oggetto che incapsula tutti i trattamenti sul tuo dispositivo. Entrambi i metodi degli stati di assegnazione danno risultati fantastici.