ChatGPT от OpenAI, продвинутая языковая модель искусственного интеллекта, выделяется своей способностью интерпретировать написанный человеком текст и генерировать ответы как в письменной форме, так и в программном коде. Эта функция делает ChatGPT многогранным инструментом разработки программного обеспечения, помогающим обеспечить качество кода и избежать технической задолженности.
Кент Бек, пионер шаблонов проектирования программного обеспечения и один из 17 первых подписантов манифеста Agile, и Мартин Фаулер, инженер-программист и специалист по объектно-ориентированному проектированию и анализу, ввели термин “запах кода” для шаблонов, которые могут указывать на дефекты дизайна. Эти дефекты не являются ошибками, скорее, это вещи, которые могут вызывать их или препятствовать разработке — то, что бросало вызов практике экстремального программирования Бека и Фаулера. Запахи кода порождают техническую задолженность — скрытые затраты на выбор быстрых и простых решений, требующих доработки в будущем, вместо того, чтобы тратить усилия сейчас на более эффективное решение.
ChatGPT позволяет разработчикам решать проблемы с качеством кода и эффективно управлять технической задолженностью. Он помогает генерировать и дополнять код, выявлять и рекомендовать исправления ошибок в коде, проводить рефакторинг и расширять документацию по коду.
В этой статье демонстрируется, как использовать ChatGPT для улучшения качества кода, включая определение запахов кода и рефакторинг кода. Затем рассматриваются ограничения ChatGPT и лучшие практики разработки программного обеспечения.
ChatGPT поможет вам определить запахи кода в кодовой базе .NET. Хотя вы можете использовать любой язык, в этой статье используется C #.
Чтобы определить запахи кода, сначала подготовьте свой код. Извлеките соответствующие фрагменты кода и убедитесь, что они правильно отформатированы и легко читаемы. ChatGPT работает лучше всего, когда вы разбиваете свой код на более мелкие фрагменты и даете ИИ достаточно контекста для понимания кода.
Затем отправьте четкое и лаконичное приглашение. Например, вы можете попросить ChatGPT определить запахи кода во фрагменте или проверить, соответствует ли ваш код определенному принципу SOLID object-oriented design. SOLID — это аббревиатура, обозначающая пять ключевых принципов объектно-ориентированного проектирования: единая ответственность, открытый-закрытый дизайн, замена Лискова, разделение интерфейса и инверсия зависимостей.
Затем проанализируйте ответ ChatGPT. Однако обратите внимание, что его отзывы не идеальны, как показано в следующем примере. Поэтому всегда руководствуйтесь своим суждением как разработчика, чтобы определить, какие предложения реализовать.
Запрос ChatGPT: Пожалуйста, проанализируйте следующий фрагмент кода и определите любые потенциальные запахи кода, присутствующие в нем.
private void ComputeGloom(WordDictionary wordDictionary, List<string> gloom) { wordDictionary._gloomScore = 0; for (int i = 0; i < gloom.Count; i++) { if (wordDictionary.GloomWordsContain(gloom[i])) { int val; wordDictionary.GloomWords.TryGetValue(gloom[i], out val); wordDictionary._gloomScore += val; } } }
Ответ ChatGPT эффективно выявляет feature envy, отмечая, что функция ComputeGloom, похоже, больше взаимодействует с классом WordDictionary, чем со своим собственным классом. Зависть к функциям возникает, когда метод проявляет больший интерес к классу, отличному от его собственного. Часто это указывает на то, что вы должны возложить обязанности метода на класс, которому он “завидует”. ChatGPT также обнаруживает ненадлежащую близость или нарушение инкапсуляции, избыточный код и, возможно, неадекватный API.
Конечный результат с запахом кода может быть ложноположительным. Предположение о плохом API может быть ошибочным, поскольку пользователь метода ожидает, что приложение каким-то образом вернет вычисленное значение gloom. Тип метода void указывает на это ожидание.
Рефакторинг реструктурирует существующий код без изменения функциональности, улучшая его читаемость, ремонтопригодность и общее качество. ChatGPT может предложить методы рефакторинга для оптимизации вашего кода. Учитывая предыдущий пример кода, ChatGPT предлагает следующие методы рефакторинга.
Запрос ChatGPT: Представьте переработанную версию данного кода для устранения любых обнаруженных запахов кода или проблем. Предоставьте исчерпывающую сводку всех внесенных изменений, включая объяснение того, почему результирующий переработанный код является улучшением по сравнению с исходной версией.
private void ComputeGloom(WordDictionary wordDictionary, List<string> gloom) { wordDictionary._gloomScore = 0; for (int i = 0; i < gloom.Count; i++) { if (wordDictionary.GloomWordsContain(gloom[i])) { int val; wordDictionary.GloomWords.TryGetValue(gloom[i], out val); wordDictionary._gloomScore += val; } } }
public class WordDictionary { public Dictionary<string, int> GloomWords { get; private set; } public int GloomScore { get; private set; } public WordDictionary (Dictionary<string, int> gloomWords) { GloomWords gloomWords ?? new Dictionary<string, int>(); GloomScore = 0; } public void ComputeGloom(List<string> gloom) { GloomScore = 0; foreach (var word in gloom) { if (GloomWords.TryGetValue(word, out int val)) { GloomScore += val; } } } }
Вот краткое изложение изменений и причин, стоящих за ними:
Переработанный код стал чище и эффективнее, с улучшенной инкапсуляцией данных и удобочитаемостью. Класс WordDictionary теперь несет четкую ответственность, а его общедоступный интерфейс предоставляет только необходимую информацию.
Просьба к ChatGPT объяснить суть рефакторинга помогает углубить ваше понимание того, как реструктурировать код. Затем вы сможете применять те же методы в будущем, сводя к минимуму необходимость устранения недостатков кода.
Крайне важно придерживаться принятых в отрасли передовых практик разработки программного обеспечения. Эти рекомендации повышают читаемость программного обеспечения, ремонтопригодность и масштабируемость, гарантируя, что код остается надежным и менее подверженным ошибкам.
ChatGPT может проанализировать ваш код, определить области, где он отличается от лучших практик, и предложить улучшения. В этом разделе рассматривается, как ChatGPT может помочь вам реализовать принципы SOLID объектно-ориентированного проектирования в вашей кодовой базе C #, включая принцип разделения интерфейсов (ISP). Провайдер заявляет, что клиенты не должны быть вынуждены зависеть от интерфейсов, которые они не используют.
Запрос ChatGPT: Не могли бы вы проанализировать этот код и указать области, где его потенциально можно улучшить? Существуют ли какие-либо рекомендации, принципы проектирования или соглашения, которые, по-видимому, отсутствуют или не были реализованы надлежащим образом?
public interface IDictionaryOperations { void ComputeGloom(List<string> gloom); int GetGloomScore(); void AddWord(string word, int score); void RemoveWord(string word); } public class WordDictionary : IDictionaryOperations { private int _gloomScore; private Dictionary<string, int> _gloomWords; public WordDictionary(Dictionary<string, int> gloomWords) { _gloomWords = gloomWords; _gloomScore = 0; } public void ComputeGloom(List<string> gloom) { _gloomScore = 0; foreach (var word in gloom) { if (_gloomWords.TryGetValue(word, out int val)) { _gloomScore += val; } } public int GetGloomScore() { return _gloomScore; } public void AddWord(string word, int score) { // Not needed for this class but necessary because of the interface throw new NotImplementedException(); } public void RemoveWord(string word) { // Not needed for this class but necessary because of the interface throw new NotImplementedException(); } }
Вот ответ:
В этом коде есть несколько моментов для обсуждения:
ChatGPT определяет, что код нарушает принцип разделения интерфейсов (ISP). Он рекомендует разделить интерфейс IDictionaryOperations на более детализированные интерфейсы, позволяя классам реализовывать только соответствующие методы. ChatGPT также указывает на другие проблемы, такие как неправильное использование NotImplementedException, недостаточная инкапсуляция данных, неоднозначное именование методов и потенциальная несогласованность состояний.
Интеграция ChatGPT в ваш процесс разработки на C # / .NET может повысить производительность и качество кода. Чтобы ускорить процесс разработки, вы можете использовать мощные инструменты, такие как Copilot от GitHub и CodeGPT, для решения следующих задач:
API ChatGPT Whisper позволяет программно использовать искусственный интеллект в ваших процессах разработки на /.NET, повышая производительность и качество кода.
Примените эти рекомендации, чтобы успешно интегрировать ChatGPT в ваш процесс разработки на /.NET:
Однако помните, что лучше всего, чтобы предложения ChatGPT просматривали и проверяли разработчики-люди.
Хотя ChatGPT помогает повысить качество кода и устранить техническую задолженность, у него есть некоторые ограничения:
Несмотря на эти недостатки, ChatGPT помогает выявлять недостатки кода, предлагать варианты рефакторинга и продвигать лучшие практики. Этот инструмент искусственного интеллекта может дополнить— а не заменить знания и суждения опытных разработчиков. Ниже приведены некоторые рекомендации по использованию ChatGPT в разработке:
При эффективном и осмотрительном использовании ChatGPT может помочь вам повысить качество кода и минимизировать техническую задолженность. Он помогает выявлять недостатки кода и оптимизировать рефакторинг на различных языках программирования. Однако его ограничения не должны оставаться незамеченными: лучше всего использовать ChatGPT для получения предложений и идей, но пока не используйте его для обеспечения соблюдения политик.
Этот подход, основанный на искусственном интеллекте, революционизирует разработку программного обеспечения, повышая эффективность и инновации, что приводит к более чистому коду и снижению технической задолженности. Начните экспериментировать с ChatGPT сегодня, чтобы преобразовать свои методы программирования.