Перейти к содержанию

Состояние (State)

State выносит поведение по состояниям в отдельные объекты или модули, чтобы не держать всю логику в одном длинном условии.

Опора на ООП

State в первую очередь опирается на полиморфизм: поведение выбирается не через длинные ветвления, а через объект или модуль текущего состояния. Общий контракт состояний обычно оформляется через интерфейс.

Что показывает пример на 1С

  • Documents.Stocktaking в OnWrite() получает реализацию через Enums.StocktakingState.GetModule(State) и делегирует поведение конкретному модулю состояния.
  • Для каждого состояния есть свой модуль: StocktakingStateDraft, StocktakingStateReady, StocktakingStateInProcess, StocktakingStateLocked.
  • В итоге документ знает текущее состояние, но не держит всю матрицу поведения внутри одного Если.

Пример

Procedure OnWrite()

    Module = Enums.StocktakingState.GetModule(State);
    Module.DeclareSomething(ThisObject);

EndProcedure
#If Server Then

#Region Public

Function GetModule(State) Export

    If State = Draft Then
        Return StocktakingStateDraft;
    ElsIf State = Ready Then
        Return StocktakingStateReady;
    ElsIf State = InProcess Then
        Return StocktakingStateInProcess;
    ElsIf State = Locked Then
        Return StocktakingStateLocked;
    Else
        Raise "Unknown state";
    EndIf;

EndFunction

#EndRegion

#EndIf

Близость к Strategy

State очень близок к Strategy, и это не случайно: оба паттерна строятся на полиморфизме и общем контракте.

Снаружи они часто выглядят почти одинаково:

  • есть контекст;
  • есть набор реализаций с общим интерфейсом;
  • контекст делегирует поведение выбранному объекту или модулю.

Но смысл у них разный.

  • Strategy отвечает на вопрос: какой алгоритм мы хотим выбрать?
  • State отвечает на вопрос: в каком состоянии сейчас находится объект и как он должен вести себя из-за этого?

То есть Strategy чаще выбирается снаружи как способ выполнения задачи, а State обычно определяется внутренним жизненным циклом самого объекта.

Для 1С это различие особенно полезно:

  • если документ ведет себя по-разному в статусах Черновик, Готов, Заблокирован, это State;
  • если один и тот же сценарий можно выполнить через Email, SMS или Telegram, это Strategy.

Связанный стандарт для 1С: #std603: Требования к проведению документов. В нем прямо описана модель, где непроведенный документ выступает как черновик, а после проведения дальнейшее поведение может уточняться статусами уже проведенного документа. Это очень близкий практический пример применения State в прикладной архитектуре 1С.

Поэтому State можно считать очень близким родственником Strategy, но с акцентом не на внешнем выборе алгоритма, а на внутреннем состоянии объекта.

Где полезен в 1С

  • в жизненном цикле документов и бизнес-процессов;
  • когда набор состояний стабилен, а правила по ним заметно отличаются;
  • когда ветвления по состоянию уже мешают читать объектный модуль.

Когда паттерн лишний

  • если состояний мало и логика тривиальна;
  • если переходы постоянно меняются и разъезжаются по модулям;
  • если из-за паттерна простая проверка превращается в сеть маленьких модулей без выгоды.

Источник примера