2012-07-04 1 views
2

В веб-разработке много внимания уделяется архитектурам типа REST, цель которых сводится к минимуму (или устранению) состояния. Веб-фреймворки, которые я видел, все подчеркивают этот стиль (Django, Rails, фляжка и т. Д.).Веб-разработка: сложные процессы: являются ли государственные машины способом (только?)?

Хотя я согласен с тем, что это хорошо подходит для Интернета в целом, есть также много случаев, когда это неадекватно. В частности, я думаю о том, что вы хотите, чтобы пользователь следил за процессом, то есть вы хотите предложить несколько шагов, и эти шаги должны быть выполнены в определенном порядке (возможно, с дополнительными шагами, отклонениями путей и т. Д.)

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

Теперь мои вопросы:

  1. конечны автоматы путь здесь? Они все еще хорошо работают, если эти процессы становятся сложными и нуждаются в значительном изменении (например, этот шаг должен идти здесь, этот шаг должен идти на этот процесс и т. Д.)?

  2. Какие варианты предлагаются/для веб-фреймворков (в частности, меня не интересуют лучшие решения)?

  3. Каковы интересные/хорошие примеры того, где происходят такие процессы? Тележки для покупок являются очевидным примером, но я уверен, что их намного больше.

+0

Интересный пример государственных машин - это телевизионная приставка для кабельной компании, такой как Virgin и т. Д. Они могут стать довольно сложными и огромной болью в заднице, чтобы кодировать, поскольку ящики часто очень ограничены по мощности и большая часть полосы пропускания зарезервирована для аудио/видео. – Thor84no

ответ

2
  1. Да, они есть. Использование состояний машин (рабочих процессов) является подходящим решением для описанной проблемы. Если он хорошо спроектирован, он может сделать ваш код более чистым, удалите беспорядок из кода. Логика каждого состояния и логика перехода инкапсулируются в объект класса State, поэтому код выглядит более чистым и более удобным. Реализации могут отличаться (например, место, где вы сохраняете логику перехода), в состоянии или создавать отдельный менеджер перехода) и не соответствуют каноническому описанию конечного автомата в дискретной математике, поэтому вам лучше попробовать, что лучше работает для вас.

  2. Для Ruby вы можете проверить рабочий процесс: https://github.com/geekq/workflow или stonepath: https://github.com/bokmann/stonepath. Шаблон государственного устройства также можно найти в фреймворках javascript (SpoutCore). Нетрудно реализовать свой собственный механизм малой государственной машины.

  3. Интересные примеры? Многие из них. Обработка заказов, банковских операций, игр. Я использовал конечный автомат при создании модуля коррекции поведения, который включает в себя филогические тесты, игры, видео. Переходы из состояния в штат зависели там, если тесты были правильно выполнены, если игра была успешно проведена и т. Д.

PS. Я использовал термины state machine и workflow как синонимы, но они не совпадают; здесь обсуждалось: http://jmettraux.wordpress.com/2009/07/03/state-machine-workflow-engine/. Вы также можете найти код Ruby и ссылки там.