Hay muchos enfoques válidos para resolver su problema. Basile Starynkevitch propuso un enfoque de "burocracia cero" que lo deja con una interfaz simple y confía en que el programador use adecuadamente la interfaz. Si bien me gusta este enfoque, presentaré otro que tiene más eingineering pero permite que el compilador detecte algunos errores.
Identificar los diferentes estados de su dispositivo puede estar en, como Uninitialised
,
Started
, Configured
y así sucesivamente. La lista tiene que ser finita.
Para cada estado, defina struct
la información adicional necesaria relevante para ese estado, por ejemplo DeviceUninitialised
,
DeviceStarted
etc.
Empaque todos los tratamientos en un objeto DeviceStrategy
donde los métodos usan estructuras definidas en 2. como entradas y salidas. Por lo tanto, puede tener un DeviceStarted DeviceStrategy::start (DeviceUninitalised dev)
método (o cualquiera que sea el equivalente según las convenciones de su proyecto).
Con este enfoque, un programa válido debe llamar a algunos métodos en la secuencia aplicada por los prototipos de métodos.
Los diversos estados son objetos no relacionados, esto se debe al principio de sustitución. Si le resulta útil que estas estructuras compartan un ancestro común, recuerde que el patrón de visitante se puede utilizar para recuperar el tipo concreto de la instancia de una clase abstracta.
Mientras describí en 3. una DeviceStrategy
clase única , hay situaciones en las que es posible que desee dividir la funcionalidad que proporciona en varias clases.
Para resumirlos, los puntos clave del diseño que describí son:
Debido al principio de sustitución, los objetos que representan estados de dispositivo deben ser distintos y no tener relaciones de herencia especiales.
Empaque los tratamientos del dispositivo en objetos de estrategia en lugar de en los objetos que representan los dispositivos mismos, de modo que cada dispositivo o estado del dispositivo se vea solo a sí mismo, y la estrategia los vea a todos y exprese posibles transiciones entre ellos.
Juraría que vi una vez una descripción de la implementación de un cliente telnet siguiendo estas líneas, pero no pude encontrarla nuevamente. ¡Habría sido una referencia muy útil!
¹: Para esto, siga su intuición o encuentre las clases de equivalencia de métodos en su implementación real para la relación “método₁ ~ método₂ iff. es válido usarlos en el mismo objeto ", suponiendo que tenga un gran objeto que encapsule todos los tratamientos en su dispositivo. Ambos métodos de enumerar estados dan resultados fantásticos.
discovery
ohandshake
?