Как просматривать и рефакторить код с помощью GPT-4 (и ChatGPT)?

Почему чтение кода важнее написания Изучение

Пришло время улучшить процесс кодирования с помощью улучшения кода на основе ИИ. Семейство моделей GPT от OpenAI предлагает разработчикам множество возможностей для улучшения, проверки, исправления и даже аутсорсинга написания кода. Знание того, как использовать эти большие языковые модели в процессе разработки, скоро станет важным инструментом в наборе инструментов разработчика.

Вы когда-нибудь задумывались, как ИИ может изменить ваш процесс кодирования? В этом руководстве мы продемонстрируем методы использования ChatGPT или GPT-4 для просмотра и рефакторинга кода, а также обсудим некоторые ограничения и предоставим полезные ресурсы для использования этих LLM в рабочем процессе программирования.

Мы начнем с способов проверки и рефакторинга, и для каждого из них вы можете поэкспериментировать с различными подсказками и предоставленными методами, чтобы раскрыть весь потенциал улучшения кода с помощью ИИ.

Примечание. Я буду использовать термин GPT4 во время содержания, так как это текущая модель, запрашиваемая для содержащихся примеров. ChatGPT (GPT3.5) работает аналогичным образом и может использоваться взаимозаменяемо.

Рефакторинг кода с помощью GPT-4 и ChatGPT

Рефакторинг кода имеет решающее значение по нескольким причинам: он повышает удобочитаемость и удобство сопровождения, облегчая разработчикам понимание и изменение кода. Это также помогает предотвратить возможные ошибки и гарантирует, что ваш код соответствует установленным рекомендациям. В конечном итоге рефакторинг может привести к созданию более эффективного, надежного и надежного программного обеспечения.

ГПТ-4 может внести существенный вклад в этот процесс. Используя GPT-4 для просмотра и оценки вашего кода, вы можете быстро определить области для улучшения и создать более чистый и эффективный код. Использование возможностей GPT-4 может сэкономить время и снизить количество человеческих ошибок в процессе, что приведет к более последовательному соблюдению стандартов кодирования.

Модернизация старого кода

Вы можете быстро модернизировать свой код, предоставив свою старую функцию GPT-4 и попросив ее реорганизовать ее в соответствии с современными методами кодирования.

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

Быстрый:Refactor the following code to modern es6 programming standards

До:

function tempConvert(temp, scale) { // Vague function name
  var result = 0; // 'var' is so es2015
  if (scale == "C") { // Is this the correct way to compare strings?
    result = (temp - 32) * (5 / 9); // Magic numbers
  } else {
    result = (temp * (9 / 5)) + 32;
  }
  return result.toFixed(1) + "°" + (scale == "C" ? "F" : "C"); // This line feels a bit cluttered...
}

После:

/**
 * Converts a temperature between Celsius and Fahrenheit.
 * @param {number} temp - The temperature value to convert.
 * @param {string} scale - The temperature scale ('C' or 'F') to convert from.
 * @return {string} The converted temperature value, formatted with one decimal place and the appropriate unit.
 */
const tempConvert = (temp, scale) => {
  const isValidScale = scale === "C" || scale === "F";
  if (!isValidScale) {
    throw new Error("Invalid scale: must be 'C' or 'F'.");
  }

  const conversionFactor = 5 / 9; // <-- Note: This is not correct when 
  const result = scale === "C"
    ? (temp - 32) * conversionFactor
    : (temp * conversionFactor) + 32;

  const resultUnit = scale === "C" ? "F" : "C";
  return `${result.toFixed(1)}°${resultUnit}`;
}

В этой рефакторинговой версии GPT4 быстро были внесены следующие улучшения:

  1. Добавлены комментарии JSDoc
  2. Преобразовал tempConvertфункцию в функцию стрелки.
  3. Заменено varна constнеизменяемые переменные.
  4. Используются строгие проверки на равенство ( ===) для сравнения строк.
  5. Введена константа для устранения магических чисел.
  6. Упрощен оператор возврата с помощью литералов шаблонов.

Проблемы:

  • Логика: этот метод и подсказка хорошо подходят для обновления известных методов кодирования, но могут закрывать глаза на бизнес-логику. В приведенном ниже примере неправильно реорганизована логика преобразования.

After (Take 2):

Мы ту же подсказку от … и вуаля, она вернула гораздо лучшую версию функции. Этот двух- или более проходной подход чрезвычайно эффективен.

