GitHub Copilot コード補完候補を使用してコードを生成する

完了

GitHub Copilot は、多数のプログラミング言語やさまざまなフレームワークに対してコード補完候補を表示できますが、特に Python、JavaScript、TypeScript、Ruby、Go、C#、C++ に適しています。 コード行の入力候補は、記述しているコードのコンテキストに基づいて生成されます。 GitHub Copilot によって提供される候補を受け入れる、拒否する、または部分的に受け入れることが可能です。

GitHub Copilot には、コード行の入力候補を生成する 2 つの方法が用意されています。

  • コメントから: 生成するコードを記述するコメントを記述することで、コード行補完を生成できます。 GitHub Copilot は、記述されたコメントに基づいてコード補完候補を表示します。

  • コードから: コード行の補完を生成することができます。コード行を開始するか、完了したコード行の後に Enter キーを押します。 GitHub Copilot は、記述されたコードに基づいてコード補完候補を表示します。

GitHub Copilot を使用してコメントからコード行の入力補完を生成する

GitHub Copilot は、コメントとアプリの既存のコンテキストに基づいてコード補完候補を生成します。

コメントを使用して、コード スニペット、メソッド、データ構造、およびその他のコード要素を記述できます。

次のコード スニペットがあるとします。


namespace ReportGenerator;

class QuarterlyIncomeReport
{
    static void Main(string[] args)
    {
        // create a new instance of the class
        QuarterlyIncomeReport report = new QuarterlyIncomeReport();

        // call the GenerateSalesData method

        // call the QuarterlySalesReport method
        
    }

    public void QuarterlySalesReport()
    {

        Console.WriteLine("Quarterly Sales Report");
    }
}    

たとえば、次のコメントを使用してデータ構造を作成できます。


// public struct SalesData. Include the following fields: date sold, department name, product ID, quantity sold, unit price

GitHub Copilot は、コード コメントとエディターで開いているコード ファイルに基づいて、1 つ以上のコード補完候補を生成します。

データ構造を説明するコメントのコード補完を示すスクリーンショット。

データ構造のフィールドを宣言するために使用されるデータ型に注目してください。 GitHub Copilot は、既存のコードとコード コメントに基づいてデータ型と変数名を選択します。 GitHub Copilot は、アプリケーションが変数をどのように使用するかを判断し、それに応じてデータ型を定義しようとします。

GitHub Copilot で複数の提案が生成された場合は、[>] ボタンの左側にある左矢印または右矢印 (<または) を選択して、提案を順番に表示できます。 これにより、ニーズに最も適した提案を確認して選択できます。

目的のコードと完全に一致しないコードの入力候補の提案を受け入れても問題ありません。 ただし、提案を "修正" するために必要な変更を明確にする必要があります。 この場合、データ型の一部が目的の型ではありませんが、オートコンプリートの提案を受け入れた後にそれらを調整することができます。

提案されたオプションが必要なオプションと似ていない場合、次の 2 つの方法を試すことができます。 その他の候補の一覧を含む新しいエディター タブを開くには、 Ctrl キー + Enter キーを押します。 このホットキーの組み合わせにより、最大 10 個の他の提案を含む新しいタブが開きます。 各提案の後に、その提案を受け入れるために使用できるボタンが表示されます。 提案を受け入れると、タブは自動的に閉じます。 もう 1 つのオプションは、 Esc キーを押して提案を閉じ、もう一度やり直す方法です。 コードのコメントを調整して、GitHub Copilot が機能するためのより多くのコンテキストを提供できます。

GitHub Copilot では、段階的に候補が提案されることがあります。 このような場合、Tab キーを押した後に Enter キーを押すと、次の段階の提案を表示できます。

推奨されるデータ構造を受け入れるには、Tab キーを押すか、[ 承諾] を選択します。

フィールドのデータ型を変更するには、次のようにコードを更新します。

public struct SalesData
{
    public DateOnly dateSold;
    public string departmentName;
    public int productID;
    public int quantitySold;
    public double unitPrice;
}

