May 26th, 2021

404

ещё, интересное из философии сайд-эффектов

Вот, предположим, у нас есть идемпотентный код, который умеет делать 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(первый элемент А, последний элемент Б) = ложь". Можем ли мы рассуждать про первый элемент А если А не существует?