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

Ответ

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

  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).
  • Потокобезопасность: Отсутствие общего изменяемого состояния.
  • Кэшируемость (мемоизация): Результат можно сохранить для повторного использования.
  • Композируемость: Функции легко комбинировать в цепочки.

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

Ответ 18+ 🔞

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

Смотри, представь себе самого предсказуемого мужика на районе. Зовут его, допустим, Васян. Ты ему даёшь два яблока и три яблока. Он всегда, в любой день недели, даже с похмелья, скажет: «Пять яблок, ёпта». Вот это и есть детерминированность, блядь. Один и тот же ввод — один и тот же, мать его, вывод. Никаких «а сегодня мне кажется, что шесть».

И второе, самое главное — этот Васян ничего вокруг себя не ломает. Он яблоки посчитал и всё. Он не пнёт рядом стоящую урну, не перепишет цифру в глобальном табло посёлка, не позвонит твоей бабушке и не насплетничает. Он просто вернул тебе ответ и сидит себе дальше. Это и есть отсутствие побочных эффектов. Ничего не изменил, только посчитал.

А теперь смотри, как это в коде выглядит, а то я чувствую, ты уже подозрение ебать начинаешь чувствовать.

// ✅ Вот это наш Васян, чистая функция, золотой мужик.
public static int add(int a, int b) {
    return a + b; // Взял a, взял b, вернул a+b. Ничего не тронул вокруг. Красава.
}

// ✅ И это чистый. Строку новую склеил, старую не испоганил.
public static String greet(String name) {
    return "Hello, " + name;
}

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


// ❌ Смотри на этого уёбка. Глобальную переменную портит.
private static int counter = 0;
public static int increment() {
    return ++counter; // Каждый раз разный результат! И counter везде теперь изменился! Пиздец!
}

// ❌ А этот, сука, пришёл и список твой к хуям очистил!
public static void clearList(List<String> list) {
    list.clear(); // Ты ему доверил посмотреть, а он всё выкинул! Манда с ушами!
}

// ❌ Этот вообще от системы зависит, как наркоман от дозы. Время спрашивает.
public static long getCurrentTime() {
    return System.currentTimeMillis(); // Щас скажет одно, через милисекунду — другое. Ненадёжный тип.
}
**

И зачем, спрашивается, с такими Васянами дружить? А затем, ёпта, что у них сплошные плюсы, как у работяги с золотыми руками:

*   **Не подведут.** Всегда знаешь, чего от них ждать. Никаких сюрпризов.
*   **Проверить их — раз плюнуть.** Не нужно вокруг них целый цирк с конями разворачивать, базу данных поднимать или глобальные счётчики сбрасывать. Дал вход — получил выход.
*   **В толпе не затеряются.** Можно хоть тысячу таких Васиев запустить одновременно — они друг другу мешать не будут, ибо ничего общего не трогают.
*   **Запоминают.** Раз посчитал «2 + 3 = 5», можно результат записать на бумажке и больше не дергать Васю, отдал бумажку — и всё.
*   **Как кубики Лего.** Одного Васю (функцию) можно вставить в другого Васю, потом в третьего — и всё будет работать, как часы, не сломается.

Вот и весь сказ, блядь. Чистая функция — это не какой-то заумный термин из функциональщины, это просто **предсказуемый и непаскудный кусок кода**. И его везде можно применять, даже в твоём ООП, чтобы спать спокойно и не бояться, что что-то где-то неожиданно накрылось медным тазом.