ROBOT PAYMENT TECH-BLOG

株式会社ROBOT PAYMENTのテックブログです

GitHub Copilotを使ったコーディングを楽にするTips

GitHub Copilotを使用したコーディングTips集

こんにちは、決済サービスの開発を担当しているtaniguchikunです。
今回はGitHubCopilotで何ができるかを記載してコーディングを楽にする方法を記載したいと思います。

概要

GitHub Copilotで何ができるかを知っていれば生産性を上げる事ができるので、知って損ではない物だと感じています。 なので現時点での自分が試してきた内容を書きたいと思います。

目次

Tips

何もない所から大枠でサンプルコードを実装

AWS SDKを使用してKMSを操作するクラスを作成して下さいといったプロンプトを入力すると下記画像のように何もないファイルにコードを実装してくれます。

コメントヘッダーの作成

クラスとメソッドとプロパティのコメントヘッダーを作成して下さいといったプロンプトを入力すると下記画像のようにコメントヘッダーが追加実装されます。ここで注意が必要で必ずしも日本語でコメントヘッダーが作成されるといった事はありません。

翻訳作業

コメントヘッダーの内容を日本語に翻訳して下さいといったプロンプトを入力すると下記画像のように英語で追加されたコメント内容が日本語に更新されます。

クラスの解説

Generate Docsを選択するとチャット画面が表示され解析した内容を表示してくれます。
ここでも注意になりますが、必ずしも日本語で返ってくるといった事は保証されていません。
なので日本語に翻訳して再出力といったプロンプトを入力する事も有効だと思います。

スタブクラスの作成

インターフェースを作成してスタブを作成して下さいといったプロンプトを入力するとスタブクラスを作成してくれます。

無理な指示には別の解決策を提示

プロンプトに色々な入力がありますが、全部が有効とは考えられず出来ない事もあるので、その際には別手段を提示してくれることがあります。

理解できない指示

時にはGitHub Copilotが理解できないプロンプトを入力すると下記画像のような回答が返ってきます。
しかし少し内容を変えると回答が返ってくることもあるのでチャレンジしてみてはいかがでしょうか。

PlantUMLでクラス図作成

クラスに対する要件定義書作成

単体テスト作成

tnaiguchi: MSテストで使用出来る単体テストを作成して下さい

GitHub Copilot: 以下に、選択されたコードの一部に対する単体テストを示します。
これらのテストは、KmsManagerクラスのEncryptDataおよびDecryptDataメソッドをテストします。テストは、MS Testフレームワークを使用しています。

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Threading.Tasks;
using Amazon.KeyManagementService.Model;

[TestClass]
public class KmsManagerTests
{
    private KmsManager _kmsManager;
    private AmazonKeyManagementServiceClientStub _kmsClientStub;

    [TestInitialize]
    public void TestInitialize()
    {
        _kmsClientStub = new AmazonKeyManagementServiceClientStub();
        _kmsManager = new KmsManager("access

Key

", "secretKey", RegionEndpoint.USWest2, _kmsClientStub);
    }

    [TestMethod]
    public async Task EncryptData_EncryptsCorrectly()
    {
        // Arrange
        var keyId = "testKeyId";
        var plaintext = "testPlaintext";
        var expectedCiphertext = "testCiphertext";

        _kmsClientStub.EncryptResponse = new EncryptResponse
        {
            CiphertextBlob = new MemoryStream(Encoding.UTF8.GetBytes(expectedCiphertext))
        };

        // Act
        var result = await _kmsManager.EncryptData(keyId, plaintext);

        // Assert
        Assert.AreEqual(expectedCiphertext, result);
    }

    [TestMethod]
    public async Task DecryptData_DecryptsCorrectly()
    {
        // Arrange
        var ciphertext = "testCiphertext";
        var expectedPlaintext = "testPlaintext";

        _kmsClientStub.DecryptResponse = new DecryptResponse
        {
            Plaintext = new MemoryStream(Encoding.UTF8.GetBytes(expectedPlaintext))
        };

        // Act
        var result = await _kmsManager.DecryptData(ciphertext);

        // Assert
        Assert.AreEqual(expectedPlaintext, result);
    }
}

public class AmazonKeyManagementServiceClientStub : IAmazonKeyManagementService
{
    public EncryptResponse EncryptResponse { get; set; }
    public DecryptResponse DecryptResponse { get; set; }

