コード リファクタリング シナリオと GitHub Copilot のベスト プラクティスを確認する

完了

コードのリファクタリングとは、既存のコードの動作を変更することなく再構築するプロセスです。 リファクタリングの利点には、コードの読みやすさを向上させ、複雑さを軽減し、コードを保守しやすくし、新機能を簡単に追加できるようにすることなどが含まれます。 GitHub Copilot のベスト プラクティスを実装すると、より効率的に作業し、より良い結果を得るのに役立ちます。

GitHub Copilot のベスト プラクティス

GitHub Copilot は、コードのリファクタリングと改善に役立つ強力なツールです。 ただし、最良の結果を得るには、Copilot を使用する際にいくつかのベスト プラクティスに従う必要があります。

より良いプロンプトを使用して応答を改善する

より効果的なプロンプトを記述することで、Copilot の応答の品質を向上させることができます。 適切に作成されたプロンプトは、Copilot が要件をよりよく理解し、より関連性の高いコード提案を生成するのに役立ちます。

次のガイドラインは、より適切なプロンプトを記述するのに役立ちます。

  • 一般的なことから始めて具体的な内容に進みます。

    Generate a Calculator class. Add methods for addition, subtraction, multiplication, division, and factorial. Don't use any external libraries and don't use recursion.
    
  • 必要なものの例を示します。

    Generate a function that takes a string and returns the number of vowels in it. For example: findVowels("hello") returns 2, findVowels("sky") returns 0.
    
  • 複雑なタスクを単純なタスクに分割します。

    「食事プランナー アプリを生成する」よう Copilot に依頼する代わりに、プロンプトをより小さなタスクに分割します。

    例えば次が挙げられます。

    Generate a function that takes a list of ingredients and returns a list of recipes.
    
    Generate a function that takes a list of recipes and returns a shopping list.
    
    Generate a function that takes a list of recipes and returns a meal plan for the week.
    
  • コードの選択、ファイル、ターミナル出力など、適切なコンテキストを指定します。

    たとえば、 #codebase 変数を使用して、コードベース全体を参照します。"#codebase で使用されているデータベース接続文字列はどこにありますか?"

  • プロンプトを反復処理します。

    応答を絞り込んだり変更したりするためのフォローアップ プロンプトを提供します。

    たとえば、次のプロンプトで始める場合は、次のようになります。

    "数値の階乗を計算する関数を記述します。"

    次の手順に従うことができます。

    "キャッシュを使用して再帰と最適化を使用しないでください。"

    この場合、次のようになります。

    "わかりやすい変数名を使用してください。"

  • チャット履歴を関連性の高い状態に保ちます。

    Copilot は会話の履歴を使用してコンテキストを提供します。 過去の質問と回答が関係ない場合は、履歴から削除します。 または、コンテキストを変更する場合は、新しいセッションを開始します。

適切なコンテキストとツールを提供する

チャットでより正確で関連性の高い応答を得るために、関連するコンテキストを使用してプロンプトを強化します。 適切なツールを使用すると、開発者の生産性を向上させることができます。

  • エージェント モードでツール ボタンを選択して、使用するツールを構成するか、プロンプトに明示的に追加します。

  • #codebaseを使用して、コード検索を実行して、Copilot が適切なファイルを自動的に検索できるようにします。

  • #fetch ツールを使用して Web ページからコンテンツをフェッチするか、#githubRepoを使用して GitHub リポジトリでコード検索を実行します。

  • #<file name>#<folder name>、または#<symbol>を使用して、プロンプト内のファイル、フォルダー、シンボルを参照します。

  • ファイル、フォルダー、エディターのタブをチャット プロンプトにドラッグ アンド ドロップします。

  • シナリオ固有のコンテキストについて、チャット プロンプトに問題、テスト エラー、またはターミナル出力を追加します。

エージェント モードを使用すると、Copilot は関連するファイルとコンテキストを自律的に検索します。

一般的なコード リファクタリング シナリオ

GitHub Copilot は、さまざまな方法でコードをすばやくリファクタリングするのに役立ちます。 次の一覧には、コードをリファクタリングするための一般的なシナリオが含まれています。

  • 非効率的なコードの最適化
  • 繰り返しコードのクリーンアップ
  • コードの簡潔化
  • 複雑なコード単位の分割
  • 読みやすくするための条件付きコードの書き換え
  • 別の構造を使用するようにコードを再フォーマットする

GitHub Copilot を使用して非効率的なコードを最適化する

Copilot は、コードを最適化するのに役立ちます。 たとえば、コードをより迅速に実行できるようにコードを最適化できます。

次の bash スクリプトについて考えてみましょう。

#!/bin/bash
# Find all .txt files and count the number of lines in each file
for file in $(find . -type f -name "*.txt"); do
  wc -l "$file"
done

チャット機能を使用して、パフォーマンスなど、スクリプトのさまざまな側面を最適化するためのオプションを評価できます。

#!/bin/bash
# Find all .txt files and count the number of lines in each file (improved performance)
find . -type f -name "*.txt" -print0 | xargs -0 wc -l

GitHub Copilot を使用して繰り返しコードをクリーンアップする

繰り返しを回避すると、コードの修正とデバッグが容易になります。 たとえば、同じ計算がファイル内の異なる場所で複数回実行される場合は、その計算を関数に移動できます。

