Skip to main content

Рефакторинг кода с помощью GitHub Copilot

Используйте искусственный интеллект Copilot для эффективного рефакторинга кода.

Введение

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

В этой статье приведены некоторые идеи по использованию Copilot для рефакторинга кода в интегрированной среде разработки.

Note

Примеры ответов включены в эту статью. GitHub Copilot Chat может дать вам различные ответы, приведенные здесь.

Общие сведения о коде

Перед изменением существующего кода необходимо убедиться, что вы понимаете его назначение и как он работает в настоящее время. Copilot может помочь вам в этом.

  1. Выберите соответствующий код в редакторе интегрированной среды разработки.

  2. Откройте встроенный чат:

    • В VS Code: нажмите клавиши Command+i (Mac) или CTRL+i (Windows/Linux).
    • В Visual Studio: нажмите клавиши ALT+/.
    • В идентификаторах JetBrains: нажмите клавиши SHIFT++i (Mac) или CTRL+SHIFT+g (Windows/Linux).
  3. В поле ввода для встроенного чата введите косую черту (/).

  4. В раскрывающемся списке выберите /объясните и нажмите клавишу ВВОД.

  5. Если объяснение, что возврат 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 Chat

Copilot может определить, можно ли оптимизировать код, например пример скрипта Bash.

  1. for Выберите цикл или весь содержимое файла.

  2. Откройте Copilot Chat, щелкнув значок чата на панели действий или с помощью сочетания клавиш:

    • VS Code и Visual Studio: control+Command+i (Mac) / CTRL+ALT+i (Windows/Linux)
    • JetBrains: Control+Shift+c
  3. В поле ввода в нижней части панели чата введите: Can this script be improved?

    Copilot отвечает предложением, которое сделает код более эффективным.

  4. Чтобы применить предлагаемое изменение, выполните указанные ниже действия.

    • В VS Code и JetBrains: наведите указатель мыши на предложение на панели чата и щелкните значок "Вставить курсор".

      Снимок экрана: значок "Вставка курсора" на панели Copilot Chat.

    • В Visual Studio: нажмите кнопку "Предварительный просмотр ", а затем в представлении сравнения нажмите кнопку "Принять".

Использование встроенного чата Copilot

Кроме того, если вы уже знаете, что существующий код, например пример скрипта bash, неэффективн:

  1. for Выберите цикл или весь содержимое файла.

  2. Откройте встроенный чат:

    • В VS Code: нажмите клавиши Command+i (Mac) или CTRL+i (Windows/Linux).
    • В Visual Studio: нажмите клавиши ALT+/.
    • В идентификаторах JetBrains: нажмите клавиши SHIFT++i (Mac) или CTRL+SHIFT+g (Windows/Linux).
  3. Введите optimize и нажмите клавишу ВВОД.

    Copilot предлагает измененный код. Например:

    find . -type f -name "*.txt" -exec wc -l {} +
    

    Это более эффективно, чем исходный код, показанный ранее в этой статье, так как использование -exec ... + позволяет find передавать несколько файлов wc одновременно, а не вызывать wc один раз для каждого *.txt найденного файла.

  4. Оцените предложение Copilot, и если вы согласны с изменением:

    • В VS Code и Visual Studio: нажмите кнопку "Принять".
    • В JetBrains: щелкните значок предварительного просмотра (двойные стрелки), а затем щелкните значок "Применить все диффы" (двойные угловые скобки).

