Пришло время улучшить процесс кодирования с помощью улучшения кода на основе ИИ. Семейство моделей GPT от OpenAI предлагает разработчикам множество возможностей для улучшения, проверки, исправления и даже аутсорсинга написания кода. Знание того, как использовать эти большие языковые модели в процессе разработки, скоро станет важным инструментом в наборе инструментов разработчика.
Вы когда-нибудь задумывались, как ИИ может изменить ваш процесс кодирования? В этом руководстве мы продемонстрируем методы использования ChatGPT или GPT-4 для просмотра и рефакторинга кода, а также обсудим некоторые ограничения и предоставим полезные ресурсы для использования этих LLM в рабочем процессе программирования.
Мы начнем с способов проверки и рефакторинга, и для каждого из них вы можете поэкспериментировать с различными подсказками и предоставленными методами, чтобы раскрыть весь потенциал улучшения кода с помощью ИИ.
Примечание. Я буду использовать термин GPT4 во время содержания, так как это текущая модель, запрашиваемая для содержащихся примеров. ChatGPT (GPT3.5) работает аналогичным образом и может использоваться взаимозаменяемо.
- Рефакторинг кода с помощью GPT-4 и ChatGPT
- Добавление лучших практик или принципов кодирования
- Обнаружение и исправление ошибок
- Создать шаблонный код (*мой любимый)
- Создание модульных тестов
- Советы по улучшению рефакторинга
- Подход с несколькими подсказками (цепочка подсказок)
- 1. Модернизация и добавление лучших практик
- 2. Проверка на наличие логических ошибок и проблем с безопасностью
- 3. Проверка рекомендаций (размышление)
- 4. Напишите код
- 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 быстро были внесены следующие улучшения:
- Добавлены комментарии JSDoc
- Преобразовал tempConvertфункцию в функцию стрелки.
- Заменено varна constнеизменяемые переменные.
- Используются строгие проверки на равенство ( ===) для сравнения строк.
- Введена константа для устранения магических чисел.
- Упрощен оператор возврата с помощью литералов шаблонов.
Проблемы:
- Логика: этот метод и подсказка хорошо подходят для обновления известных методов кодирования, но могут закрывать глаза на бизнес-логику. В приведенном ниже примере неправильно реорганизована логика преобразования.
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:
- Добавлена проверка входного параметра, чтобы убедиться, что элементы являются массивом, а DiscountPercentage — числом.
- Проверены граничные условия для DiscountPercentage, чтобы убедиться, что он находится в диапазоне от 0 до 100.
- Добавлена проверка свойств предметов и их типов, чтобы убедиться, что цена и количество являются числами.
Создать шаблонный код (*мой любимый)
Начало новых проектов может быть болезненным. 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. Проверка на наличие логических ошибок и проблем с безопасностью
Получите обзор своего кода с рекомендациями по исправлению любых логических проблем или проблем безопасности. Важно, чтобы мы не запрашивали рефакторинг, а только аргументы в пользу рефакторинга.
Ответ 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функцию, которую я предоставил ранее, я понял, что допустил ошибку в своем предыдущем ответе. Я уже включил строгое равенство (===) и литералы шаблонов в предоставленную функцию.
Однако мои первоначальные рекомендации по-прежнему применимы для повышения надежности и удобочитаемости функции. Подводя итог, вот обновленные рекомендации:
- Проверка ввода: добавьте проверки проверки ввода для параметров tempи scale, чтобы убедиться, что они имеют ожидаемые типы и значения: {код}
- Необработанное значение масштаба: обработайте случаи, когда scaleпараметр не «C» или «F», чтобы избежать вводящих в заблуждение преобразований: {code}
- Удобочитаемость кода: разделите логику преобразования на две отдельные функции, чтобы улучшить удобочитаемость и удобство сопровождения: {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 минут на его отладку и настройку, если он не подходит для вашей кодовой базы.. Вы бы лучше сами написали.
- Это может быть устаревшим: мир технологий движется быстро. Вы можете столкнуться с проблемами с любой недавно обновленной библиотекой, платформой или технологией.
Заключение
Программирование на базе искусственного интеллекта — это всего лишь новинка, но она никуда не денется. При правильном использовании это может сэкономить время и помочь нам писать лучший код. Надеюсь, вам понравилась эта статья, и вы усвоили некоторые новые навыки, которые помогут вам повысить производительность программирования или обработку ошибок.