...
function convertTemperature(temperature, scale) {
  const isValidScale = scale === "C" || scale === "F";
  if (!isValidScale) {
    throw new Error("Invalid scale: must be 'C' or 'F'.");
  }

  const convertedTemperature = scale === "C"
    ? (temperature * (9 / 5)) + 32
    : (temperature - 32) * (5 / 9);

  const resultUnit = scale === "C" ? "F" : "C";
  return `${convertedTemperature.toFixed(1)}°${resultUnit}`;
}

Добавление лучших практик или принципов кодирования

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

Обратите внимание, что с тем же вводом он принял принцип программирования SOLID с единой ответственностью и разделил функцию на 3. В отличие от шага «Модернизация» ранее, он не преобразовал функцию в функцию стрелки.

«Выделив логику преобразования в отдельные функции, мы улучшили соответствие кода принципу единой ответственности (часть SOLID), поскольку теперь у каждой функции есть четкая, целенаправленная цель».

function tempConvert(temp, scale) {
  const isValidScale = scale === "C" || scale === "F";
  if (!isValidScale) {
    throw new Error("Invalid scale: must be 'C' or 'F'.");
  }

  const result = scale === "C" ? celsiusToFahrenheit(temp) : fahrenheitToCelsius(temp);
  const resultUnit = scale === "C" ? "F" : "C";
  return `${result.toFixed(1)}°${resultUnit}`;
}

function celsiusToFahrenheit(temp) {
  const conversionFactor = 9 / 5;
  return (temp * conversionFactor) + 32;
}

function fahrenheitToCelsius(temp) {
  const conversionFactor = 5 / 9;
  return (temp - 32) * conversionFactor;
}

Обнаружение и исправление ошибок

Иногда мы не замечаем уязвимостей или потенциальных проблем, которые может создать наш код. Получение GPT-4 для просмотра и устранения проблем с кодом может сэкономить вам больше, чем просто время.

Читайте также:  Аутсорсинг или аутстаффинг? Какой выбрать?

Быстрый: Review this code for errors and refactor to fix any issues:…

Входная (дефектная) функция:

function updateTotalPrice(items, discountPercentage) {
  let totalPrice = 0;

  for (let i = 0; i < items.length; i++) {
    const item = items[i];
    totalPrice += item.price * item.quantity;
  }

  // Potential error: discountPercentage is not validated or checked for boundary conditions
  const discount = totalPrice * (discountPercentage / 100);
  totalPrice -= discount;

  return totalPrice;
}

Выход:

function updateTotalPrice(items, discountPercentage) {
  // Fix 1: Validate input parameters
  if (!Array.isArray(items) || typeof discountPercentage !== 'number') {
    throw new Error('Invalid input parameters');
  }

  // Fix 2: Check for boundary conditions of discountPercentage
  if (discountPercentage < 0 || discountPercentage > 100) {
    throw new Error('Invalid discount percentage value. It should be between 0 and 100');
  }

  let totalPrice = 0;

  for (let i = 0; i < items.length; i++) {
    const item = items[i];
    
    // Fix 3: Validate item properties and types
    if (!item.hasOwnProperty('price') || !item.hasOwnProperty('quantity') || 
        typeof item.price !== 'number' || typeof item.quantity !== 'number') {
      throw new Error('Invalid item properties');
    }

    totalPrice += item.price * item.quantity;
  }

  const discount = totalPrice * (discountPercentage / 100);
  totalPrice -= discount;

  return totalPrice;
}

Изменения, внесенные GPT-4:

  1. Добавлена ​​проверка входного параметра, чтобы убедиться, что элементы являются массивом, а DiscountPercentage — числом.
  2. Проверены граничные условия для DiscountPercentage, чтобы убедиться, что он находится в диапазоне от 0 до 100.
  3. Добавлена ​​проверка свойств предметов и их типов, чтобы убедиться, что цена и количество являются числами.

Создать шаблонный код (*мой любимый)

Начало новых проектов может быть болезненным. GPT-4 не знает вашей бизнес-логики, но с его помощью можно запустить скучный шаблонный код в первый же день. Технически это не рефакторинг, но он потрясающий и может быть частью процесса в жизненном цикле программирования.

Создание модульных тестов

Мало того, что модульные тесты важны для вашей кодовой базы, они могут быть полезным способом быстрой проверки всего, что создается с помощью GPT-4.

Транспиляция кода

Есть много причин, по которым вам может понадобиться преобразовать код с одного языка на другой. Вы нашли репозиторий с кодом для одного языка, который вам нужен на другом, вы перемещаете базы кода, или, может быть, ваш начальник прочитал статью о последнем фреймворке внешнего интерфейса, и теперь вы переходите на {разделяющую новую библиотеку}.

