Існує маса вагомих підходів до вирішення вашої проблеми. Басіль Старинкевич запропонував підхід «нульової бюрократії», який дає вам простий інтерфейс і покладається на програміста, використовуючи відповідний інтерфейс. Хоча мені подобається такий підхід, я представлю ще один, який має більше eingineering, але дозволяє компілятору вловлювати деякі помилки.
Визначення різних станів пристрій може бути, так як Uninitialised
,
Started
, Configured
і так далі. Список має бути кінцевим.¹
Для кожного штату визначте, що struct
містить необхідну додаткову інформацію, що стосується цієї держави, наприклад DeviceUninitialised
,
DeviceStarted
тощо.
Упакуйте всі способи лікування в одному об'єкті, DeviceStrategy
де методи використовують структури, визначені в 2. як входи та виходи. Таким чином, у вас може бути DeviceStarted DeviceStrategy::start (DeviceUninitalised dev)
метод (або будь-який еквівалент, згідно з умовами вашого проекту).
При такому підході дійсна програма повинна викликати деякі методи в послідовності, що застосовується прототипами методу.
Різні стани є неспорідненими об'єктами, це пов’язано з принципом заміщення. Якщо вам корисно, щоб ці структури мали спільного предка, згадайте, що шаблон відвідувача може бути використаний для відновлення конкретного типу екземпляра абстрактного класу.
Хоча я описав у 3. унікальний DeviceStrategy
клас, є ситуації, коли ви можете розбити функціонал, який він надає, на кілька класів.
Підсумовуючи їх, ключовими моментами описаного нами проекту є:
Через принцип заміщення об'єкти, що представляють стани пристроїв, повинні відрізнятися і не мати спеціальних відносин успадкування.
Обробляйте обробку пристроїв в об'єктах зіркової категорії, а не в об'єктах, що представляють самі пристрої, так що кожен пристрій або стан пристрою бачить лише себе, а стратегія бачить їх усі і виражає можливі переходи між ними.
Я б поклявся, що одного разу побачив опис реалізації клієнтської програми telnet, що слідує за цими рядками, але я не зміг її знайти знову. Це було б дуже корисною довідкою!
For: Для цього або дотримуйтесь своєї інтуїції або знайдіть класи еквівалентності методів у вашій реальній реалізації для відношення “method₁ ~ method₂ iff. допустимо використовувати їх на одному об’єкті ”- якщо припустити, що у вас є великий об’єкт, що інкапсулює всі способи лікування на вашому пристрої. Обидва способи списку станів дають фантастичні результати.
discovery
абоhandshake
?