コードの入力候補の提案をすばやく調整すると、必要なコードを確実にビルドできます。 コードベースの大部分をまだ開発する必要がある場合、開発プロセスの早い段階で修正を行うことが特に重要です。 以降のコード補完は、既に記述したコードに基づいているため、コードができるだけ正確であることを確認することが重要です。

GitHub Copilot を使用してコメントからコード行の入力補完を生成する

GitHub Copilot は、コメントとアプリの既存のコンテキストに基づいてコード補完候補を生成します。 コメントを使用して、コード スニペット、メソッド、データ構造、およびその他のコード要素を記述できます。

以下の手順に従って、演習のこのセクションを完了します。

  1. Program.cs ファイルで、Main メソッドの下に 2 つの空のコード行を作成します。

  2. テスト データの生成に使用できるデータ構造を作成するには、次のコード コメントを作成し、Enter キーを押します。

    // public struct SalesData. Include the following fields: date sold, department name, product ID, quantity sold, unit price
    

    GitHub Copilot は、コード コメントとアプリ内で見つかった既存のコードに基づいて、1 つ以上のコード補完候補を生成します。

  3. 少し時間を取って、GitHub Copilot によって提供されるコード補完候補を確認してください。

    GitHub Copilot がデータ構造ではなくメソッドの提案を生成する場合は、 public str と入力し、コード補完候補が更新されるまで待ちます。 GitHub Copilot は、追加の情報を使用して自身の提案を改善します。

    データ構造を説明するコメントのコード補完を示すスクリーンショット。

    データ構造のフィールドを宣言するために使用されるデータ型に注目してください。 GitHub Copilot は、既存のコードとコード コメントに基づいてデータ型と変数名を選択します。 GitHub Copilot は、アプリケーションが変数をどのように使用するかを判断し、それに応じてデータ型を定義しようとします。

    GitHub Copilot で複数の提案が生成された場合は、[>] ボタンの左側にある左矢印または右矢印 (<または) を選択して、提案を順番に表示できます。 これにより、ニーズに最も適した提案を確認して選択できます。

    目的のコードと完全に一致しないコードの入力候補の提案を受け入れても問題ありません。 ただし、提案を "修正" するために必要な変更を明確にする必要があります。 この場合、データ型の一部が目的の型ではありませんが、オートコンプリートの提案を受け入れた後にそれらを調整することができます。

    提案されたオプションが必要なオプションと似ていない場合、次の 2 つの方法を試すことができます。 その他の候補の一覧を含む新しいエディター タブを開くには、 Ctrl キー + Enter キーを押します。 このホットキーの組み合わせにより、最大 10 個の他の提案を含む新しいタブが開きます。 各提案の後に、その提案を受け入れるために使用できるボタンが表示されます。 提案を受け入れると、タブは自動的に閉じます。 もう 1 つのオプションは、 Esc キーを押して提案を閉じ、もう一度やり直す方法です。 コードのコメントを調整して、GitHub Copilot が機能するためのより多くのコンテキストを提供できます。

    GitHub Copilot では、段階的に候補が提案されることがあります。 このような場合、Tab キーを押した後に Enter キーを押すと、次の段階の提案を表示できます。

  4. 推奨されるデータ構造を受け入れるには、Tab キーを押すか、[ 承諾] を選択します。

  5. フィールドのデータ型を変更するには、次のようにコードを更新します。

    public struct SalesData
    {
        public DateOnly dateSold;
        public string departmentName;
        public int productID;
        public int quantitySold;
        public double unitPrice;
    }
    

    コードの入力候補の提案をすばやく調整すると、必要なコードを確実にビルドできます。 コードベースの大部分をまだ開発する必要がある場合、開発プロセスの早い段階で修正を行うことが特に重要です。 コード補完は既存のコードに基づいているため、コードができるだけ正確であることを確認することが重要です。

  6. SalesData データ構造の下に 2 つの空のコード行を作成します。

  7. SalesData データ構造を使用してテスト データを生成するメソッドを作成するには、次のコード コメントを記述し、Enter キーを押します。

    /* the GenerateSalesData method returns 1000 SalesData records. It assigns random values to each field of the data structure */
    
  8. 少し時間を取って、GitHub Copilot によって提供されるコード補完候補を確認してください。

    GenerateSalesData メソッドは、SalesData オブジェクトの配列を返すように設計されていることに注意してください。 このメソッドは、SalesData データ構造の各フィールドにランダムな値が割り当てられた 1,000 レコードのテスト データを生成します。

    メソッドを記述するコメントのコード補完を示すスクリーンショット。

    GitHub Copilot および GitHub Copilot Chat によって提案された候補は、正しいように見える場合でも、常に確認する必要があります。

    GitHub Copilot が、完成した GenerateSalesData メソッドではなく 1 つのコード行を提案する場合は、 Ctrl + Enter キーを押して GitHub Copilot Suggestions タブを開きます。新しいタブで提案を確認します。次の手順では、[Accept suggestion #] ボタンを使用して提案を受け入れます。 GitHub Copilot は、提案を段階的に提示する場合があります。 コードの入力候補を段階的に受け入れることはできますが、[GitHub Copilot の提案] タブを使用して、完全な提案を確認してから、受け入れるか、無視するかを決定することをお勧めします。

  9. コード補完に関する提案をスクロールし、要件に最も合うものを選択します。

  10. コードの入力候補を受け入れるには、Tab キーを押します。

    コードの入力候補の提案には、DateSold フィールドを生成するために使用されるコードに構文エラーが含まれていることに注意してください。 DateOnly は、正しい順序で一覧表示する必要がある 3 つの整数値を受け入れます:

  11. DateSold フィールドの生成に使用するコードに 1 年を指定するには、次のようにコード行を更新します。

    salesData[i].DateSold = new DateOnly(2023, random.Next(1, 13), random.Next(1, 29));
    
  12. 必要に応じて、次のコード スニペットに一致するように他のコード行を調整します。

    public SalesData[] GenerateSalesData()
    {
        SalesData[] salesData = new SalesData[1000];
        Random random = new Random();
    
        for (int i = 0; i < salesData.Length; i++)
        {
            salesData[i].dateSold = new DateOnly(2023, random.Next(1, 13), random.Next(1, 29));
            salesData[i].departmentName = "Department " + random.Next(1, 11);
            salesData[i].productID = random.Next(1, 101);
            salesData[i].quantitySold = random.Next(1, 101);
            salesData[i].unitPrice = random.NextDouble() * 100;
        }
    
        return salesData;
    }
    

コード コメントからコードを生成する機能は、GitHub Copilot の強力な機能です。 2 つのコメントだけで、データ構造とテスト データを生成するメソッドを生成できました。

GitHub Copilot を使用してコード行の入力候補を生成する

GitHub Copilot では、入力したコードに基づいてコード行の入力候補を生成できます。 コード行の入力候補は、次の 2 つの方法で生成できます。

  • コード行の入力を開始し、GitHub Copilot によって未完成のコード行のオートコンプリートが提案されるまで待ちます。
  • 完全なコード行を入力し、 Enter キーを押し、GitHub Copilot が次のコード行のオートコンプリートを提案するまで待ちます。

GitHub Copilot は、入力したコードと、アプリ内のコードによって定義されたコンテキストに基づいて、提案するコード補完を生成します。 アプリで使用できるコードが多いほど、GitHub Copilot が応答を生成するときのコンテキストが多くなります。 GitHub Copilot は既存のコードに基づいて応答を作成できるため、コードの品質が重要です。 既存のコードの量が増え、品質が良くなるにつれて、GitHub Copilot が提案するコード行の入力候補の品質と信頼性も向上します。 GitHub Copilot は、特に一連の関連コンポーネントを生成する必要がある場合に、一般的なプログラミング タスクとパターンのコード行補完を生成するのに適しています。

演習のこの部分では、QuarterlySalesReport メソッドを操作します。

完了する必要があるタスクを次に示します。

  • SalesData オブジェクトのコレクションを受け入れるパラメーターを使用してメソッド コンストラクターを更新します。
  • GitHub Copilot を使用して、四半期レポートの売上データを処理するコード行の入力候補を生成します。
  • アプリを実行し、四半期売上レポートを確認します。

以下の手順に従って、演習のこのセクションを完了します。

  1. QuarterlySalesReport のメソッド コンストラクターを次のように更新します。

    public void QuarterlySalesReport(SalesData[] salesData)
    
  2. 少し時間を取って、開発が必要なコードについて考えてみてください。

    コンセプトは単純です。 コードで売上データに基づいて四半期ごとの売上を計算し、レポートを作成する必要があります。 そのためには、コードで次のことを行う必要があります。

    • salesData コレクションを反復処理します。
    • 販売数量と単価に基づいて各販売額を計算します。
    • 販売日を使用して、売上がどの四半期に属するかを判断します。
    • 各四半期の売上を合計します。
    • 四半期ごとの売上レポートを作成します。

    1 つのオプションは、foreach ループのコードの入力を開始してから、GitHub Copilot が提案する内容を確認することです。

  3. QuarterlySalesReport メソッドで、コード ブロックの先頭に新しいコード行を作成します。

    新しいコード行と、Console.WriteLine() を含むコード行との間に、少なくとも 1 つの空のコード行が必要です。

  4. コード行の入力候補を生成するには、「foreach (」と入力し、GitHub Copilot によってコード行の入力候補オプションが提案されるまで待ちます。

  5. GitHub Copilot によって提案されたコード補完を確認します。

    foreach ループのコード補完を示すスクリーンショット。

    提案されたコードの入力候補は、目的のコードではありません。

    GitHub Copilot は、foreach を反復処理する salesData ループを提案していますが、ループ内に分析や計算はありません。 推奨されるコードには、不要なステートメントや不要な Console.WriteLine ステートメントが含まれています。

  6. 少し時間を取って、GitHub Copilot が Console.WriteLine ステートメントを提案する理由を考えてみてください。

    GitHub Copilot は、コードのコンテキストに基づいてコード補完候補を生成することを思い出してください。 この場合、GitHub Copilot が考慮すべきコードはそれほどありません。 状況はさらに悪化します。

    GitHub Copilot がメソッド内に示すコードは、Console.WriteLine ステートメントです。 メソッド内で他のコンテキストを使用できなくなり、コードベース内に描画する類似のメソッドがないため、GitHub Copilot は、 ループ内でConsole.WriteLineステートメントがforeachであると結論付けます。

    GitHub Copilot は、コードがクリーンで焦点が絞られている場合に最適に機能します。 コード内に余分なコード コメントやステートメントが含まれている場合は、GitHub Copilot のコード補完を使用する前にそれらを削除することをお勧めします。

  7. GitHub Copilot をもう一度試す前にコードをクリーンアップするには、次の手順を実行します。

    • 提案された foreach ( コード補完を取り消します。
    • 入力した部分的な foreach ( ステートメントを削除します。
    • Console.WriteLine メソッドから QuarterlySalesReport ステートメントを削除します。

    これで、GitHub Copilot をもう一度試す準備が整いました。

  8. QuarterlySalesReport メソッドが次のようなコードになっていることを確認してください。

    public void QuarterlySalesReport(SalesData[] salesData)
    {
    
    
    }
    
  9. QuarterlySalesReport メソッド内の空白のコード行にカーソルを置き、Enter キーを押します。

    提案するコード補完を GitHub Copilot が 生成するまでに少し時間がかかる場合があります。

  10. 少し時間を取って、提案されたコード補完を確認してください。

    Von Bedeutung

    提案されたコード補完は、次のスクリーンショットに示されている候補とは異なる可能性があります。 GitHub Copilot で表示されるのは使用するメソッド名とパラメーターだけですが、有用な候補を生成するにはおそらくそれだけで十分です。 四半期ごとの売上を計算するための候補が表示されます。 候補を拒否してもう一度試してみると、異なる結果が得られる可能性があります。

    レポートのデータを処理するコード補完候補を示すスクリーンショット。

    > または < を選択することで、候補を順番に表示できます。

    提案されたコード補完が売上データを反復処理し、四半期ごとの売上計算を実行することに注目してください。

  11. 提案されたコード補完を受け入れるには、Tab キーを押します。

    提案されたコード補完は、売上データに基づいて四半期の収入を計算して表示します。

    // create a dictionary to store the quarterly sales data
    Dictionary<string, double> quarterlySales = new Dictionary<string, double>();
    
    // iterate through the sales data
    foreach (SalesData data in salesData)
    {
        // calculate the total sales for each quarter
        string quarter = GetQuarter(data.dateSold.Month);
        double totalSales = data.quantitySold * data.unitPrice;
    
        if (quarterlySales.ContainsKey(quarter))
        {
            quarterlySales[quarter] += totalSales;
        }
        else
        {
            quarterlySales.Add(quarter, totalSales);
        }
    }
    
    // display the quarterly sales report
    Console.WriteLine("Quarterly Sales Report");
    Console.WriteLine("----------------------");
    foreach (KeyValuePair<string, double> quarter in quarterlySales)
    {
        Console.WriteLine(entry.Key + ": $" + entry.Value);
    }
    
    
  12. GetQuarter方法では、販売の月を使用して販売の四半期が決定されます。

    次に、 GetQuarter メソッドが作成されます。

  13. QuarterlySalesReport メソッドの下に 2 つの空のコード行を作成します。

  14. GitHub Copilot が GetQuarter メソッドのコード補完を提案していることに注目してください。

    GitHub Copilot は、QuarterlySalesReport メソッドによって提供されるコンテキストを使用して、販売月に基づいて四半期を判断する GetQuarter メソッドのコード補完を簡単に生成できます。

  15. 少し時間を取って、提案された GetQuarter メソッドのコード行の入力候補を確認してください。

    GetQuarter メソッドのコード補完を示すスクリーンショット。

  16. 提案されたコード補完を受け入れるには、Tab キーを押します。

    public string GetQuarter(int month)
    {
        if (month >= 1 && month <= 3)
        {
            return "Q1";
        }
        else if (month >= 4 && month <= 6)
        {
            return "Q2";
        }
        else if (month >= 7 && month <= 9)
        {
            return "Q3";
        }
        else
        {
            return "Q4";
        }
    }
    
  17. コードを実行する前に Main メソッドを完成させる必要があることに注目してください。

    Main メソッドのコメントを使用してコードを更新できます。

  18. // call the GenerateSalesData method コード コメントの末尾にカーソルを置き、Enter キーを押します。

    GitHub Copilot は、このコメントを使用してメソッドの呼び出し元ステートメントを提案します。

  19. GitHub Copilot によって提案されたコード補完を確認し、受け入れます。

  20. // call the QuarterlySalesReport method コード コメントに対して、このプロセスを繰り返します。

  21. Main メソッドには、次のコードが含まれています。

    static void Main(string[] args)
    {
        // create a new instance of the class
        QuarterlyIncomeReport report = new QuarterlyIncomeReport();
    
        // call the GenerateSalesData method
        SalesData[] salesData = report.GenerateSalesData();
    
        // call the QuarterlySalesReport method
        report.QuarterlySalesReport(salesData);
    }
    
    
  22. 少し時間を取って、QuarterlyIncomeReport クラスのコードを確認してください。

    namespace ReportGenerator
    {
        class QuarterlyIncomeReport
        {
            static void Main(string[] args)
            {
                // create a new instance of the class
                QuarterlyIncomeReport report = new QuarterlyIncomeReport();
    
                // call the GenerateSalesData method
                SalesData[] salesData = report.GenerateSalesData();
    
                // call the QuarterlySalesReport method
                report.QuarterlySalesReport(salesData);
            }
    
            /* public struct SalesData includes the following fields: date sold, department name, product ID, quantity sold, unit price */
            public struct SalesData
            {
                public DateOnly dateSold;
                public string departmentName;
                public int productID;
                public int quantitySold;
                public double unitPrice;
            }
    
            /* the GenerateSalesData method returns 1000 SalesData records. It assigns random values to each field of the data structure */
            public SalesData[] GenerateSalesData()
            {
                SalesData[] salesData = new SalesData[1000];
                Random random = new Random();
    
                for (int i = 0; i < 1000; i++)
                {
                    salesData[i].dateSold = new DateOnly(2023, random.Next(1, 13), random.Next(1, 29));
                    salesData[i].departmentName = "Department " + random.Next(1, 11);
                    salesData[i].productID = random.Next(1, 101);
                    salesData[i].quantitySold = random.Next(1, 101);
                    salesData[i].unitPrice = random.NextDouble() * 100;
                }
    
                return salesData;
            }
    
            public void QuarterlySalesReport(SalesData[] salesData)
            {
                // create a dictionary to store the quarterly sales data
                Dictionary<string, double> quarterlySales = new Dictionary<string, double>();
    
                // iterate through the sales data
                foreach (SalesData data in salesData)
                {
                    // calculate the total sales for each quarter
                    string quarter = GetQuarter(data.dateSold.Month);
                    double totalSales = data.quantitySold * data.unitPrice;
    
                    if (quarterlySales.ContainsKey(quarter))
                    {
                        quarterlySales[quarter] += totalSales;
                    }
                    else
                    {
                        quarterlySales.Add(quarter, totalSales);
                    }
                }
    
                // display the quarterly sales report
                Console.WriteLine("Quarterly Sales Report");
                Console.WriteLine("----------------------");
                foreach (KeyValuePair<string, double> quarter in quarterlySales)
                {
                    Console.WriteLine(entry.Key + ": $" + entry.Value);
                }
            }
    
            public string GetQuarter(int month)
            {
                if (month >= 1 && month <= 3)
                {
                    return "Q1";
                }
                else if (month >= 4 && month <= 6)
                {
                    return "Q2";
                }
                else if (month >= 7 && month <= 9)
                {
                    return "Q3";
                }
                else
                {
                    return "Q4";
                }
            }
        }
    }
    
    

    このコードは、ほぼ完全に、GitHub Copilot によって生成されたコード行の入力候補を使用して作成されました。 ただし、コードに関する提案の確認は重要であり、修正が必要でした。 GitHub Copilot で提案されるコード補完を常に確認し、コードが要件を満たしていることを確認する必要があります。

  23. レポートの出力を確認するために、アプリを実行します。

    Visual Studio Code のターミナル ウィンドウを開き、次のコマンドを入力します。

    dotnet run
    

    出力には四半期収入レポートが表示され、部門名、四半期、およびテスト データで表された各部門および各四半期の収入が示されます。

  24. ターミナル ウィンドウで出力を確認します。

    四半期ごとの結果はランダムな数値に基づいていますが、次のような出力形式のレポートが表示されます。

    
    Quarterly Sales Report
    ----------------------
    Q3: $635637.5019563352
    Q4: $672247.315297204
    Q2: $667269.194630603
    Q1: $642769.2700531208
    
    

概要

コード行補完は、コードを迅速かつ効率的に生成するのに役立つ GitHub Copilot の強力な機能です。 コメントを使用して生成するコードを記述することで、最小限の労力でデータ構造、メソッド、およびその他のコード要素を作成できます。 さらに、GitHub Copilot では、入力したコードに基づいてコード行の入力候補を生成できるため、複雑なアプリケーションを簡単にビルドできます。