Я узнал о машине с конечным числом состояний, прочитал о различных подходах, и теперь я собираюсь реализовать ее в своей программе в качестве упражнения. Моя программа работает с устройством с последовательным портом, и моя идея - создать класс, который мог бы описывать состояние устройства. Теперь я не могу составить правильную цепочку связующего процесса. Что я имел в виду:
- Пользователь нажимает кнопку подключения (например, переключатель)
- Конечный автомат проверяет внутреннее состояние и вызывает функцию подключения, если внутреннее состояние "отключено".
- В зависимости от результата подключения конечный автомат должен быть переведен в состояние «подключен» или оставлен «отключен».
- Установить переключатель пользователя в положение «включено», если «подключен», и наоборот.
Правильна ли моя цепь?
Принимая это во внимание, я попытался реализовать соответствующий код. В моем классе устройств у меня есть
void Device::doAction(Action action)
{
switch (action) {
case CONNECT:
onConnect();
break;
case DISCONNECT:
onDisconnect();
break;
....
}
void Device::onConnect()
{
switch (getState()) {
case DISCONNECTED: {
setState(CONNECTED);
break;
}
default:
message("Device is already connected");
break;
}
}
При таком подходе я не могу передать имя SerialPort с помощью метода doAction()
, потому что он должен быть более универсальным для каждого действия. Более того, в этом случае состояние будет установлено немедленно, без проверки ответа SerialPort. В противном случае я мог бы переопределить
void Device::onConnect(const QString &port)
{
switch (getState()) {
case DISCONNECTED: {
connectonRequest(port);
break;
}
....
}
}
Тогда я мог бы вызвать новый метод onConnect прямо из интерфейса. Затем можно запросить ответ SerialPort, и состояние будет изменено напрямую. Это нормально?
Буду признателен за любые советы.