Код-ревью Senior Проверка сгенерированного кода обновлено
Код-ревью: утилита дат и денег от ассистента
Вопрос
Ассистент написал утилиту для расчёта суммы заказов за день. Найдите проблемы.
// Сумма оплаченных заказов за календарный день
export function dailyTotal(orders, day) {
const start = new Date(day);
const end = new Date(start.getTime() + 24 * 60 * 60 * 1000);
let total = 0;
for (const o of orders) {
const t = new Date(o.paidAt);
if (t > start && t < end && o.status == "paid") {
total += o.amount * 1.2;
}
}
return total.toFixed(2);
}
Коротко
Код выглядит аккуратно, но в нём ровно те ошибки, которые ассистенты делают чаще всего: пропущенные краевые случаи (полночь, часовые пояса, переход на летнее время), выдуманное бизнес-правило и небрежная работа с деньгами. Такие вещи не ловит линтер, нужны тесты на границы и знание требований.
Что должен найти ревьюер
- Ошибкастрока 3new Date(day) для строки вида 2024-03-10 трактуется как UTC, а не как день в часовом поясе бизнеса. Явно задать часовой пояс.
- Ошибкастрока 4День не всегда 24 часа: при переходе на летнее время в части стран будет ошибка. Считать конец как начало следующих суток в нужном поясе.
- Ошибкастрока 8Строгое t > start теряет заказы, оплаченные ровно в полночь. Нужно t >= start.
- Стильстрока 8Нестрогое сравнение == вместо ===.
- Ошибкастрока 9Умножение на 1.2 нигде не описано: выдуманный налог или наценка. Бизнес-правило уточнить, а не угадывать.
- Ошибкастрока 9Деньги в числах с плавающей точкой копят ошибку округления. Считать в копейках целыми.
- Ошибкастрока 12toFixed возвращает строку, а по названию ожидается число. Вызывающий код может сложить строки.
Разбор
Код выглядит аккуратно, но в нём ровно те ошибки, которые ассистенты делают чаще всего: пропущенные краевые случаи (полночь, часовые пояса, переход на летнее время), выдуманное бизнес-правило и небрежная работа с деньгами. Такие вещи не ловит линтер, нужны тесты на границы и знание требований.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.