ChatGPTにソースコードを整理してもらいたい!
けど、プロンプト入力しても微妙な結果しか得られないという方は読んでください。
初学者から上級者に分けて、オススメのリファクタリングのプロンプトをご紹介します。
リファクタリングのタイミング
プロンプトを紹介する前に、どのタイミングでリファクタリングすべきなのかを知っておいてください。
初学者の方は特に!
機能追加/バグ修正の前
機能追加やバグ修正する際に、コードの可読性(構造)が悪いと機能追加やバグ修正のしやすがかなり変わってきます。
なので、これらの作業を行う前に、一度リファクタリングすることをオススメします。
コードが一目で理解できない時
コードをパッと見て、理解できない時はネストが深くなっていたり、処理が重複していることが多いので、そのタイミングで行ってください。
リファクタリングのためのプロンプト
リファクタリングは、プログラムのコード整理のことでChatGPTのプロンプトをうまいこと活用すれば、かなり精度良くリファクタリングすることができます。
今回はベースのプロンプトにOptionプロンプトをつけて自由に組み換えれるようにします。
- Baseプロンプト
- Optionプロンプト
→Extract
→命名規則
→メソッド化
→ネストを浅く - 分岐型
Baseプロンプト
こちらがベースとなるプロンプトになります。
このままでも使用可能ですが、条件を調整することで、より精度を高めることができます。
※[言語]にはリファクタリングさせたいコードの言語を入れてください。
あなたは、[言語]に精通したプロのITエンジニアです。
以下の条件をもとに、ソースコードのリファクタリングを行ってください。
#条件
- 関数、メソッド等を変更した場合は、変更内容を明記してください。
#ソースコード
'''
[ソースコードを貼り付けてください]
'''
Optionプロンプト
Baseプロンプトの#条件部分に、このOptionプロンプトを付け足すことで、理想のリファクタリングを行うことができます。
Optionとして細かく指示出しすることで、精度が向上します。
Extract(初学者向け)
説明変数というテクニックで、動作だけを目的としたコードでは必要ではない変数をあえて作りそこに名前をつけることでプログラムの文脈や全体像をわかりやすくできます。
他人のコードを見て、理解できない時に利用してみてください。
メソッドを抽出し、可読性をあげてください。
- Extractプロンプトの使用例
-
あなたは、[TypeScript]に精通したプロのITエンジニアです。 以下の条件をもとに、ソースコードのリファクタリングを行ってください。 #条件 - 関数、メソッド等を変更した場合は、変更内容を明記してください。 - メソッドを抽出し、可読性をあげてください。 #ソースコード '''
public cleanClothes(): void { for (let i = 0; i < this.clothes.length; i++) { const clothing = this.clothes[i]; if (clothing.isDirty()) { clothing.clean(); } } } '''
↓Extractのイメージ(リファクタリング前)
public void Test()
{
bool result = SomeTest();
if(result == false)
{
//このメッセージ表示部分をメソッドとして抽出する
System.Console.WriteLine("Error: Some Test failed.");
System.Console.WriteLine("Please contact your system administrator.");
}
}
↓リファクタリング後
public void Test()
{
bool result = SomeTest();
if(result == false)
{
PrintError("Some Test failed.");
}
}
public void PrintError(string message)
{
System.Console.WriteLine("Error: {0}", message);
System.Console.WriteLine("Please contact your system administrator.");
}
命名規則
関数や変数の名前がおかしい時に、この条件を入れてあげると調整してくれます。
関数名・変数名の命名規則をsnake caseに統一してください
- 命名規則プロンプトの使用例
-
あなたは、[TypeScript]に精通したプロのITエンジニアです。 以下の条件をもとに、ソースコードのリファクタリングを行ってください。 #条件 - 関数名・変数名の命名規則をsnake caseに統一してください #ソースコード '''
public cleanClothes(): void { for (let i = 0; i < this.clothes.length; i++) { const clothing = this.clothes[i]; if (clothing.isDirty()) { clothing.clean(); } } } '''
snake case | 英語の複合語やフレーズ(句)、文を一語に繋げて表記する際に、単語間のスペースをアンダースコア(_)に置き換える方式 |
メソッド化
重複している処理をメソッド化して、コードを短くし可読性をあげることができます。
重複してしてる処理をメソッドにし、コードを短くしてください
- 命名規則プロンプトの使用例
-
あなたは、[TypeScript]に精通したプロのITエンジニアです。 以下の条件をもとに、ソースコードのリファクタリングを行ってください。 #条件 - 重複してしてる処理をメソッドにし、コードを短くしてください #ソースコード '''
public cleanClothes(): void { for (let i = 0; i < this.clothes.length; i++) { const clothing = this.clothes[i]; if (clothing.isDirty()) { clothing.clean(); } } } '''
ネストを浅く
ネストが深いと可読性が悪くなるので、無駄なインデントや空白は削除しましょう。
無駄な空白/インデントを削除してください。
- 命名規則プロンプトの使用例
-
あなたは、[TypeScript]に精通したプロのITエンジニアです。 以下の条件をもとに、ソースコードのリファクタリングを行ってください。 #条件 - 無駄な空白/インデントを削除してください。 - 重複してしてる処理をメソッドにし、コードを短くしてください #ソースコード '''
public cleanClothes(): void { for (let i = 0; i < this.clothes.length; i++) { const clothing = this.clothes[i]; if (clothing.isDirty()) { clothing.clean(); } } } '''
今後のリファクタリング
今はChatGPTでのリファクタリングが最適ですが、プログラミング特化LLM「LTM-1」が正式にリリースされれば、こちらを利用するのが良さそうです。
LTM1は、500万ものトークン上限(GPT-4が約3.2万)を持ち、50万行のコードをカバーできるため、Githubのレポジトリを完全にカバーするのに十分な量で、今後はレポジトリ単位でのリファクタリングも一発でできるようになりそうです。
おまけ
エンジニア向けのChatGPTのプロンプト20選という記事も、GoogleのDiscover面にも掲載されるほど反響があったのでよかったら目を通してみてください。