Вот, предположим, у нас есть идемпотентный код, который умеет делать state=present/absent для сущности. Я специально абстрагируюсь от кокретных реализаций и пишу "псевдокодом".
Например, мы можем установить субд (утрируя, database-server state=present), а можем удалить (state=absent)
Мы можем создать базу данных в СУБД (database state=present) или удалить.
Мы можем создать пользователя в СУБД (user state=present) или удалить.
Мы можем дать пользователю доступ к базе или отнять (access user--database state=present)
Процесс создания сервера прост:
database-server state=present
database state=present
user state=present
access user--database state=present
Теперь мы хотим сделать обратное. Удалить его.
Мы пишем в обратном порядке:
access user--database state=absent
user state=absent
database state=absent
database-server state=absent
Каждая операция полностью идемпотентная. Но! Теперь попробуем "обратное" запустить второй раз. У нас есть сервер, на котором нет: базы данных; пользователя; СУБД.
Мы говорим access user--database state=absent.
И что должно случиться?
Практически, в любых системах мы получим ошибку, потому что у нас нет database-server, который бы нам эту операцию мог подтвердить или выполнить.
И мы не можем полагаться на "отсутствие СУБД" как доказательство удаления (not changed), потому что СУБД может быть в down state по независимой причине.
Фашистско-декларативный подход должен сказать, что "если чего-то нет, то мы его сделаем" - поставим СУБД, добавим базу, добавим пользователя и подтвердим (not changed) что у пользователя нет доступа в базу.
Но это во-первых абсурдно, во-вторых делает гигантские side effects в условиях not changed, что противоречит идее not changed.
Другими словами, утверждает ли декларативное утверждение "f(A, Б) = ложь", что A и Б существуют?
На практике это часто выливается даже в более сложное "f(первый элемент А, последний элемент Б) = ложь". Можем ли мы рассуждать про первый элемент А если А не существует?
Например, мы можем установить субд (утрируя, database-server state=present), а можем удалить (state=absent)
Мы можем создать базу данных в СУБД (database state=present) или удалить.
Мы можем создать пользователя в СУБД (user state=present) или удалить.
Мы можем дать пользователю доступ к базе или отнять (access user--database state=present)
Процесс создания сервера прост:
database-server state=present
database state=present
user state=present
access user--database state=present
Теперь мы хотим сделать обратное. Удалить его.
Мы пишем в обратном порядке:
access user--database state=absent
user state=absent
database state=absent
database-server state=absent
Каждая операция полностью идемпотентная. Но! Теперь попробуем "обратное" запустить второй раз. У нас есть сервер, на котором нет: базы данных; пользователя; СУБД.
Мы говорим access user--database state=absent.
И что должно случиться?
Практически, в любых системах мы получим ошибку, потому что у нас нет database-server, который бы нам эту операцию мог подтвердить или выполнить.
И мы не можем полагаться на "отсутствие СУБД" как доказательство удаления (not changed), потому что СУБД может быть в down state по независимой причине.
Фашистско-декларативный подход должен сказать, что "если чего-то нет, то мы его сделаем" - поставим СУБД, добавим базу, добавим пользователя и подтвердим (not changed) что у пользователя нет доступа в базу.
Но это во-первых абсурдно, во-вторых делает гигантские side effects в условиях not changed, что противоречит идее not changed.
Другими словами, утверждает ли декларативное утверждение "f(A, Б) = ложь", что A и Б существуют?
На практике это часто выливается даже в более сложное "f(первый элемент А, последний элемент Б) = ложь". Можем ли мы рассуждать про первый элемент А если А не существует?