|
[Nov. 24th, 2023|11:58 pm] |
Варианты имплементации идемпотентности
Операция, действие - f. Объект, состояние (под)системы - a. Идемпотентность: f(f(a)) = f(a) = z. (Заметки на полях: f(z) = z, неподвижная точка, терминус).
1. Выполняем то же самое действие над объектом. Состояние объекта остаётся тем же. Вариант реализуется просто. (Заметки на полях: классика).
Риск в том, что реализация на самом деле может быть неидемпотентна, и состояние будет меняться. А если полагаться на это для останова (повторять до неподвижности), то можно и систему подвесить.
2. Проверяем состояние объекта. Если состояние уже терминальное, ничего не делаем. Можно сэкономить на (не)выполнении операции, но нужно реализовать дополнительную проверку.
Следующие подварианты являются нарушением идемпотентности. (Заметки на полях: патологиями).
2.а. Раз уж мы не выполняем f на z, то сужаем f, и на z операция становится не определена. Иногда позволяет сэкономить на имплементации f.
Кроме возможной десинхронизации f и проверки состояния, риск в том, что где-нибудь да как-нибудь мы всё же вызовем f на z.
2.b. На z операция не просто не определена, а запрещена. Выбрасываем "не нажимай кнопку" ошибку. (Заметки на полях: in your face).
Это когда, например, хотят переложить и подчеркнуть ответственность по слежению за статусом на вызывающую сторону. (Заметки на полях: назвать это архитекторная импотенция? каламбур).
2.c. Не просто запрещено и выбрасываем ошибку, а ещё и (под)систему останавливаем.
Например, когда хотят наказать "за несоблюдение правил" вызывающую сторону. (Заметки на полях: терминальная стадия, каламбур).
P.S. Интересный случай, когда нарушение идемпотентности + "fail open" привело к большим финансовым потерям: https://www.youtube.com/watch?v=PVzcWBmN2L0 |
|
|