Используйте искусственный интеллект Copilot для эффективного рефакторинга кода.
Рефакторинг кода — это процесс реструктуризации существующего кода без изменения его поведения. Преимущества рефакторинга включают повышение удобочитаемости кода, снижение сложности, упрощение обслуживания кода и упрощение добавления новых функций.
В этой статье приведены некоторые идеи по использованию Copilot для рефакторинга кода в интегрированной среде разработки.
Note
Примеры ответов включены в эту статью. GitHub Copilot Chat может дать вам различные ответы, приведенные здесь.
Перед изменением существующего кода необходимо убедиться, что вы понимаете его назначение и как он работает в настоящее время. Copilot может помочь вам в этом.
Выберите соответствующий код в редакторе интегрированной среды разработки.
Откройте встроенный чат:
В поле ввода для встроенного чата введите косую черту (/).
/
В раскрывающемся списке выберите /объясните и нажмите клавишу ВВОД.
Если объяснение, что возврат Copilot превышает несколько строк, нажмите кнопку "Вид" в чате , чтобы упростить чтение объяснения.
Copilot помогает оптимизировать код, например, чтобы сделать код более быстрым.
В двух разделах ниже мы будем использовать следующий пример скрипта Bash, чтобы продемонстрировать, как оптимизировать неэффективный код:
#!/bin/bash # Find all .txt files and count lines in each for file in $(find . -type f -name "*.txt"); do wc -l "$file" done
Copilot может определить, можно ли оптимизировать код, например пример скрипта Bash.
for Выберите цикл или весь содержимое файла.
for
Откройте Copilot Chat, щелкнув значок чата на панели действий или с помощью сочетания клавиш:
В поле ввода в нижней части панели чата введите: Can this script be improved?
Can this script be improved?
Copilot отвечает предложением, которое сделает код более эффективным.
Чтобы применить предлагаемое изменение, выполните указанные ниже действия.
В VS Code и JetBrains: наведите указатель мыши на предложение на панели чата и щелкните значок "Вставить курсор".
В Visual Studio: нажмите кнопку "Предварительный просмотр ", а затем в представлении сравнения нажмите кнопку "Принять".
Кроме того, если вы уже знаете, что существующий код, например пример скрипта bash, неэффективн:
Введите optimize и нажмите клавишу ВВОД.
optimize
Copilot предлагает измененный код. Например:
find . -type f -name "*.txt" -exec wc -l {} +
Это более эффективно, чем исходный код, показанный ранее в этой статье, так как использование -exec ... + позволяет find передавать несколько файлов wc одновременно, а не вызывать wc один раз для каждого *.txt найденного файла.
-exec ... +
find
wc
*.txt
Оцените предложение Copilot, и если вы согласны с изменением:
Как и во всех предложениях Copilot, всегда следует проверить, работает ли измененный код без ошибок и выдает правильный результат.
Избегая повторения, код упрощает изменение и отладку. Например, если одно и то же вычисление выполняется несколько раз в разных местах в файле, можно переместить вычисление в функцию.
В следующем очень простом примере JavaScript одно и то же вычисление (цена элемента умножается на количество проданных элементов) выполняется в двух местах.
let totalSales = 0; let applePrice = 3; let applesSold = 100; totalSales += applePrice * applesSold; let orangePrice = 5; let orangesSold = 50; totalSales += orangePrice * orangesSold; console.log(`Total: ${totalSales}`);
Можно попросить Copilot переместить повторяющиеся вычисления в функцию.
Выберите все содержимое файла.
Введите: move repeated calculations into functions и нажмите клавишу ВВОД.
move repeated calculations into functions
function calculateSales(price, quantity) { return price * quantity; } let totalSales = 0; let applePrice = 3; let applesSold = 100; totalSales += calculateSales(applePrice, applesSold); let orangePrice = 5; let orangesSold = 50; totalSales += calculateSales(orangePrice, orangesSold); console.log(`Total: ${totalSales}`);
Если код ненужно подробный, это может быть трудно читать и поддерживать. Copilot может предложить более краткую версию выбранного кода.
В следующем примере этот код Python выводит область прямоугольника и круга, но может быть написан более кратко:
def calculate_area_of_rectangle(length, width): area = length * width return area def calculate_area_of_circle(radius): import math area = math.pi * (radius ** 2) return area length_of_rectangle = 10 width_of_rectangle = 5 area_of_rectangle = calculate_area_of_rectangle(length_of_rectangle, width_of_rectangle) print(f"Area of rectangle: {area_of_rectangle}") radius_of_circle = 7 area_of_circle = calculate_area_of_circle(radius_of_circle) print(f"Area of circle: {area_of_circle}")
Введите: make this more concise и нажмите клавишу ВВОД.
make this more concise
import math def calculate_area_of_rectangle(length, width): return length * width def calculate_area_of_circle(radius): return math.pi * (radius ** 2) print(f"Area of rectangle: {calculate_area_of_rectangle(10, 5)}") print(f"Area of circle: {calculate_area_of_circle(7)}")
Крупные методы или функции, выполняющие несколько операций, могут предложить меньше возможностей для повторного использования, чем меньшие, более простые функции, ориентированные на выполнение определенной операции. Они также могут быть более сложными для понимания и отладки.
Copilot помогает разделить сложные блоки кода на небольшие единицы, которые более подходят для повторного использования.
Следующий код Python является очень простым примером, но он показывает принцип разделения одной функции на две функции, выполняющие определенные операции.
import pandas as pd from pandas.io.formats.style import Styler def process_data(item, price): # Cleanse data item = item.strip() # Strip whitespace from item price = price.strip() # Strip whitespace from price price = float(price) # Convert price to a float # More cleansing operations here # Create and print a DataFrame data = {'Item': [item], 'Price': [price]} df = pd.DataFrame(data) print(df.to_string(index=False)) # Example usage item = " Apple " price = " 1.25" process_data(item, price)
Чтобы разделить функцию process_data , выполните следующие действия.
process_data
Поместите курсор в имя функции.
Введите: split into 2 separate functions: one for cleansing data, the other for printing и нажмите клавишу ВВОД.
split into 2 separate functions: one for cleansing data, the other for printing
def cleanse_data(item, price): # Cleanse data item = item.strip() # Strip whitespace from item price = price.strip() # Strip whitespace from price price = float(price) # Convert price to a float return item, price def print_data(item, price): # Create and print a DataFrame data = {'Item': [item], 'Price': [price]} df = pd.DataFrame(data) print(df.to_string(index=False)) def process_data(item, price): item, price = cleanse_data(item, price) print_data(item, price)
Пример предложения, показанный выше, заменяет существующую функцию тремя функциями. Третья функция просто вызывает другие две функции и позволяет использовать существующий код, вызывающий функцию process_data .
Часто существует несколько способов написания кода, выполняющегося или не выполняющегося, в зависимости от различных условий. Некоторые условные структуры лучше подходят, чем другие для конкретных вариантов использования, и выбор альтернативной условной структуры иногда может упростить чтение кода.
Этот метод Java использует ряд инструкций if и else if инструкций, чтобы определить, какая операция выполняется:
if
else if
public String getSound(String animal) { if (animal == null) { System.out.println("Oops! A null animal?"); } else if (animal.equalsIgnoreCase("Dog")) { return "Bark"; } else if ( animal.equalsIgnoreCase("Cat")) { return "Meow"; } else if ( animal.equalsIgnoreCase("Bird")) { return "Tweet"; } return "Unknown"; }
Оператор switch может быть лучшим способом применения той же логики.
switch
Поместите курсор в имя метода.
Введите rewrite the condition to use a switch and use Java 21 syntax with null case, but also add documentation and provide a better function name.
rewrite the condition to use a switch and use Java 21 syntax with null case, but also add documentation and provide a better function name
В этом разделе показано, как использовать один запрос на запрос Copilot для внесения нескольких изменений.
Нажмите ВВОД.
/** * Retrieves the sound made by a given animal. * * @param animal The name of the animal. * @return The sound made by the animal, or "Unknown" if the animal is not recognized. */ public String getAnimalSound(String animal) { return switch (animal) { case null -> { System.out.println("Oops! A null animal?"); yield "Unknown"; } case String a when a.equalsIgnoreCase("Dog") -> "Bark"; case String a when a.equalsIgnoreCase("Cat") -> "Meow"; case String a when a.equalsIgnoreCase("Bird") -> "Tweet"; default -> "Unknown"; }; }
Предположим, что у вас есть эта функция в JavaScript:
function listRepos(o, p) { return fetch(`https://api.github.com/orgs/${o}/repos?per_page=${parseInt(p)}`) .then((response) => response.json()) .then( (data) => data); }
Если в стандартах программирования требуется использовать нотацию со стрелками для функций и описательные имена параметров, можно использовать Copilot для внесения этих изменений.
Введите: use arrow notation and better parameter names и нажмите клавишу ВВОД.
use arrow notation and better parameter names
const listRepos = (org, perPage) => { return fetch(`https://api.github.com/orgs/${org}/repos?per_page=${parseInt(perPage)}`) .then(response => response.json()) .then(data => data); };
Хорошо выбранные имена помогают упростить обслуживание кода. Copilot в VS Code и Visual Studio могут предложить альтернативные имена символов, таких как переменные или функции.
Поместите курсор в имя символа.
Нажмите клавишу F2.
Только Visual Studio: нажмите клавиши CTRL+ПРОБЕЛ.
Copilot предлагает альтернативные имена.
В раскрывающемся списке выберите одно из предлагаемых имен.
Имя изменяется во всем проекте.