Что такое чистая функция (pure function)?

«Что такое чистая функция (pure function)?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Чистая функция — это функция, которая:

  1. Детерминирована: Всегда возвращает один и тот же результат для одних и тех же входных аргументов.
  2. Не имеет побочных эффектов (side-effects): Не изменяет внешнее состояние (глобальные переменные, входные параметры, файловую систему, БД) и не зависит от него.

Примеры на Java:

// ✅ ЧИСТАЯ функция
public static int add(int a, int b) {
    return a + b; // Результат зависит только от a и b, нет побочных эффектов.
}

// ✅ ЧИСТАЯ функция (работает с неизменяемыми объектами)
public static String greet(String name) {
    return "Hello, " + name; // Создаётся новая строка, исходная не меняется.
}

// ❌ НЕЧИСТАЯ функция (побочный эффект - изменение внешней переменной)
private static int counter = 0;
public static int increment() {
    return ++counter; // Результат разный при каждом вызове, меняет глобальное состояние.
}

// ❌ НЕЧИСТАЯ функция (побочный эффект - модификация входного параметра)
public static void clearList(List<String> list) {
    list.clear(); // Изменяет переданный извне объект.
}

// ❌ НЕЧИСТАЯ функция (зависит от внешнего состояния - текущего времени)
public static long getCurrentTime() {
    return System.currentTimeMillis(); // Результат всегда разный.
}

Преимущества чистых функций:

  • Предсказуемость и надёжность: Легко рассуждать о поведении.
  • Тестируемость: Не требуют сложной настройки окружения (mocks).
  • Потокобезопасность: Отсутствие общего изменяемого состояния.
  • Кэшируемость (мемоизация): Результат можно сохранить для повторного использования.
  • Композируемость: Функции легко комбинировать в цепочки.

Чистые функции — фундаментальная концепция функционального программирования, применимая и в ООП для создания надёжного кода.