Разница между чистой и нечистой функцией?

Я предположил, что чистые функции всегда должны иметь возвращаемый тип (т. е. не должны быть void) и должны иметь один и тот же вывод независимо от состояния объекта, а нечистые функции изменяют состояние объекта или печатают состояние объекта.

Но в учебнике, который я использую, говорится, что:

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

Я в замешательстве. Который правильный?

ИЗМЕНИТЬ

Небольшое уточнение. Что заставляет меня задать этот вопрос:

Последний вопрос: «Укажите тип используемой функции», и люди, комментировавшие там, заявили, что это нечистая функция, поскольку она печатает.

Так является ли эта функция чистой или нечистой?


person Amith KK    schedule 14.03.2014    source источник
comment
Я всегда слышал, что аксессор используется как синоним геттера: функция, которая в основном просто возвращает значение, возможно, с предварительной проверкой состояния. Но эта концепция ортогональна чистоте, поэтому я не совсем понимаю, что вы имеете в виду под этим вопросом. Вы предполагаете свойство для подмножества функций (чистые функции должны иметь возвращаемый тип), затем указываете другое свойство для совершенно другого подмножества функций, а затем спрашиваете, что верно. Ничто не мешает обоим быть правильными (кроме того, что я никогда не слышал об этом определении доступа).   -  person yshavit    schedule 14.03.2014
comment
После редактирования мне кажется, что настоящий вопрос здесь заключается в том, действительно ли access() является средством доступа; Я бы сказал, что это не так. Проблема чистоты по-прежнему кажется ортогональной, и, судя по вашему вопросу, вы, кажется, уже знаете ответ на эту часть. :)   -  person yshavit    schedule 14.03.2014
comment
Re метод, который выводит информацию о состоянии объектов, также может быть классифицирован как метод доступа. - учебник неверен. Accessors возвращает информацию вызывающему — они не используют боковую связь (в данном случае печать) для передачи информации от объекта куда-то еще. Печать является побочным эффектом; это не будет считаться доступом/доступом к данным.   -  person ToolmakerSteve    schedule 01.11.2019
comment
Обратите внимание, что код примера на изображении не компилируется: access() объявляется возвращающим экземпляр типа Void, но его тело не возвращает. Кроме того, этот пример нарушает соглашения об именах Java, поскольку требует, чтобы имена классов записывались в PascalCase.   -  person MC Emperor    schedule 07.11.2020


Ответы (5)


Контент взят с этой ссылки

Характеристики чистой функции:

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

  2. Они не имеют побочных эффектов, таких как сетевые вызовы или вызовы базы данных.

  3. Они не изменяют переданные им аргументы.

Характеристики нечистых функций

  1. Возвращаемое значение нечистых функций зависит не только от их аргументов. Следовательно, если вы вызываете нечистые функции с одним и тем же набором аргументов, вы можете получить разные возвращаемые значения. Например, Math.random(), Date.now()

  2. Они могут иметь какие-либо побочные эффекты, такие как сетевые вызовы или вызовы базы данных.

  3. Они могут изменять переданные им аргументы.

function impureFunc(value){
  return Math.random() * value;
}

function pureFunc(value){
  return value * value;
}

var impureOutput = [];
for(var i = 0; i < 5; i++){
   impureOutput.push(impureFunc(5));
}

var pureOutput = [];
for(var i = 0; i < 5; i++){
   pureOutput.push(pureFunc(5));
}

console.log("Impure result: " + impureOutput); // result is inconsistent however input is same. 

console.log("Pure result: " + pureOutput); // result is consistent with same input

person A.T.    schedule 27.10.2016

Из Википедии — функция может быть описана как чистая функция, если оба этих утверждения о функции держать:

  1. Функция всегда оценивает одно и то же значение результата при одних и тех же значениях аргументов. Значение результата функции не может зависеть ни от какой-либо скрытой информации или состояния, которое может измениться в ходе выполнения программы или между различными выполнениями программы, а также не может зависеть от каких-либо внешних входных данных от устройств ввода-вывода.
  2. Оценка результата не вызывает каких-либо семантически наблюдаемых побочных эффектов или выходных данных, таких как изменение изменяемых объектов или вывод на устройства ввода-вывода.

Следовательно, если какое-либо из утверждений ложно по сравнению с вашим кодом, то оно нечисто.

person Elliott Frisch    schedule 14.03.2014
comment
Я лично считаю вывод диагностики или трассировки семантически не наблюдаемым, поэтому я не решаюсь так или иначе сделать заявление о печати чего-либо. - person Jeffrey Hantin; 14.03.2014
comment
И добавить к вашему ответу Из ссылки на Википедию. printf() является нечистым, потому что в качестве побочного эффекта он вызывает вывод на устройство ввода-вывода. Похоже, что функция нечиста, так как он печатает - System.out.println - person Sky; 14.03.2014

Mu. Вы, кажется, предполагаете, что метод доступа является чистой функцией определение. Это не обязательно так — метод доступа (даже метод доступа get, возвращающий значение) может быть нечистым, например, метод get в LinkedHashMap в режиме порядка доступа (который перемещает запрошенную запись на последнюю позицию в порядке итерации).

person Jeffrey Hantin    schedule 14.03.2014

Оба утверждения верны.

Когда вы создаете методы для получения значения, которые называются СПОСОБЫ ДОСТУПА

Пример:

public String getName(){
    return this.name;
}

а для установки значения мы используем методы с VOID, которые называются МЕТОДЫ МУТАТОРА.

Пример:

public void setName(String n){
    this.name=n;
}
person ΔȺȾΔ    schedule 14.03.2014

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

person Amiya Upadhyay    schedule 29.12.2014