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

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

но учебник я использую гласит:

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

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

редактировать

немного разъяснить,что заставляет меня задать этот вопрос:

последний вопрос для "укажите тип используемой функции

Итак, эта функция чиста или нечиста?

5 ответов


С этой ссылке

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

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

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

  3. они не изменяют аргументы, которые им передаются

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

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

  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

с Википедия - функция может быть описана как чистая функция если оба эти утверждения о функции Hold:

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

поэтому, если любое утверждение ложно по сравнению с вашим кодом, то оно нечисто.


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


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

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

Ex:

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

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

Ex:

public void setName(String n){
    this.name=n;
}

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