Es gibt viele gültige Ansätze, um Ihr Problem zu lösen. Basile Starynkevitch schlug einen bürokratiefreien Ansatz vor, bei dem Sie eine einfache Schnittstelle haben und sich darauf verlassen können, dass der Programmierer die Schnittstelle entsprechend verwendet. Während ich diesen Ansatz mag, werde ich einen anderen vorstellen, der mehr Ingenieurskunst hat, aber dem Compiler erlaubt, einige Fehler abzufangen.
Identifizieren Sie die verschiedenen Zustände Ihr Gerät in kann, wie Uninitialised
,
Started
, Configured
und so weiter. Die Liste muss endlich sein
Für jeden Zustand, definiert ein struct
zu diesem Zustand hält die erforderlichen zusätzliche relevante Informationen, zum Beispiel DeviceUninitialised
,
DeviceStarted
und so weiter.
Packen Sie alle Behandlungen in ein Objekt, DeviceStrategy
wobei die Methoden die in 2. definierten Strukturen als Ein- und Ausgänge verwenden. So haben Sie möglicherweise eine DeviceStarted DeviceStrategy::start (DeviceUninitalised dev)
Methode (oder was auch immer die Entsprechung gemäß Ihren Projektkonventionen sein könnte).
Bei diesem Ansatz muss ein gültiges Programm einige Methoden in der von den Methodenprototypen erzwungenen Reihenfolge aufrufen.
Die verschiedenen Zustände sind nicht verwandte Objekte, dies liegt am Substitutionsprinzip. Wenn es für Sie nützlich ist, wenn diese Strukturen einen gemeinsamen Vorfahren haben, erinnern Sie sich daran, dass das Besuchermuster verwendet werden kann, um den konkreten Typ der Instanz einer abstrakten Klasse wiederherzustellen.
Während ich in 3. eine einzigartige DeviceStrategy
Klasse beschrieben habe, gibt es Situationen, in denen Sie die bereitgestellten Funktionen auf mehrere Klassen aufteilen möchten.
Zusammenfassend sind die wichtigsten Punkte des von mir beschriebenen Designs:
Aufgrund des Substitutionsprinzips sollten Objekte, die Gerätezustände darstellen, unterschiedlich sein und keine speziellen Vererbungsbeziehungen aufweisen.
Packen Sie Gerätebehandlungen in Startegy-Objekte und nicht in Objekte, die Geräte selbst darstellen, sodass jedes Gerät oder jeder Gerätezustand nur sich selbst sieht und die Strategie alle von ihnen sieht und mögliche Übergänge zwischen ihnen ausdrückt.
Ich würde schwören, dass ich einmal eine Beschreibung einer Telnet-Client-Implementierung gesehen habe, die diesen Zeilen folgt, aber ich konnte sie nicht wiederfinden. Es wäre eine sehr nützliche Referenz gewesen!
¹: Folgen Sie dazu entweder Ihrer Intuition oder finden Sie in Ihrer konkreten Implementierung die Äquivalenzklassen von Methoden für die Beziehung „method₁ ~ method₂ iff. Es ist gültig, sie für dasselbe Objekt zu verwenden. “Vorausgesetzt, Sie haben ein großes Objekt, in dem alle Behandlungen auf Ihrem Gerät zusammengefasst sind. Beide Methoden zur Auflistung von Status liefern fantastische Ergebnisse.
discovery
oderhandshake
?