Создание чистых функций для генерации пользователя и выполнения сложения

Передавайте id и текущее значение счётчика аргументами. Генерация случайности и сохранение нового состояния остаются во внешнем коде, а функции только вычисляют результат.

Короткий ответ

Что ответить на собеседовании

Передавайте id и текущее значение счётчика аргументами. Генерация случайности и сохранение нового состояния остаются во внешнем коде, а функции только вычисляют результат.

Подробный разбор

Ответ с пояснениями

Условие

Требуется переписать функции createUser и add так, чтобы они стали чистыми: не влияли на внешнее состояние и не вызывали побочных эффектов, а вместо этого возвращали новые данные.

// 1
const produceId = () => Math.floor(Math.random() * 10000);
const createUser = (userName: string, userAge: number) => ({
  id: produceId(),
  name: userName,
  age: userAge
});
console.log(createUser("Alex", 28));
console.log(createUser("Alex", 28));
console.log(createUser("Alex", 28));

// 2
let counter = 2;
const add = (value: number) => {
  counter += value;
};

add(4);
console.log(counter);

Задача состоит в том, чтобы избавиться от изменения глобальной переменной counter и от скрытого использования случайного генератора внутри createUser. Функция создания пользователя должна возвращать объект без изменения внешних данных, а функция сложения должна возвращать новое значение вместо изменения counter.

Ответ

Передавайте id и текущее значение счётчика аргументами. Генерация случайности и сохранение нового состояния остаются во внешнем коде, а функции только вычисляют результат.

const createUser = (id: number, name: string, age: number) => ({ id, name, age });
const add = (current: number, value: number) => current + value;

const user = createUser(produceId(), 'Alex', 28);
const nextCounter = add(2, 4); // 6

createUser больше не читает скрытый генератор, а add не меняет глобальную переменную. Для одинаковых аргументов получаются одинаковые данные без внешних эффектов; объект создаётся новый. Сам produceId остаётся нечистым и вызывается на границе программы. Передача генератора вместо готового id улучшила бы тестируемость, но не сделала бы вызов createUser детерминированным автоматически.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее