Как обрабатывать переходы состояний и при этом заменять операторы if полиморфными типами? - PullRequest
3 голосов
/ 22 июня 2010

Недавно я слушал технический доклад по чистому кодированию. Спикер был инженером-тестировщиком, который подчеркивал необходимость избегать операторов if в коде и максимально использовать полиморфизм. Также он выступал против глобальных государств.

Я вполне согласен с ним, но мне нужно разъяснение о замене глобального состояния и оператора if, используя полиморфизм для приведенного ниже сценария,

В моем документе 3 состояния. Я хочу изменить состояние компонентов пользовательского интерфейса на основе состояния документа. Прямо сейчас я использую блоки if и тип перечисления, содержащий текущее состояние документа, для перехода состояний компонентов пользовательского интерфейса.

Например:

enum DOC_STATE
{
DOC_STATE_A = 0,
DOC_STATE_B,
DOC_STATE_C
};

void QMainWindow::handleUi(_docState)
{
switch(_docState)
{
case (DOC_STATE_A):
{
menu.disable();
....
}
case (DOC_STATE_B):
{
menu.enable();
...
}
case (DOC_STATE_C):
{
...
}
}

Я думаю, что я могу иметь отдельные дочерние классы для каждого состояния и иметь метод handleUI () в каждом классе. Вызов метода handleUi () вызывает правильный вызов метода. Но, скажем, я поддерживаю эти объекты в моем документе, как я могу переключаться с одного объекта на другой каждый раз, когда происходит переход в состояние?

Другими словами, как обрабатывать переход пользовательского интерфейса, отслеживая изменение состояния документа, не используя глобальное состояние и операторы if или Switch?

Я использую Qt. Спасибо.

Ответы [ 2 ]

2 голосов
/ 22 июня 2010

Если вы используете Qt, взгляните на Примеры Qt State Machine Framework и State Machine . Не нужно заново изобретать колесо, когда в твоей рамке уже есть спортивный автомобиль:)

0 голосов
/ 22 июня 2010

Не думаю, что понимаю проблему, потому что ответ слишком тривиален: вы заменяете указатель на ваш экземпляр состояния новым экземпляром состояния и отбрасываете старый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...