Вынесите случайность, сеть, чтение DOM и логирование за пределы вычисления. Чистая функция должна получать все данные аргументами и возвращать новый результат, не меняя params и внешний x.
Переделайте функцию add, чтобы сделать ее чистой
Вынесите случайность, сеть, чтение DOM и логирование за пределы вычисления. Чистая функция должна получать все данные аргументами и возвращать новый результат, не меняя params и внешний x.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Задача — очистить функцию add, удалив все, что нарушает принципы чистой функции.
let x = 2;
const add = async (params, y) => {
params.value = y;
y += y + Math.random(params.value);
x += y;
console.log('doubling', x);
const { data } = await axios({ method: 'get', url: '/' });
const elem = document.getElementById('elem');
const width = elem.getBoundingClientRect().width;
return x + data + width;
};
add({ value: 4 }, 1);
Ответ
Вынесите случайность, сеть, чтение DOM и логирование за пределы вычисления. Чистая функция должна получать все данные аргументами и возвращать новый результат, не меняя params и внешний x.
function add({ params, y, x, randomValue, data, width }) {
const nextY = 2 * y + randomValue;
const nextX = x + nextY;
return {
params: { ...params, value: y },
x: nextX,
value: nextX + data + width
};
}
Предполагаются числовые x/y/randomValue/data/width. Math.random игнорирует переданный аргумент, поэтому params.value не влиял на случайное число. Оболочка с побочными эффектами отдельно получает ответ сервера и ширину, вызывает чистую add и при необходимости сохраняет результат или логирует. async внутри чистого арифметического ядра больше не нужен.