JS JavaScript  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Рефакторинг и проверка чужого JavaScript

Профессиональный тест о запахах кода, декомпозиции, модульных контрактах и сохранении поведения. Вопросы требуют отличать косметическую перепись от безопасного изменения, строить characterization tests и выбирать границы, которые уменьшают связность вместо переноса сложности.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. В тесте 30 вопросов и 85 минут; код лучше читать построчно, не полагаясь на первое впечатление. После завершения откроются общий процент, 6 тематических шкал и объяснение каждого решения.
Вопрос 1 из 30
Что сильнее всего выдаёт boolean parameter smell?
JavaScript
processOrder(order, true);
processOrder(order, false);
Вопрос 2 из 30
Почему дублирование двух похожих блоков не всегда нужно сразу объединять?
JavaScript
function priceBook(x) { /* скидки книг */ }
function priceTicket(x) { /* пока похожие шаги билетов */ }
Вопрос 3 из 30
Какой риск у функции, читающей globalConfig и currentUser скрыто?
JavaScript
function canEdit(document) {
  return globalConfig.editing && currentUser.role === "admin";
}
Вопрос 4 из 30
Что означает shotgun surgery?
Вопрос 5 из 30
Когда magic number 86400000 особенно опасен?
JavaScript
const expires = createdAt + 86400000;
Вопрос 6 из 30
Какую часть лучше выделить первой?
JavaScript
async function checkout(id) {
  const order = await db.load(id);
  const discount = calculateDiscount(order);
  await db.save({ ...order, discount });
  await mail.send(order.user);
}
Вопрос 7 из 30
Почему context object из 40 полей скрывает проблему?
JavaScript
function formatInvoice(context) {
  return `${context.order.id}: ${context.currency}`;
}
Вопрос 8 из 30
Что даёт ранний return в deeply nested validation?
JavaScript
function validate(user) {
  if (!user) return fail("user");
  if (!user.active) return fail("inactive");
  return proceed(user);
}
Вопрос 9 из 30
Почему функция getUserAndSendEmail плохо названа/разделена?
JavaScriptЗапрос и внешний эффект
async function getUserAndSendEmail(id) {
  const user = await repository.get(id);
  await mailer.sendWelcome(user.email);
  return user;
}
Вопрос 10 из 30
Когда локальная маленькая функция хуже inline кода?
Вопрос 11 из 30
Почему fetch при импорте модуля опасен?
JavaScript
// config.js
export const configPromise = fetch("/config").then(r => r.json());
Вопрос 12 из 30
Как разорвать цикл domain ↔ ui?
JavaScript
// domain imports ui/showError
// ui imports domain/saveOrder
Вопрос 13 из 30
Почему экспорт внутреннего mutable Map опасен?
JavaScript
export const sessions = new Map();
Вопрос 14 из 30
Что лучше вернуть adapter при ошибке стороннего SDK?
JavaScriptГраница стороннего SDK
async function charge(order) {
  try { return await sdk.pay(order); }
  catch (error) { /* контракт адаптера */ }
}
Вопрос 15 из 30
Почему barrel export * может ухудшить архитектуру?
Вопрос 16 из 30
Что такое characterization test?
JavaScript
it.each(recordedCases)("повторяет текущий расчёт", (input, output) => {
  expect(legacy(input)).toEqual(output);
});
Вопрос 17 из 30
Почему нельзя одновременно рефакторить и менять округление в одном diff?
JavaScriptПоведение до рефакторинга
const total = Math.round(sum * 100) / 100;
// В новой версии одновременно меняют структуру и правило округления.
Вопрос 18 из 30
Как сравнить старую и новую реализацию на production-like данных безопасно?
JavaScript
const oldResult = legacy(input);
const newResult = revised(input);
reportDiff(sanitize(input), oldResult, newResult);
Вопрос 19 из 30
Почему snapshot JSON всего ответа может мешать рефакторингу?
Вопрос 20 из 30
Что делать с обнаруженным старым багом во время чистого рефакторинга?
Вопрос 21 из 30
Почему маленькие зелёные коммиты полезны?
BashКоманды
git bisect start
git bisect bad HEAD
git bisect good before-refactor
Вопрос 22 из 30
Какой review-комментарий сильнее?
JavaScript
await notify(user);
await save(order); // раньше порядок был обратным
Вопрос 23 из 30
Почему linter не доказывает безопасный рефакторинг?
Вопрос 24 из 30
Что делать, если после переписи ошибка появляется только на одном старом документе?
Вопрос 25 из 30
Почему комментарий «не менять порядок» без теста слаб?
Вопрос 26 из 30
Почему замена find в цикле на Map может быть полезной?
JavaScript
const byId = new Map(users.map(user => [user.id, user]));
for (const order of orders) enrich(order, byId.get(order.userId));
Вопрос 27 из 30
Когда удаление dead code рискованно?
Вопрос 28 из 30
Почему универсальная abstraction может замедлить сопровождение?
Вопрос 29 из 30
Как рефакторить публичный API без одномоментного слома?
Вопрос 30 из 30
Что важнее уменьшения числа строк?

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу