Терминология для детерминированной функции без побочных эффектов? - PullRequest
5 голосов
/ 02 апреля 2009

Мне нужна правильная терминология для определенного типа функции.

Предположим, вы пишете функцию в своей базе данных SQL, чьи входы и выходы содержатся в рамках транзакции базы данных.

То есть, если вы вызываете эту функцию в области транзакции базы данных, все данные, используемые этой функцией, будут доступны в одной и той же области. Он может запросить таблицу базы данных, но не может прочитать файл из файловой системы или пропинговать веб-сайт и т. Д. Если вы вызываете функцию дважды в одной транзакции с изоляцией REPEATABLE READ, вы должны получить тот же результат, даже если другие клиенты вносят изменения в базу данных.

Аналогично, функция не имеет побочных эффектов, за исключением той же области транзакции. Изменения в состоянии вне области транзакции базы данных не допускаются. Функция не должна отправлять электронные письма, ни записывать в файловую систему, ни сохранять значение в memcached и т. Д. Если функция изменяет данные в базе данных, это нормально, потому что, если вызывающая транзакция откатывается, то последствия функция тоже.

С аргументами функции все в порядке, поскольку они в основном используются как константы.

Каким будет правильный термин для функции этого типа? «Детерминизм» не кажется достаточно конкретным. Как бы вы описали этот класс функций?


Спасибо за ваши ответы, но ни один из них не является тем, что я имел в виду. Идемпотент становится ближе всего, поэтому я отметил это как принятый ответ. Но каждый из вас получил от меня отклик, независимо от того.

  • Чистые функции не имеют побочных эффектов, и их результат основан исключительно на их аргументах. Результат с одинаковыми аргументами всегда идентичен. Это не работает, потому что функции базы данных, которые я имею в виду, могут основываться на состоянии данных, и функция также может влиять на состояние данных.

  • Идемпотентные функции могут возвращать результат на основе состояния данных, и при одинаковом состоянии данных результат всегда идентичен. Но это не работает для того, что я имею в виду; эффекты идемпотентных функций должны приводить к неизменному результату, независимо от того, сколько раз вызывается функция. Но нет никаких различий между изменениями, сделанными в изоляции транзакций, и изменениями, внесенными вне этой области.

Ответы [ 4 ]

6 голосов
/ 02 апреля 2009

Вы также можете вызвать эти чистые функции .

5 голосов
/ 02 апреля 2009

Вы спрашиваете о идемпотенте ?

1 голос
/ 11 марта 2015

Здесь есть два разных понятия, поэтому вам может потребоваться объединить несколько терминов по той же причине, что нет единственного прилагательного для описания «красного круглого дома».

> Изменения состояния вне области транзакции базы данных не допускаются.

> Если функция изменяет данные в базе данных, это нормально, потому что, если вызывающая транзакция откатывается, эффект функции тоже.

Существует только "область действия базы данных" и "область действия сеанса". Функция не имеет понятия «объем транзакции». Функцию можно использовать внутри транзакции или за пределами этой транзакции , однако с точки зрения функции не будет никакой разницы.

С точки зрения функции, «область транзакции» равна точно «область базы данных». Вещи в незафиксированной транзакции не должны быть зафиксированы, и поскольку это относится ко всем транзакциям, в этом нет ничего особенного:

Если вы вызываете функцию дважды в одной транзакции с изоляцией REPEATABLE READ, вы должны получить тот же результат, даже если другие клиенты вносят изменения в базу данных.

потому что это описание транзакции, а не функции. Мы можем смело игнорировать любое описание, касающееся «транзакций».

> Он может запросить таблицу базы данных, но не может прочитать файл из файловой системы или проверить связь с веб-сайтом и т. Д.

> Изменения в состоянии вне области действия базы данных транзакция не допускаются. Функция не должна отправлять электронные письма, записывать в файловую систему и сохранять значения в memcached и т. Д.

> Если функция изменяет данные в базе данных, это нормально , потому что, если вызывающая транзакция откатывается, тогда эффект функции слишком .

> Но нет никаких различий между изменениями, внесенными в транзакцию [база данных], и изменениями, внесенными вне этой области.

Ближайший термин, вероятно, будет "базой данных".

> Аналогично, функция не имеет побочных эффектов, за исключением в пределах той же транзакции [база данных].

Что означает, что имеет побочных эффектов.

> Функции базы данных, которые я имею в виду, могут основываться на состоянии данных, и эта функция также может влиять на состояние данных.

Ближайшим термином является «ненулевой», или «возможно, с состоянием» .

Итак, вывод «Локальная ненулепотентная функция БД».

1 голос
/ 02 апреля 2009

До четвертого абзаца я думал, что это просто чистая функция с транзакцией в качестве неявного аргумента. Но когда вы говорите:

функция не имеет побочных эффектов, за исключением той же области транзакции. Изменения в состоянии вне области транзакции базы данных не допускаются.

Я не уверен. Вы имеете в виду, что он может вносить изменения в транзакции, но не знать о них при будущем вызове? Как вы возводите это в квадрат:

Если вы вызываете функцию дважды в одной транзакции с изоляцией REPEATABLE READ, вы должны получить тот же результат

Другими словами, ограничиваете ли вы побочные эффекты в транзакциях назначениями (такими как установка флага в значение true), которые имеют тот же эффект, если выполняются несколько раз?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...