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


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

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

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

EDIT

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

Последний вопрос состоит в том, чтобы" дать тип используемой функции", и люди, которые там комментировали, заявили, что это нечистая функция, поскольку это печать. Так является ли эта функция чистой или нечистой?
5 10

5 ответов:

Содержание взято из этой ссылки

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

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

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

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

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

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

  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

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

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

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

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

При создании методов для получения значения, которые называются методы доступа

бывший:

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

И для установления стоимости мы используем методы с недействительным, которые называются мутатор методы

бывший:

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

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