В очередной раз возникла задачка реализации процесса согласования и опять размышления...
Натолкнулся на забавную статью:
Why Developers Never Use State Machines
http://www.skorks.com/2011/09/why-developers-never-use-state-machines/
Бодренькое начало:
The problem is that you almost never create an object fully formed with all the behaviour it is ever going to need, rather you build it up over time.
...
So, early on you don't feel like your objects' state machine behaviour is complex enough to warrant a "full-blown" state machine (YAGNI and all that jazz), but later on – when it IS complex enough – you feel like you've invested too much time/effort to replace it with something that has equivalent functionality
Завершилось имхо наивным тезисом:
We seem to shy away from state machines due to misunderstanding of their complexity and/or an inability to quantify the benefits
Формальные бенефиты канонишной стейт машины имхо всем понятны. Вот только... не встречалось мне еще задач под канонишные стейт машины. Вот моя типичная задача — есть заявка, у нее 3 последовательных этапа согласования. Этапа 3 но состояние у заявки одно — "заявка на согласовании". Согласование может закончится тремя вариантами — заявка согласована, заявка не согласована, согласование просрочено. Это уже статусы заявки, которые она получает после этапа "согласование". Далее есть автоматические согласования (если выполнен ряд условий) и "сгруппированные согласования" — (параллельные) тоже со своими правилами — или за группу согласует первый или должна согласовать вся группа. Автоматическое согласование легко может сработать несколько раз после "ручного согласования" и завершить согласование группы, согласование этапа и согласования заявки. А и в каких-то случаях вообще все согласование может быть пройдено и завершено на автомате сразу после старта согласования.
Казалось бы напрашивается стейт машина. Но границы сущностей размыты... Состояние заявки вроде бы и связано с состоянием процесса согласования, но детали процесса согласования могут быть очень сложными и серьезно меняться при этом, никак не отражаясь на логике связанной с самой заявкой. Да и самой заявке стейт машина бывает не больно то нужна, если у заявки простая система состояний.
В подобной ситуации основной смысл стейт машины — декларативность, как-то имхо пропадает. Или надо под каким-то другим "углом" на эту проблему смотреть?