次の非常にシンプルな JavaScript の例では、同じ計算 (商品価格 × 販売数) が 2 か所で実行されています。

let totalSales = 0;
let applePrice = 3;
let appleSold = 100;
totalSales += applePrice * appleSold;

let orangePrice = 2;
let orangeSold = 50;
totalSales += orangePrice * orangeSold;

console.log(`Total: ${totalSales}`);

繰り返し計算を関数に移動するようにチャット機能に依頼できます。

function calculateTotal(price, quantity) {
    return price * quantity;
}
let totalSales = 0;
let applePrice = 3;
let appleSold = 100;
totalSales += calculateTotal(applePrice, appleSold);

let orangePrice = 2;
let orangeSold = 50;
totalSales += calculateTotal(orangePrice, orangeSold);
console.log(`Total: ${totalSales}`);

GitHub Copilot を使用してコードをより簡潔にする

コードが不必要に冗長な場合、読み取りと保守が困難になる可能性があります。 Copilot は、選択したコードのより簡潔なバージョンを提案できます。

次の Python コードは四角形と円の領域を出力しますが、コードはより簡潔に記述できます。

def calculate_area_of_rectangle(length, width):
    area = length * width
    return area

def calculate_area_of_circle(radius):
    area = 3.14 * radius * radius
    return area

rectangle_length = 5
rectangle_width = 10
rectangle_area = calculate_area_of_rectangle(rectangle_length, rectangle_width)
print(f"Area of rectangle: {rectangle_area}")

circle_radius = 7
circle_area = calculate_area_of_circle(circle_radius)
print(f"Area of circle: {circle_area}")

GitHub Copilot は、コードをリファクタリングし、より簡潔にするのに役立ちます。

def calculate_area_of_rectangle(length, width):
    return length * width

def calculate_area_of_circle(radius):
    return 3.14 * radius * radius

rectangle_length = 5
rectangle_width = 10
print(f"Area of rectangle: {calculate_area_of_rectangle(rectangle_length, rectangle_width)}")

circle_radius = 7
print(f"Area of circle: {calculate_area_of_circle(circle_radius)}")

GitHub Copilot を使用して複雑なコード単位を分割する

複数の操作を実行する大規模なメソッドまたは関数は、特定の操作の実行に重点を置いた小規模で単純な関数よりも、再利用の機会が少なくなる可能性があります。 また、理解とデバッグが難しくなる場合もあります。

Copilot は、コードの複雑なブロックを、再利用に適した小さな単位に分割するのに役立ちます。

次の Python コードは非常に単純な例ですが、1 つの関数を特定の操作を実行する 2 つの関数に分割するという原則を示しています。

import pandas as pd
from pandas.io.formats.styler import Styler

def process_data(item, price):
    # Cleanse the data
    item = item.strip()    # Remove leading and trailing whitespace
    price = price.strip()  # Remove leading and trailing whitespace
    price = float(price)   # Convert price to a float
    # More cleansing operations can be added 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.50  "
process_data(item, price)

Copilot を使用してコードをリファクタリングし、データのクレンジング、データの印刷、およびデータの処理のための関数を作成できます。

import pandas as pd
from pandas.io.formats.styler import Styler

def cleanse_data(item, price):
    # Cleanse the data
    item = item.strip()    # Remove leading and trailing whitespace
    price = price.strip()  # Remove leading and trailing whitespace
    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)

# Example usage
item = "  Apple  "
price = "  1.50  "
item, price = cleanse_data(item, price)
print_data(item, price)

GitHub Copilot を使用して条件付きコードを書き直して読みやすくする

さまざまな条件によって、実行される場合とされない場合があるコードの書き方は、多くの場合、複数の方法が存在します。 特定のユースケースには、他のものより適している条件構造があり、別の条件構造を選択すると、コードがより読みやすくなる場合があります。

この Java メソッドは、一連の if および else if ステートメントを使って、実行する処理を決定します。

public string getSound(String animal) {
    if (animal == null) {
        System.out.println("Animal is null");
    } else if (animal.equalsIgnoreCase("Dog")) {
        return "bark";
    } else if (animal.equalsIgnoreCase("Cat")) {
        return "meow";
    } else if (animal.equalsIgnoreCase("Bird")) {
        return "tweet";
    }
    return "unknown";
}

switch ステートメントは、同じロジックを適用するより優れた方法である可能性があります。

/**
    * Returns the sound made by the specified 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 -> "Animal is null";
        case "Dog" -> "bark";
        case "Cat" -> "meow";
        case "Bird" -> "tweet";
        default -> "unknown";
    };
}

GitHub Copilot を使用してコードを再フォーマットし、別の構造を使用する

JavaScript に次の関数があるとします。

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

コーディング標準で関数の矢印表記とパラメーターのわかりやすい名前を使用する必要がある場合は、Copilot を使用してこれらの変更を行うことができます。

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

概要

GitHub Copilot は、さまざまな方法でコードをリファクタリングするのに役立ちます。 チャット ビューまたはインライン チャットを使用すると、Copilot に非効率的なコードの最適化、繰り返しコードのクリーンアップ、コードの簡潔化、複雑なコード単位の分割、読みやすくするための条件付きコードの書き換え、別の構造を使用するようにコードの再フォーマットを依頼できます。