Как и во всех предложениях 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 переместить повторяющиеся вычисления в функцию.

  1. Выберите все содержимое файла.

  2. Откройте встроенный чат:

    • В VS Code: нажмите клавиши Command+i (Mac) или CTRL+i (Windows/Linux).
    • В Visual Studio: нажмите клавиши ALT+/.
    • В идентификаторах JetBrains: нажмите клавиши SHIFT++i (Mac) или CTRL+SHIFT+g (Windows/Linux).
  3. Введите: move repeated calculations into functions и нажмите клавишу ВВОД.

    Copilot предлагает измененный код. Например:

    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}`);
    
  4. Оцените предложение Copilot, и если вы согласны с изменением:

    • В VS Code и Visual Studio: нажмите кнопку "Принять".
    • В JetBrains: щелкните значок предварительного просмотра (двойные стрелки), а затем щелкните значок "Применить все диффы" (двойные угловые скобки).

Как и во всех предложениях Copilot, всегда следует проверить, работает ли измененный код без ошибок и выдает правильный результат.

Создание более краткого кода

Если код ненужно подробный, это может быть трудно читать и поддерживать. 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}")
  1. Выберите все содержимое файла.

  2. Откройте встроенный чат:

    • В VS Code: нажмите клавиши Command+i (Mac) или CTRL+i (Windows/Linux).
    • В Visual Studio: нажмите клавиши ALT+/.
    • В идентификаторах JetBrains: нажмите клавиши SHIFT++i (Mac) или CTRL+SHIFT+g (Windows/Linux).
  3. Введите: make this more concise и нажмите клавишу ВВОД.

    Copilot предлагает измененный код. Например:

    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)}")
    
  4. Оцените предложение Copilot, и если вы согласны с изменением:

    • В VS Code и Visual Studio: нажмите кнопку "Принять".
    • В JetBrains: щелкните значок предварительного просмотра (двойные стрелки), а затем щелкните значок "Применить все диффы" (двойные угловые скобки).

Как и во всех предложениях Copilot, всегда следует проверить, работает ли измененный код без ошибок и выдает правильный результат.

Разделение сложных единиц кода

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

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 , выполните следующие действия.

  1. Поместите курсор в имя функции.

  2. Откройте встроенный чат:

    • В VS Code: нажмите клавиши Command+i (Mac) или CTRL+i (Windows/Linux).
    • В Visual Studio: нажмите клавиши ALT+/.
    • В идентификаторах JetBrains: нажмите клавиши SHIFT++i (Mac) или CTRL+SHIFT+g (Windows/Linux).
  3. Введите: split into 2 separate functions: one for cleansing data, the other for printing и нажмите клавишу ВВОД.

    Copilot предлагает измененный код. Например:

    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)
    

    Note

    Пример предложения, показанный выше, заменяет существующую функцию тремя функциями. Третья функция просто вызывает другие две функции и позволяет использовать существующий код, вызывающий функцию process_data .

  4. Оцените предложение Copilot, и если вы согласны с изменением:

    • В VS Code и Visual Studio: нажмите кнопку "Принять".
    • В JetBrains: щелкните значок предварительного просмотра (двойные стрелки), а затем щелкните значок "Применить все диффы" (двойные угловые скобки).

Как и во всех предложениях Copilot, всегда следует проверить, работает ли измененный код без ошибок и выдает правильный результат.

Перезапись условного кода для повышения удобочитаемости

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

Этот метод Java использует ряд инструкций 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 может быть лучшим способом применения той же логики.

  1. Поместите курсор в имя метода.

  2. Откройте встроенный чат:

    • В VS Code: нажмите клавиши Command+i (Mac) или CTRL+i (Windows/Linux).
    • В Visual Studio: нажмите клавиши ALT+/.
    • В идентификаторах JetBrains: нажмите клавиши SHIFT++i (Mac) или CTRL+SHIFT+g (Windows/Linux).
  3. Введите 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 для внесения нескольких изменений.

  4. Нажмите ВВОД.

    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";
        };
    }
    
  5. Оцените предложение Copilot, и если вы согласны с изменением:

    • В VS Code и Visual Studio: нажмите кнопку "Принять".
    • В JetBrains: щелкните значок предварительного просмотра (двойные стрелки), а затем щелкните значок "Применить все диффы" (двойные угловые скобки).

Как и во всех предложениях Copilot, всегда следует проверить, работает ли измененный код без ошибок и выдает правильный результат.

Код переформата для использования другой структуры

Предположим, что у вас есть эта функция в 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 для внесения этих изменений.

  1. Поместите курсор в имя функции.

  2. Откройте встроенный чат:

    • В VS Code: нажмите клавиши Command+i (Mac) или CTRL+i (Windows/Linux).
    • В Visual Studio: нажмите клавиши ALT+/.
    • В идентификаторах JetBrains: нажмите клавиши SHIFT++i (Mac) или CTRL+SHIFT+g (Windows/Linux).
  3. Введите: use arrow notation and better parameter names и нажмите клавишу ВВОД.

    Copilot предлагает измененный код. Например:

    const listRepos = (org, perPage) => {
      return fetch(`https://api.github.com/orgs/${org}/repos?per_page=${parseInt(perPage)}`)
        .then(response => response.json())
        .then(data => data);
    };
    

Улучшение имени символа

Note

  • VS Code и Visual Studio только.
  • Поддержка этой функции зависит от наличия соответствующего расширения языка в интегрированной среде разработки для используемого языка. Не все расширения языка поддерживают эту функцию.

Хорошо выбранные имена помогают упростить обслуживание кода. Copilot в VS Code и Visual Studio могут предложить альтернативные имена символов, таких как переменные или функции.

  1. Поместите курсор в имя символа.

  2. Нажмите клавишу F2.

  3. Только Visual Studio: нажмите клавиши CTRL+ПРОБЕЛ.

    Copilot предлагает альтернативные имена.

    Снимок экрана: раскрывающийся список в VS Code, предоставляющий альтернативные варианты для имени символа.

  4. В раскрывающемся списке выберите одно из предлагаемых имен.

    Имя изменяется во всем проекте.