В любом случае GPT-4 может оказать помощь простой подсказкой.

Добавляйте комментарии к коду

Если ваш код говорит сам за себя, но требует комментариев, это может значительно сэкономить время.

Советы по улучшению рефакторинга

Как и многие другие вещи в жизни, с GPT-4 вы получаете то, что вкладываете. В этом случае предоставление большего количества контекста, инструкций и рекомендаций обычно дает лучшие результаты.

Вот краткий список советов и приемов по улучшению рефакторинга кода:

  • Разделите подсказки: попробуйте разбить подсказки и желаемый результат на несколько шагов. Было показано, что сохранение подсказок с одним результатом дает лучшие результаты, чем комбинированные подсказки. Например, запросите обзор, а затем запросите рефакторинг на основе ответа на обзор. Со временем это может стать менее важным, поскольку LLM увеличат свой лимит токенов.
  • Приведите примеры: предоставьте ожидаемые входные данные, данные и выходные данные для повышения качества точности.
  • Будьте конкретны: не бойтесь точно перечислить, что вы хотите, что вы знаете, что необходимо и что не следует включать.
  • Попросите его подумать: было показано, что метод, называемый рефлексией, повышает точность GPT4. В основном спросите его: «Почему вы были неправы?» или заставить его задуматься и пересмотреть свой собственный ответ.

Подход с несколькими подсказками (цепочка подсказок)

Написание подсказок для GPT-4 очень похоже на написание функций. Хорошо продуманный набор подсказок — это тот, в котором у каждого есть отдельные задачи и отдельные обязанности. Вот простая цепочка подсказок для обновления, рефакторинга и проверки фрагмента кода. Вам может не понадобиться каждый шаг в вашем случае.

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

Примечание. Была использована та же функция ввода, что и ранее, но она выполнялась на другой модели и в другой день.

1. Модернизация и добавление лучших практик

Получите GPT-4, чтобы переписать ваш код в нужном вам стиле. Как видно выше, этот шаг обычно приводит к последовательному выводу в нужном вам стиле, но может привести к ошибкам, поэтому мы делаем это первым.

Быстрый:Review the following code and re-write it to modern es6 programming standards and formatting: {{tempConvert function from earlier}}

Ответ GPT-4:

const tempConvert = (temp, scale) => { // More descriptive function name
  let result = 0; // Use 'let' instead of 'var'
  const fahrenheitToCelsius = (temp - 32) * (5 / 9);
  const celsiusToFahrenheit = (temp * (9 / 5)) + 32;

  if (scale === "C") { // Use strict equality operator (===) for comparison
    result = fahrenheitToCelsius;
  } else {
    result = celsiusToFahrenheit;
  }

  const convertedScale = scale === "C" ? "F" : "C";
  return `${result.toFixed(1)}°${convertedScale}`; // Use template literals for cleaner string concatenation
};

2. Проверка на наличие логических ошибок и проблем с безопасностью

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

Читайте также:  Log4Shell: 4 вывода для разработчиков в 2022 году

Ответ GPT-4. Вот несколько рекомендаций по улучшению tempConvertфункции, чтобы решить логические проблемы и сделать ее более надежной:

1. Проверка ввода: функция не выполняет проверку ввода для предоставленных параметров температуры и масштаба. Это может привести к неожиданному поведению, если входные данные не в ожидаемом формате. Чтобы решить эту проблему, вы можете добавить проверки проверки ввода :

if (typeof temp !== 'number' || (scale !== 'C' && scale !== 'F')) {
  throw new Error('Invalid input. Temp must be a number and scale must be either "C" or "F".');
}

2. Необработанное значение масштаба: если scaleпараметр не «C» или «F», функция все равно будет выполнять преобразование градусов Цельсия в градусы Фаренгейта, что может ввести в заблуждение. Вы можете добавить проверку для обработки этого случая:

if (scale === 'C') {
  result = fahrenheitToCelsius;
} else if (scale === 'F') {
  result = celsiusToFahrenheit;
} else {
  throw new Error('Invalid scale value. Scale must be either "C" or "F".');
}

3. Удобочитаемость кода. Чтобы улучшить читаемость и удобство сопровождения, вы можете разделить логику преобразования на две отдельные функции для каждого преобразования (градусы Фаренгейта в градусы Цельсия и градусы Цельсия в градусы Фаренгейта). Это облегчит понимание и поддержку кода:

const fahrenheitToCelsius = temp => (temp - 32) * (5 / 9);
const celsiusToFahrenheit = temp => (temp * (9 / 5)) + 32;

