Вы представляете конечный автомат (FSM), действительно блок-схему, но ваш дизайн класса выглядит как двусвязный список . Если Status определяет предыдущий и следующий статус, это работоспособно, но в большинстве систем это неверно. Рассмотрим статус «открыто» в вашем примере, возможно ли, что следующий может быть «закрыт» или «в производстве»?
Если оба статуса являются возможностями, рассмотрите возможность изменения объекта Status и добавления объекта Transition (или, возможно, замены Action?) В иерархию классов:
class Status
- transitions (Transition[])
class Transition
- from (Status)
- to (Status)
Здесь Status знает, какие переходы возможны (например, «открыт» может переходить в «закрытый» или «в работе»). Таким образом, вы представляете FSM как направленный граф . Кроме того, по моему собственному опыту, обычно не важно, чтобы сущность знала, откуда она только что появилась, таким образом, удаление prior_status
. Вместо этого путь может быть записан с помощью журнала аудита / истории захвата таблицы базы данных.