Переходы состояний объекта
От: snaphold  
Дата: 11.04.18 11:50
Оценка:
Есть объект Заказ.
У него может быть порядка 30 статусов.
Есть админка где админ может заказ с любого статуса перекинуть в любой статус.
То есть если всё расписывать по каждой комбинации то получается дофига ифов и много дублирования получится.

Наверняка есть проверенные шаблоны для такого? Какие?
Re: Переходы состояний объекта
От: Sharov Россия  
Дата: 11.04.18 11:57
Оценка: +1
Здравствуйте, snaphold, Вы писали:

S>Наверняка есть проверенные шаблоны для такого? Какие?


State machine.
Кодом людям нужно помогать!
Re: Переходы состояний объекта
От: Mihas  
Дата: 11.04.18 11:58
Оценка:
Здравствуйте, snaphold, Вы писали:

Сперва вроде понятно было. Но тут все рассыпалось:
S>То есть если всё расписывать по каждой комбинации то получается дофига ифов и много дублирования получится.
Re: Переходы состояний объекта
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 11.04.18 12:01
Оценка:
Здравствуйте, snaphold, Вы писали:

S>Наверняка есть проверенные шаблоны для такого? Какие?

Стейт машина конечно же.
Sic luceat lux!
Re: Переходы состояний объекта
От: Maniacal Россия  
Дата: 11.04.18 12:02
Оценка:
Здравствуйте, snaphold, Вы писали:

S>Наверняка есть проверенные шаблоны для такого? Какие?


Если из одного статуса возможен переход в строго ограниченное количество статусов и вопрос только в этом, то можно ассоциативные массивы использовать (std::map<enum, enum>), задав пары ключ->значение для каждого из возможный изменений статуса заказа или ключ->множество статусов (std::map<enum, std::set<enum>>)
Re: Переходы состояний объекта
От: Pzz Россия https://github.com/alexpevzner
Дата: 11.04.18 12:29
Оценка:
Здравствуйте, snaphold, Вы писали:

S>То есть если всё расписывать по каждой комбинации то получается дофига ифов и много дублирования получится.


Если в одном месте скапливается слишком много ифов, то в этом месте напрашивается свитч

S>Наверняка есть проверенные шаблоны для такого? Какие?


Таблица переходов между состояниями.
Re[2]: Переходы состояний объекта
От: Pzz Россия https://github.com/alexpevzner
Дата: 11.04.18 12:30
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>Если из одного статуса возможен переход в строго ограниченное количество статусов и вопрос только в этом, то можно ассоциативные массивы использовать (std::map<enum, enum>), задав пары ключ->значение для каждого из возможный изменений статуса заказа или ключ->множество статусов (std::map<enum, std::set<enum>>)


Нафига там map? Таблица почти наверняка статическая, для статических таблиц очень хорошо подходит старый добрый массив.
Re[3]: Переходы состояний объекта
От: Maniacal Россия  
Дата: 11.04.18 12:33
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Нафига там map? Таблица почти наверняка статическая, для статических таблиц очень хорошо подходит старый добрый массив.


Только если статусы это zero-based набор перечисляемого типа, где номера идут подряд.
Re[4]: Переходы состояний объекта
От: Pzz Россия https://github.com/alexpevzner
Дата: 11.04.18 12:57
Оценка:
Здравствуйте, Maniacal, Вы писали:

Pzz>>Нафига там map? Таблица почти наверняка статическая, для статических таблиц очень хорошо подходит старый добрый массив.


M>Только если статусы это zero-based набор перечисляемого типа, где номера идут подряд.


Обычтно эти статусы — внутреннее дело программы, и их можно хранить в удобном виде. Даже если они хранятся где-то в базе, можно делать преобразование при сохранении/загрузке данных.
Re: Переходы состояний объекта
От: itslave СССР  
Дата: 11.04.18 15:12
Оценка: 4 (1)
Здравствуйте, snaphold, Вы писали:

S>Есть админка где админ может заказ с любого статуса перекинуть в любой статус.

Вне зависимости от реализации, это будет источником постоянной головной боли. Модифицируйте бизнес процесс, чтобы такого бардака не было. А потом у вас нарисуются красивые state machine, и валом фреймворков чтобы их заимплементить, все как полагается.
Re: Переходы состояний объекта
От: · Великобритания  
Дата: 11.04.18 15:34
Оценка: 4 (1) +2
Здравствуйте, snaphold, Вы писали:

S>Есть объект Заказ.

S>У него может быть порядка 30 статусов.
S>Есть админка где админ может заказ с любого статуса перекинуть в любой статус.
S>То есть если всё расписывать по каждой комбинации то получается дофига ифов и много дублирования получится.

S>Наверняка есть проверенные шаблоны для такого? Какие?

Это вроде как workflow называется. Но что-то у тебя не то в подходе. Админ не должен менять статусы как пожелает, а применяет доступные бизнес-операции, что влечёт изменение статуса. Например, админ не просто напрямую меняет значение статуса из "размещён" в "оплачен", а проводит операцию оплаты заказа, вводя данные кредитки и после успешной оплаты статус меняется сам. Т.е. статус это поле, вычисляемое на основании применёных к заказу операций.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Отредактировано 11.04.2018 16:25 · . Предыдущая версия .
Re: Переходы состояний объекта
От: Amygdala Россия  
Дата: 11.04.18 16:06
Оценка:
Здравствуйте, snaphold, Вы писали:

Так квадратная матрица с нулевой диагональю же.
Тогда если в матрице указатели на функции, то вызов обработчика будет выглядеть красиво:

*(stateChangeTable[STATE_FROM][STATE_TO])()
Отредактировано 11.04.2018 16:25 Amygdala . Предыдущая версия .
Re: Переходы состояний объекта
От: vsb Казахстан  
Дата: 11.04.18 19:38
Оценка:
Если хочешь захардкодить, фигачь кучу свитчей, в одном месте, это то, что надо. А в идеале делай в базе табличку с возможными переходами, но если увлечёшься, напишешь Jira.
Re: Переходы состояний объекта
От: Vladek Россия Github
Дата: 11.04.18 22:17
Оценка: :)))
Здравствуйте, snaphold, Вы писали:

S>Есть объект Заказ.

Мы не знаем, корректная ли это абстракция.
S>У него может быть порядка 30 статусов.
Скорее всего, некорректная.
S>Есть админка где админ может заказ с любого статуса перекинуть в любой статус.
И, конечно же, никакого аудита подобных действий. Проект обречен на успех и точно переживёт три мажорных версии.
S>То есть если всё расписывать по каждой комбинации то получается дофига ифов и много дублирования получится.

S>Наверняка есть проверенные шаблоны для такого? Какие?

Я рекомендую ООП и DDD. (Тут вылезают умники, которые пишут хранимые процедуры для баз данных, но не на SQL, а прямо в компилируемом коде через призму какой-нибудь ORM, и заявляют, что ООП не работает и встречается только в учебниках, но я не рекомендую их слушать.)
Re: Переходы состояний объекта
От: Буравчик Россия  
Дата: 12.04.18 14:36
Оценка:
Здравствуйте, snaphold, Вы писали:

S>Есть админка где админ может заказ с любого статуса перекинуть в любой статус.

S>То есть если всё расписывать по каждой комбинации то получается дофига ифов и много дублирования получится.

Что расписывать? И дублирование чего?
Best regards, Буравчик
Re: Переходы состояний объекта
От: Qulac Россия  
Дата: 12.04.18 14:43
Оценка:
Здравствуйте, snaphold, Вы писали:

S>Есть объект Заказ.

S>У него может быть порядка 30 статусов.
S>Есть админка где админ может заказ с любого статуса перекинуть в любой статус.
S>То есть если всё расписывать по каждой комбинации то получается дофига ифов и много дублирования получится.

S>Наверняка есть проверенные шаблоны для такого? Какие?


Такого варианта еще не было: если можно реорганизовать состояния в виде состояний и подсостояний, то для реализации состояний используем паттерн state из gof, а для подсостояний — state machine.
Программа – это мысли спрессованные в код
Re[2]: Переходы состояний объекта
От: snaphold  
Дата: 15.04.18 10:43
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, snaphold, Вы писали:


S>>Наверняка есть проверенные шаблоны для такого? Какие?


S>State machine.


Нашел реализацию

но вот момент какой непонятен.
вот если берем пример из ссылки
Есть таблица переходов у меня есть переход из Paused в Exit.
Соответственно как это будет выглядеть? StateMAchine я так понял хорош когда надо перейти в соседнее состояние, а когда надо перейти через несколько состояний как быть?
Re[2]: Переходы состояний объекта
От: snaphold  
Дата: 15.04.18 10:51
Оценка:
Здравствуйте, Буравчик, Вы писали:

Б>Здравствуйте, snaphold, Вы писали:


S>>Есть админка где админ может заказ с любого статуса перекинуть в любой статус.

S>>То есть если всё расписывать по каждой комбинации то получается дофига ифов и много дублирования получится.

Б>Что расписывать? И дублирование чего?


Объект из состояния 1 может перейти в 20 состояний
Объект из состояния 2 может перейти в 20 состояний
...
Объект из состояния 20 может перейти в 20 состояний

при переходе из состояния 20 в состояние 1 и при переходе из состояния 19 в состояние 1 будет одинаковая логика, кроме одного метода (20 => 19)

как оформить?

Нашел реализацию

но вот момент какой непонятен.
вот если берем пример из ссылки
Есть таблица переходов у меня есть переход из Paused в Exit.
Соответственно как это будет выглядеть? StateMAchine я так понял хорош когда надо перейти в соседнее состояние, а когда надо перейти через несколько состояний как быть?
Re[2]: Переходы состояний объекта
От: snaphold  
Дата: 15.04.18 10:51
Оценка:
Здравствуйте, Qulac, Вы писали:

Q>Здравствуйте, snaphold, Вы писали:


S>>Есть объект Заказ.

S>>У него может быть порядка 30 статусов.
S>>Есть админка где админ может заказ с любого статуса перекинуть в любой статус.
S>>То есть если всё расписывать по каждой комбинации то получается дофига ифов и много дублирования получится.

S>>Наверняка есть проверенные шаблоны для такого? Какие?


Q>Такого варианта еще не было: если можно реорганизовать состояния в виде состояний и подсостояний, то для реализации состояний используем паттерн state из gof, а для подсостояний — state machine.



Нашел реализацию

но вот момент какой непонятен.
вот если берем пример из ссылки
Есть таблица переходов у меня есть переход из Paused в Exit.
Соответственно как это будет выглядеть? StateMAchine я так понял хорош когда надо перейти в соседнее состояние, а когда надо перейти через несколько состояний как быть?
Возможно Стейт подойдет, но как обернуть?
Re[3]: Переходы состояний объекта
От: Qulac Россия  
Дата: 15.04.18 11:34
Оценка:
Здравствуйте, snaphold, Вы писали:

S>Здравствуйте, Qulac, Вы писали:


Q>>Здравствуйте, snaphold, Вы писали:


S>>>Есть объект Заказ.

S>>>У него может быть порядка 30 статусов.
S>>>Есть админка где админ может заказ с любого статуса перекинуть в любой статус.
S>>>То есть если всё расписывать по каждой комбинации то получается дофига ифов и много дублирования получится.

S>>>Наверняка есть проверенные шаблоны для такого? Какие?


Q>>Такого варианта еще не было: если можно реорганизовать состояния в виде состояний и подсостояний, то для реализации состояний используем паттерн state из gof, а для подсостояний — state machine.



S>Нашел реализацию


S>но вот момент какой непонятен.

S>вот если берем пример из ссылки
S>Есть таблица переходов у меня есть переход из Paused в Exit.
S>Соответственно как это будет выглядеть? StateMAchine я так понял хорош когда надо перейти в соседнее состояние, а когда надо перейти через несколько состояний как быть?
S>Возможно Стейт подойдет, но как обернуть?

Не понял вопроса. Представьте себе табличку, где по горизонтали — входные воздействия, по вертикали — текущее состояние, а в клетках — новое состояние. Оформить это можно по разному, в т.ч. привлекая ООП.В общем всё определяется парой: текущее состояние — входное воздействие, в приведенном примере это класс StateTransition, для каждой такой пары мы определяем новое состояние и при необходимости переходим. Т.е. переходить мы можем как нам вздумается.
Программа – это мысли спрессованные в код
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.