Состояние (State)¶
State выносит поведение по состояниям в отдельные объекты или модули, чтобы не держать всю логику в одном длинном условии.
Опора на ООП¶
State в первую очередь опирается на полиморфизм: поведение выбирается не через длинные ветвления, а через объект или модуль текущего состояния. Общий контракт состояний обычно оформляется через интерфейс.
Что показывает пример на 1С¶
Documents.StocktakingвOnWrite()получает реализацию черезEnums.StocktakingState.GetModule(State)и делегирует поведение конкретному модулю состояния.- Для каждого состояния есть свой модуль:
StocktakingStateDraft,StocktakingStateReady,StocktakingStateInProcess,StocktakingStateLocked. - В итоге документ знает текущее состояние, но не держит всю матрицу поведения внутри одного
Если.
Пример¶
#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С¶
- в жизненном цикле документов и бизнес-процессов;
- когда набор состояний стабилен, а правила по ним заметно отличаются;
- когда ветвления по состоянию уже мешают читать объектный модуль.
Когда паттерн лишний¶
- если состояний мало и логика тривиальна;
- если переходы постоянно меняются и разъезжаются по модулям;
- если из-за паттерна простая проверка превращается в сеть маленьких модулей без выгоды.