/
Вопросы и ответы
/
Вайбкодинг
/

Как правильно давать ИИ задачу на рефакторинг?

Как правильно давать ИИ задачу на рефакторинг?

14 дней назад

Никита Вихров

Ответы

0

Плохой рефакторинг-промпт звучит так: «Улучши этот код». ИИ переименует переменные, добавит комментарии и отчитается об успехе. Функция при этом останется такой же запутанной.

Хороший промпт описывает конкретную проблему. Возьмём пример — функция, которая делает слишком много:

// До рефакторинга
async function handleSubmit(formData) {
  const errors = {};
  if (!formData.email.includes('@')) errors.email = 'Неверный email';
  if (formData.password.length < 8) errors.password = 'Минимум 8 символов';
  if (Object.keys(errors).length > 0) return { ok: false, errors };

  const res = await fetch('/api/auth/register', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(formData),
  });
  const data = await res.json();
  if (!res.ok) return { ok: false, errors: data.errors };

  localStorage.setItem('token', data.token);
  window.location.href = '/dashboard';
  return { ok: true };
}

Вместо «улучши» пишешь:

«Функция делает три вещи: валидацию, запрос к API и сайд-эффекты после успеха. Раздели на отдельные функции. Валидацию вынеси чисто, без fetch. Сайд-эффекты — наружу, пусть вызывающий код решает, что делать после успеха».

ИИ даёт что-то вроде:

// После рефакторинга
function validateRegistrationForm(formData) {
  const errors = {};
  if (!formData.email.includes('@')) errors.email = 'Неверный email';
  if (formData.password.length < 8) errors.password = 'Минимум 8 символов';
  return errors;
}

async function registerUser(formData) {
  const res = await fetch('/api/auth/register', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(formData),
  });
  const data = await res.json();
  if (!res.ok) throw new Error(JSON.stringify(data.errors));
  return data;
}

// В компоненте
async function handleSubmit(formData) {
  const errors = validateRegistrationForm(formData);
  if (Object.keys(errors).length > 0) return { ok: false, errors };

  try {
    const data = await registerUser(formData);
    localStorage.setItem('token', data.token);
    window.location.href = '/dashboard';
    return { ok: true };
  } catch (e) {
    return { ok: false, errors: JSON.parse(e.message) };
  }
}

Теперь validateRegistrationForm тестируется без fetch. registerUser не знает про localStorage. Логика после успеха — в одном месте.

Чем точнее описан принцип, который нарушен — тем полезнее рефакторинг от ИИ. «Принцип единственной ответственности нарушен вот здесь» работает лучше, чем «перепиши лучше».

14 дней назад

Никита Вихров

+7 800 100 22 47

бесплатно по РФ

+7 495 085 21 62

бесплатно по Москве

108813 г. Москва, вн.тер.г. поселение Московский,
г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3
ОГРН 1217300010476
ИНН 7325174845