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