    public Task<EncryptResponse> EncryptAsync(EncryptRequest request)
    {
        return Task.FromResult(EncryptResponse);
    }

    public Task<DecryptResponse> DecryptAsync(DecryptRequest request)
    {
        return Task.FromResult(DecryptResponse);
    }
}

このテストでは、KmsManagerクラスの依存関係である
IAmazonKeyManagementServiceをスタブ化しています。これにより、EncryptAsyncおよびDecryptAsyncメソッドの動作を制御し、テストを独立させることができます。

全て組み合わせ

tnaiguchi: 要件定義書を作成して下さい。

GitHub Copilot: # 要件定義書
## 1. 概要
本プロジェクトでは、AWS Key Management Service (KMS) を使用してデータの暗号化と復号化を行う `KmsManager` クラスを開発します。このクラスは、AWS アクセスキー、シークレットキー、およびリージョンを指定して初期化し、指定された KMS キーを使用してデータを暗号化および復号化します。

## 2. 機能要件

### 2.1 KmsManager クラス
- AWS アクセスキー、シークレットキー、およびリージョンを指定して初期化できる。
- 指定された KMS キーを使用してデータを暗号化できる。
- 指定された暗号文を復号化できる。

### 2.2 KmsManagerFactory クラス
- テスト環境かどうかを判断し、テスト環境であればスタブの KmsManager を、そうでなければ実際の KmsManager を生成できる。

### 2.3 IAmazonKeyManagementService インターフェース
- EncryptAsync メソッドと DecryptAsync メソッドを定義している。

### 2.4 AmazonKeyManagementServiceClientStub クラス
- IAmazonKeyManagementService インターフェースを実装し、EncryptAsync メソッドと DecryptAsync メソッドのスタブを提供する。

### 2.5 KmsManagerStub クラス
- KmsManager クラスを継承し、テスト環境で使用するためのスタブを提供する。

## 3. 非機能要件
- データの暗号化と復号化は、AWS KMS を使用して行われる。
- テスト環境では、AWS KMS への実際のアクセスを行わず、スタブを使用して動作をシミュレートする。

## 4. 制約事項
- AWS アクセスキー、シークレットキー、およびリージョンは、AWS KMS へのアクセスに必要な情報である。
- KMS キーの ID は、AWS KMS で生成されたキーの ID である。
- 暗号化するデータと復号化するデータは、UTF-8 でエンコードされた文字列である。
- 暗号文は、Base64 エンコードされた文字列である。
tnaiguchi: 上記要件定義書にPlantUML形式のクラス図とシーケンスを差し込んで要件定義書を再作成して下さい

GitHub Copilot: # 要件定義書

## 1. 概要
本プロジェクトでは、AWS Key Management Service (KMS) を使用してデータの暗号化と復号化を行う `KmsManager` クラスを開発します。このクラスは、AWS アクセスキー、シークレットキー、およびリージョンを指定して初期化し、指定された KMS キーを使用してデータを暗号化および復号化します。

## 2. 機能要件

### 2.1 KmsManager クラス
- AWS アクセスキー、シークレットキー、およびリージョンを指定して初期化できる。
- 指定された KMS キーを使用してデータを暗号化できる。
- 指定された暗号文を復号化できる。

### 2.2 KmsManagerFactory クラス
- テスト環境かどうかを判断し、テスト環境であればスタブの KmsManager を、そうでなければ実際の KmsManager を生成できる。

### 2.3 IAmazonKeyManagementService インターフェース
- EncryptAsync メソッドと DecryptAsync メソッドを定義している。

### 2.4 AmazonKeyManagementServiceClientStub クラス
- IAmazonKeyManagementService インターフェースを実装し、EncryptAsync メソッドと DecryptAsync メソッドのスタブを提供する。

### 2.5 KmsManagerStub クラス
- KmsManager クラスを継承し、テスト環境で使用するためのスタブを提供する。

## 3. 非機能要件
- データの暗号化と復号化は、AWS KMS を使用して行われる。
- テスト環境では、AWS KMS への実際のアクセスを行わず、スタブを使用して動作をシミュレートする。

## 4. 制約事項
- AWS アクセスキー、シークレットキー、およびリージョンは、AWS KMS へのアクセスに必要な情報である。
- KMS キーの ID は、AWS KMS で生成されたキーの ID である。
- 暗号化するデータと復号化するデータは、UTF-8 でエンコードされた文字列である。
- 暗号文は、Base64 エンコードされた文字列である。

## 5. クラス図

@startuml
class KmsManager {
  -IAmazonKeyManagementService _kmsClient
  +KmsManager(string accessKey, string secretKey, RegionEndpoint region)
  +Task<string> EncryptData(string keyId, string plaintext)
  +Task<string> DecryptData(string ciphertext)
}

interface IAmazonKeyManagementService {
  +Task<EncryptResponse> EncryptAsync(EncryptRequest request)
  +Task<DecryptResponse> DecryptAsync(DecryptRequest request)
}

class AmazonKeyManagementServiceClientStub {
  +Task<EncryptResponse> EncryptAsync(EncryptRequest request)
  +Task<DecryptResponse> DecryptAsync(DecryptRequest request)
}

class KmsManagerFactory {
  +static KmsManager CreateKmsManager(string accessKey, string secretKey, RegionEndpoint region)
  -static bool IsRunningInTestEnvironment()
}

class KmsManagerStub {
  +KmsManagerStub()
}

IAmazonKeyManagementService <|.. AmazonKeyManagementServiceClientStub
KmsManager <|-- KmsManagerStub
KmsManager ..> IAmazonKeyManagementService
KmsManagerFactory ..> KmsManager
KmsManagerFactory ..> KmsManagerStub
@enduml


## 6. シーケンス図

@startuml
actor User
participant KmsManagerFactory as Factory
participant KmsManager as Manager
participant IAmazonKeyManagementService as Service

User -> Factory : CreateKmsManager(accessKey, secretKey, region)
activate Factory
Factory -> Manager : new(accessKey, secretKey, region)
activate Manager
Manager -> Service : new(accessKey, secretKey, region)
activate Service
Service --> Manager : 
deactivate Service
Manager --> Factory : 
deactivate Manager
Factory --> User : KmsManager
deactivate Factory

User -> Manager : EncryptData(keyId, plaintext)
activate Manager
Manager -> Service : EncryptAsync(request)
activate Service
Service --> Manager : EncryptResponse
deactivate Service
Manager --> User : ciphertext
deactivate Manager

User -> Manager : DecryptData(ciphertext)
activate Manager
Manager -> Service : DecryptAsync(request)
activate Service
Service --> Manager : DecryptResponse
deactivate Service
Manager --> User : plaintext
deactivate Manager
@enduml

まとめ

上記のコマンドを駆使すると、何もない状態から下記のようなドキュメントまで作成する事が出来ます。
しかし出来上がったものに対する信用と責任は作成者になるので、慎重な判断力という点で作成者に求められる能力が一層高まったのではと思います。

注意事項

この記事は安易にAIを味方に付ければエンジニアとしての能力が低くても大丈夫といった事を記しているのではなく、指示を出す能力やレビュアーとしての能力を活かし、時間との戦いを制する為の方法を記しています。

最後まで読んで頂きありがとうございます。 良いエンジニアライフに幸あれ!!



We are hiring!!

ROBOT PAYMENTでは一緒に働く仲間を募集しています!!!

speakerdeck.com
www.robotpayment.co.jp