GitHub Copilotを使用したコーディングTips集
こんにちは、決済サービスの開発を担当しているtaniguchikunです。
今回はGitHubCopilotで何ができるかを記載してコーディングを楽にする方法を記載したいと思います。
概要
GitHub Copilotで何ができるかを知っていれば生産性を上げる事ができるので、知って損ではない物だと感じています。 なので現時点での自分が試してきた内容を書きたいと思います。
目次
- 何もない所から大枠でサンプルコードを実装
- コメントヘッダーの作成
- 翻訳作業
- クラスの解説
- スタブクラスの作成
- 無理な指示には別の解決策を提示
- 理解できない指示
- PlantUMLでクラス図作成
- クラスに対する要件定義書作成
- 単体テスト作成
- 全て組み合わせ
- まとめ
- 注意事項
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