Существует много подходящих подходов для решения вашей проблемы. Бэзил Старынкевич предложил подход «нулевой бюрократии», который оставляет вам простой интерфейс и полагается на программиста, использующего соответствующий интерфейс. Несмотря на то, что мне нравится этот подход, я представлю другой, который имеет больше возможностей, но позволяет компилятору отлавливать некоторые ошибки.
Определение различных состояний устройство может быть, так как Uninitialised,
Started, Configuredи так далее. Список должен быть конечным.
Для каждого состояния определите наличие structнеобходимой дополнительной информации, относящейся к этому состоянию, например DeviceUninitialised,
DeviceStartedи так далее.
Упакуйте все обработки в один объект, DeviceStrategyгде методы используют структуры, определенные в 2. как входы и выходы. Таким образом, у вас может быть DeviceStarted DeviceStrategy::start (DeviceUninitalised dev)метод (или любой другой эквивалент в соответствии с соглашениями вашего проекта).
При таком подходе действительная программа должна вызывать некоторые методы в последовательности, реализуемой прототипами методов.
Различные состояния являются несвязанными объектами, это происходит из-за принципа замещения. Если вам полезно, чтобы эти структуры имели общего предка, помните, что шаблон посетителя можно использовать для восстановления конкретного типа экземпляра абстрактного класса.
Хотя я описал в 3. уникальном DeviceStrategyклассе, есть ситуации, когда вы можете разделить функциональность, которую он предоставляет, на несколько классов.
Чтобы суммировать их, ключевые моменты дизайна, который я описал:
Из-за принципа подстановки объекты, представляющие состояния устройства, должны различаться и не иметь особых отношений наследования.
Упакуйте обработки устройств в объекты стратегии, а не в объекты, представляющие сами устройства, чтобы каждое устройство или состояние устройства видело только себя, а стратегия видит все из них и выражала возможные переходы между ними.
Клянусь, я однажды увидел описание реализации клиента telnet, следующее за этими строками, но я не смог найти его снова. Это была бы очень полезная ссылка!
For: Для этого либо следуйте своей интуиции, либо найдите классы эквивалентности методов в вашей фактической реализации для отношения «метод₁ ~ метод₂». допустимо использовать их на одном и том же объекте »- при условии, что у вас есть большой объект, инкапсулирующий все процедуры на вашем устройстве. Оба метода перечисления состояний дают фантастические результаты.
discoveryилиhandshake?