3. Проверка рекомендаций (размышление)

Подтвердите предоставленные рекомендации. Как было показано выше, рефлексия — это мощная техника, позволяющая повысить точность первоначальных рекомендаций и попытаться устранить любые галлюцинации.

Это не всегда требуется, но стоит спросить, если вы не уверены в каких-либо рекомендациях. В нашем примере он просто повторяет те же рекомендации. В этом случае он не предоставил никакой дополнительной информации, но подтвердил правильность рекомендаций.

Ответ GPT-4: Приношу извинения за путаницу. Изучив tempConvertфункцию, которую я предоставил ранее, я понял, что допустил ошибку в своем предыдущем ответе. Я уже включил строгое равенство (===) и литералы шаблонов в предоставленную функцию.

Однако мои первоначальные рекомендации по-прежнему применимы для повышения надежности и удобочитаемости функции. Подводя итог, вот обновленные рекомендации:

  1. Проверка ввода: добавьте проверки проверки ввода для параметров tempи scale, чтобы убедиться, что они имеют ожидаемые типы и значения: {код}
  2. Необработанное значение масштаба: обработайте случаи, когда scaleпараметр не «C» или «F», чтобы избежать вводящих в заблуждение преобразований: {code}
  3. Удобочитаемость кода: разделите логику преобразования на две отдельные функции, чтобы улучшить удобочитаемость и удобство сопровождения: {code}

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

4. Напишите код

Объедините свои обзоры, рекомендации и отзывы и получите GPT-4, чтобы написать новую модную функцию.

const fahrenheitToCelsius = temp => (temp - 32) * (5 / 9);
const celsiusToFahrenheit = temp => (temp * (9 / 5)) + 32;

const tempConvert = (temp, scale) => {
  if (typeof temp !== 'number' || (scale !== 'C' && scale !== 'F')) {
    throw new Error('Invalid input. Temp must be a number and scale must be either "C" or "F".');
  }

  let result = 0;

  if (scale === 'C') {
    result = fahrenheitToCelsius(temp);
  } else if (scale === 'F') {
    result = celsiusToFahrenheit(temp);
  } else {
    throw new Error('Invalid scale value. Scale must be either "C" or "F".');
  }

  const convertedScale = scale === "C" ? "F" : "C";
  return `${result.toFixed(1)}°${convertedScale}`;
};

5. Создавайте тесты

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

Ответ GPT-4: вот два простых ванильных теста JavaScript для tempConvertфункции, один из которых должен пройти, а другой — провалиться:

const testTempConvertPass = () => {
  const inputTemp = 32;
  const inputScale = 'C';
  const expectedResult = '0.0°C';

  const result = tempConvert(inputTemp, inputScale);

  if (result === expectedResult) {
    console.log('Test pass: tempConvert with valid input');
  } else {
    console.error(`Test fail: tempConvert with valid input. Expected ${expectedResult} but got ${result}`);
  }
};

const testTempConvertFail = () => {
  try {
    const inputTemp = 32;
    const inputScale = 'InvalidScale';
    tempConvert(inputTemp, inputScale);
    console.error('Test fail: tempConvert with invalid input should throw an error');
  } catch (error) {
    console.log('Test pass: tempConvert with invalid input');
  }
};

// Run the tests
testTempConvertPass();
testTempConvertFail();

Ограничения

Эта статья посвящена искусственному интеллекту, однако эти модели не идеальны и не могут (пока) точно воспроизвести бизнес-логику, среди прочего. Вот список того, на что следует обратить внимание и чего следует избегать при использовании GPT-4 для проверки или рефакторинга кода:

  • Это может быть (уверенно) неправильно: GPT4 обучен звучать убедительно, но это не значит, что он всегда прав.
  • Предварительная экономия времени может оказаться бесполезной в долгосрочной перспективе: конечно, GPT-4 может сгенерировать вам 50 строк кода в минуту, но в конечном итоге вам может потребоваться 45 минут на его отладку и настройку, если он не подходит для вашей кодовой базы.. Вы бы лучше сами написали.
  • Это может быть устаревшим: мир технологий движется быстро. Вы можете столкнуться с проблемами с любой недавно обновленной библиотекой, платформой или технологией.

Заключение

Программирование на базе искусственного интеллекта — это всего лишь новинка, но она никуда не денется. При правильном использовании это может сэкономить время и помочь нам писать лучший код. Надеюсь, вам понравилась эта статья, и вы усвоили некоторые новые навыки, которые помогут вам повысить производительность программирования или обработку ошибок.

Оцените статью
bestprogrammer.ru
Добавить комментарий