ChatGPTは、コードレビューの効率と品質を大幅に向上させる革新的なツールです。
「コードレビューに時間がかかりすぎて他の作業が進まない」と感じている開発者の方も多いのではないでしょうか。
ChatGPTを活用しないままだと、効率的な開発ができず、競合他社に後れを取ってしまう可能性があります。
本記事では、ChatGPTをコードレビューに導入する方法やそのメリット、注意点を詳しく解説しています。
本記事を読めば、ChatGPTを使ってコードレビューを効率化し、より高品質なソフトウェア開発を実現できるようになるでしょう。
|監修者
(株)SHIFT AI 代表取締役 / GMO他複数社AI顧問 / 生成AI活用普及協会理事 / Microsoft Copilot+ PCのCMに出演 / 国内最大級AI活用コミュニティ(会員5,000人超)を運営。
『日本をAI先進国に』実現の為に活動中。Xアカウントのフォロワー数は9万人超え(2024年9月現在)
弊社SHIFT AIでは、ChatGPTをスムーズに導入できるよう、セミナーを開催しています。無料で参加可能ですので、ぜひこれを機会に詳細を確認してみてください。
\ AI人材の一歩目! /
コードレビューはChatGPTで本当に効率と品質を向上できる?
ChatGPTは、コードレビューの効率と品質を向上させる強力なツールです。
コードのエラーや改善点を一貫した基準で自動的に検出し、エンジニアの経験に依存することなくレビューの質を保てます。
これにより、時間のかかる手作業でのコードチェックを大幅に短縮できる点が大きなメリットです。
たとえば、ChatGPTはコード中のバグや最適化の機会をすばやく見つけ、指摘することが可能です。
実際、複雑なアルゴリズムやコーディング規約に基づいたレビューを手軽に行えるため、経験の浅いエンジニアでも高品質なコードレビューを実現できます。
また、エンジニア同士の見落としや認識の違いによる不具合を減らすことも可能です。
これにより、開発チーム全体の生産性が向上し、プロジェクトの進行をスムーズにする効果があります。
ChatGPTを活用することで、コードレビューの精度と効率が飛躍的に向上し、品質を保ちながら開発スピードも上げられます。
まずはChatGPTの導入や設定方法を見ていきましょう。
なお、コードレビューを含むプログラミングタスクでChatGPTを活用する方法については、以下の記事で詳しく解説していますので、こちらもあわせてご確認ください。
コードレビューにおけるChatGPT導入方法
ChatGPTをコードレビューに活用する手順を理解することは、効果的にChatGPTを活用するための鍵です。
ここでは、以下の3つのポイントについて詳しく説明します。
- ChatGPTの導入と設定
- コードレビューを実行する
- コード解釈とエラーハンドリングの活用
適切にコードレビューを任せる方法を知らなければ、せっかくのChatGPTの能力を活用できない可能性があります。
それでは、3つのポイントを見ていきましょう。
ChatGPTの導入と設定
ChatGPTの導入は非常に簡単です。
まず、ChatGPTブラウザ版を利用するには、アカウントを作成するだけで、すぐに利用を開始できます。
追加のソフトウェアインストールや複雑な設定は必要ありません。
以下の手順により、技術的な障壁が少なく、誰でも簡単にコードレビューを始められます。
ステップ1: ChatGPTの公式サイトにアクセスし、アカウントを作成します。既にアカウントを作成済みの方はログインしてください。
ステップ2: ログイン後、ChatGPTにコードを入力するだけで、自動的にコードを解析し、プログラミング言語に応じたフィードバックが提供されます。
さらに、ChatGPTはAPI経由でも利用可能です。
APIを活用することで、既存の開発環境や自動化ツールと統合し、ブラウザを使わずにコードレビューを実行できます。
ChatGPTはブラウザ版とAPIを通じて導入でき、それぞれの方法でコードレビューの効率を大幅に向上させることが可能です。
コードレビューを実行する
ChatGPTを使ったコードレビューは、非常にシンプルな手順で進められます。
まず、レビュー対象のコードを入力し、適切な指示を与えることで、リアルタイムに問題点や改善点を指摘してもらえます。
コード例:
def calculate_sum(a, b):
sum = a + b
return sum
上記のコードに対して、このようなプロンプトを入力します。
プロンプト例:
「このPythonコードの最適化と改善点を教えてください。」
すると、ChatGPT(o1-preview)はこのようなフィードバックを返してくれます。
出力結果
このPythonコードの改善点と最適化は以下のとおりです:
- 変数名の変更:
sum
はPythonの組み込み関数であり、変数名として使用すると組み込み関数を隠してしまいます。これにより、予期しない動作や可読性の低下を招く可能性があります。- 対策:変数名を
result
やtotal
など、他の名前に変更します。
- コードの簡略化:
- 関数内で変数に一度だけ値を代入し、そのまま返す場合は、直接その計算結果を返すことでコードを簡潔にできます。
- 対策:
return a + b
と直接結果を返します。
- 型ヒントの追加(Python 3.5以降):
- 型ヒントを追加することで、コードの可読性とメンテナンス性が向上し、静的解析ツールによるエラー検出が容易になります。
- 対策:引数と戻り値に型ヒントを付与します。
改善後のコード:
def calculate_sum(a: float, b: float) -> float:
return a + b
または、整数と浮動小数点数の両方をサポートする場合:
from typing import Union
def calculate_sum(a: Union[int, float], b: Union[int, float]) -> Union[int, float]:
return a + b
まとめ:
- 変数名を適切に選ぶことで、コードの可読性と安全性が向上します。
- 不要な変数を省くことで、コードを簡潔に保ちます。
- 型ヒントを使用して、将来的なメンテナンスやチーム開発を容易にします。
このように、ChatGPTはコードのレビューを行い、変数名の最適化やロジックの改善提案をすぐに提供してくれます。
コードの問題点をリアルタイムで指摘し、修正を提案することで、従来の手作業によるレビューよりも迅速に改善が可能です。
今回は非常にシンプルなコードでしたが、最新のGPT-4oやo1-previewといったモデルは、非常に複雑で大規模なコードでも正確にフィードバックしてくれます。
このように、ChatGPTの活用は開発チームの生産性を高め、プロジェクト全体の進行がスムーズになります。
コード解釈とエラーハンドリングの活用
ChatGPTは、コードの解析を行い、エラーの原因やロジックの不具合を特定し、具体的なエラーハンドリングの提案をしてくれます。
特に複雑な処理や例外処理を含むコードにおいて、デバッグ作業を大幅に効率化することが可能です。
コード例:
def process_data(data_list):
total = 0
for item in data_list:
total += int(item)
return total
このコードでは、リスト内の値を整数に変換して合計を求めていますが、リストに文字列や非整数の値が含まれている場合にエラーが発生します。
このような場合に、エラーハンドリングを追加して、例外処理を行うことが重要です。
そこで、以下のプロンプトを入力して改善させます。
プロンプト例:
「このコードにエラーハンドリングを追加して、リストに文字列や非整数の値が含まれている場合の対処方法を教えてください。」
出力結果
エラーハンドリングを追加することで、process_data
関数がリスト内の文字列や非整数の値を適切に処理できるようになります。以下に、エラーが発生した場合の対処方法と、その実装例を示します。
対処方法
- 不正な値をスキップする:
- エラーが発生した場合、その値を無視して処理を続行します。
- 利点:他の正しいデータの処理を妨げません。
- 実装:
try-except
ブロックを使用して、ValueError
をキャッチします。
- 警告メッセージを表示する:
- 不正な値が見つかった場合、ユーザーに通知します。
- 利点:データの不整合に気づくことができます。
- 実装:エラーをキャッチした際に、
print
関数でメッセージを表示します。
- エラーを記録する:
- 不正な値をリストに保存し、処理後にまとめて報告します。
- 利点:エラーの詳細を後で確認できます。
- 実装:エラーが発生した値を別のリストに追加します。
改善後のコード
以下は上記の対処方法を組み合わせたコードです。
from typing import List, Union
def process_data(data_list: List[Union[int, str]]) -> int:
total = 0
errors = []
for item in data_list:
try:
total += int(item)
except ValueError:
errors.append(item)
print(f"警告: '{item}' は整数に変換できないため、スキップされました。")
if errors:
print(f"処理中に {len(errors)} 件のエラーが発生しました。")
return total
コードの説明
- 型ヒントの追加:
data_list: List[Union[int, str]]
:整数と文字列のリストを受け取ることを明示しています。-> int
:関数が整数を返すことを示します。- エラーハンドリング:
try-except
ブロックでint(item)
の変換を試みます。ValueError
が発生した場合、不正な値をerrors
リストに追加し、警告メッセージを表示します。- エラーの報告:
- すべての処理が終わった後、エラーの総数を表示します。
使用例
data = [1, '2', 'three', 4, '5.5', 'six', 7]
result = process_data(data)
print(f"合計: {result}")
出力:
警告: 'three' は整数に変換できないため、スキップされました。
警告: '5.5' は整数に変換できないため、スキップされました。
警告: 'six' は整数に変換できないため、スキップされました。
処理中に 3 件のエラーが発生しました。
合計: 14
まとめ
- エラーハンドリングの追加:
try-except
ブロックで変換エラーをキャッチします。 - 不正な値の対処:エラーを記録し、必要に応じてユーザーに通知します。
- コードの可読性向上:型ヒントを追加し、変数名をわかりやすくします。
これにより、process_data
関数はリスト内の文字列や非整数の値を適切に処理し、エラーが発生してもプログラムが停止しないようになります。
このように、修正したコードとその説明、使用例などを出力してくれました。
エラーハンドリングを適切に行うことで、予期しないエラーによるプログラムの停止を防ぎ、より堅牢なコードを作成できます。
ChatGPTは、エラーハンドリングの追加も難なく行え、デバッグ作業を効率化してプロジェクト全体の信頼性を向上させます。
ChatGPTでコードレビューする際のコツ3選
ChatGPTを使ったコードレビューは非常に強力ですが、より効果的に活用するためにいくつかのコツがあります。
ここでは、コードレビューの際に押さえておくべき以下の3つの重要なポイントについて具体例を交えながら説明します。
- 具体的で明確な指示を出す
- 何度も反復的にレビューさせる
- コードやプロジェクトの背景情報を共有する
これらのコツを把握していないと、せっかく導入したChatGPTを100%活かしきれない可能性があります。
具体的で明確な指示を出す
ChatGPTに対して具体的で明確な指示を出すことで、実践的で有益なフィードバックが得られます。
特に複雑なコードや条件を含む場合、曖昧な指示ではChatGPTが十分な解析を行えない可能性があります。
そのため、改善したい箇所や期待するフィードバックを詳細に説明することが重要です。
たとえば以下のようなコードがあるとします。
コード例:
def apply_discount(cart_items, discount):
total = 0
for item in cart_items:
price = item.get('price', 0)
total += price - (price * discount)
return total
このコードは、ショッピングカート内の商品に対して割引を適用し、合計金額を算出しています。
しかし、このままではdiscountの値が不正な場合(たとえば、負の数や1を超える値)に対応できていません。
この問題に対して、ChatGPTに明確で具体的な指示を与えて修正してもらいます。
プロンプト例:
「このPythonコードについて、discountが負の数や1を超える値が入力された場合に不正な計算結果が出ないように修正してください。また、割引が適用できない場合には警告メッセージを表示するようにしてください。」
出力結果
apply_discount
関数を修正して、discount
が負の数や1を超える値が入力された場合に不正な計算結果が出ないようにし、割引が適用できない場合には警告メッセージを表示する方法を以下に示します。
修正点
- 割引率の検証:
discount
が0以上1以下の範囲内であるかチェックします。- 無効な割引率の場合、割引を適用せずに計算し、警告メッセージを表示します。
- 計算式の明確化:
- 割引後の価格を計算する際に、
price * (1 - discount)
を使用すると、計算が直感的になります。
改善後のコード
def apply_discount(cart_items, discount):
if not (0 <= discount <= 1):
print("警告: 割引率が無効です。割引を適用せずに計算します。")
discount = 0 # 割引を適用しない
total = 0
for item in cart_items:
price = item.get('price', 0)
total += price * (1 - discount)
return total
コードの説明
- 割引率のチェック:
if not (0 <= discount <= 1):
で、discount
が0から1の範囲内にあるか確認します。- 条件を満たさない場合、警告メッセージを表示し、
discount
を0
に設定します。 - 割引の適用:
total += price * (1 - discount)
で、各商品の割引後の価格を総計に加算します。
使用例
# カート内の商品リスト
cart_items = [
{'name': '商品A', 'price': 1000},
{'name': '商品B', 'price': 2000},
{'name': '商品C', 'price': 3000},
]
# 有効な割引率(10%割引)
print("合計金額(10%割引適用):", apply_discount(cart_items, 0.1))
# 無効な割引率(負の値)
print("合計金額(無効な割引率 -0.2):", apply_discount(cart_items, -0.2))
# 無効な割引率(1を超える値)
print("合計金額(無効な割引率 1.5):", apply_discount(cart_items, 1.5))
出力:
合計金額(10%割引適用): 5400.0
警告: 割引率が無効です。割引を適用せずに計算します。
合計金額(無効な割引率 -0.2): 6000
警告: 割引率が無効です。割引を適用せずに計算します。
合計金額(無効な割引率 1.5): 6000
ポイントまとめ
- 入力値の検証:
- ユーザーからの入力を信頼せず、必ず検証を行います。
- 異常値に対して適切な対処(ここでは割引を適用しない)を行います。
- ユーザーへのフィードバック:
- 無効な入力があった場合、警告メッセージを表示してユーザーに通知します。
- コードの可読性向上:
- 計算式を明確にすることで、コードの理解が容易になります。
これにより、apply_discount
関数は不正なdiscount
値に対しても適切に対応し、正しい合計金額を計算することができます。
このように、特定の問題点や条件を明示することで、ChatGPTは的確な改善提案やエラーチェックを含めた修正案を提供してくれます。
特に、複雑なロジックや制約条件がある場合は、具体的な指示が欠かせません。
何度も反復的にレビューさせる
ChatGPTを活用する際、コードレビューを1回だけで終わらせず、複数回にわたって反復的に行うことが、より精度の高いフィードバックを得る鍵です。
段階ごとにレビューを行い、その都度指摘された改善点を反映させることで、最終的なコードの品質が大幅に向上します。
たとえば、最初のレビューではChatGPTがコードの構造的な問題が指摘し、修正します。
次のレビューで最適化やリファクタリングの提案を促し、修正をさせるというように段階的に進めていくことでより細かい改善が可能になります。
こちらも実際の例を示します。
たとえばこのようなコードがあるとします。
コード例:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int subtract(int a, int b) {
return a - b;
}
public int multiply(int a, int b) {
return a * b;
}
public int divide(int a, int b) {
return a / b; // bが0の場合にエラー
}
}
このコードは、divideメソッドにおいて、bが0のときにエラーが発生する問題があるので、それを修正するように依頼します。
プロンプト例(1回目):
「このJavaコードのdivideメソッドで、bが0の場合にエラーが発生しないように修正してください。」
出力結果
divide
メソッドを修正して、b
が0の場合にエラーが発生しないようにするためには、b
が0かどうかをチェックし、適切な処理を行う必要があります。以下に修正後のコードとその説明を示します。
修正後のコード
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int subtract(int a, int b) {
return a - b;
}
public int multiply(int a, int b) {
return a * b;
}
public int divide(int a, int b) {
if (b == 0) {
System.out.println("警告: 0で割ることはできません。結果を0として返します。");
return 0; // または他の適切な値を返す
}
return a / b;
}
}
コードの説明
- ゼロ除算のチェック
divide
メソッド内で、まずif (b == 0)
を使用してb
が0かどうかを確認します。b
が0の場合、通常の除算を行うとArithmeticException
が発生します。
- エラー回避と警告の表示
System.out.println
を使用して、ユーザーに対して警告メッセージを表示します。- メッセージ例:
"警告: 0で割ることはできません。結果を0として返します。"
- メッセージ例:
- その後、
return 0;
で計算結果として0
を返します。- 必要に応じて、他の適切な値(例えば
Integer.MAX_VALUE
や-1
など)を返すことも検討できます。
- 必要に応じて、他の適切な値(例えば
- 正常時の処理
b
が0でない場合、通常通りa / b
を計算して結果を返します。
使用例
public class Main {
public static void main(String[] args) {
Calculator calc = new Calculator();
int result1 = calc.divide(10, 2);
System.out.println("10 / 2 = " + result1); // 出力: 10 / 2 = 5
int result2 = calc.divide(10, 0);
// 出力:
// 警告: 0で割ることはできません。結果を0として返します。
// 10 / 0 = 0
System.out.println("10 / 0 = " + result2);
}
}
ポイント
- エラーの防止:
b
が0の場合にゼロ除算エラーが発生するのを防ぎます。 - ユーザーへの通知: 警告メッセージを表示して、計算結果が通常とは異なることをユーザーに知らせます。
- 結果の扱い:
b
が0の場合の返り値は、アプリケーションの要件に応じて適切な値を選択してください。
別のアプローチ
もしエラーを発生させずに、より適切な方法で問題を処理したい場合は、Optional
やカスタムのエラーコードを使用することも検討できます。しかし、シンプルさを保つために上記の方法が一般的です。
これで、divide
メソッドはb
が0の場合でもエラーを発生させず、適切に処理するようになります。
依頼した修正を正確に行ってくれましたが、これだけでは十分ではない可能性もあります。
そこで、指摘された部分を修正し、そのコードを再度レビューしてもらいます。
プロンプト例(2回目):
「このコード全体で他に最適化できる点があるかどうかも確認してください。たとえば、不要な処理や改善点があれば教えてください。」
出力結果
以下の点でコードの最適化や改善が可能です。
1. 例外処理の活用
- 現状の問題点:
divide
メソッドでb
が0の場合、警告メッセージを出力し0
を返しています。これは、計算結果として0
が有効な場合に混乱を招く可能性があります。また、メソッド内でコンソールに出力することは、メソッドの副作用となり、望ましくありません。 - 改善案:
ArithmeticException
をスローして、呼び出し元で適切にエラー処理を行えるようにします。
public int divide(int a, int b) {
if (b == 0) {
throw new ArithmeticException("0で割ることはできません。");
}
return a / b;
}
- メリット: エラーを明示的に伝えることで、プログラムの予期せぬ動作を防ぎ、デバッグを容易にします。
2. データ型の汎用化
- 現状の問題点: メソッドが
int
型のみを扱っているため、小数を含む計算ができません。 - 改善案: データ型を
double
に変更し、整数と小数の両方を扱えるようにします。
public double add(double a, double b) {
return a + b;
}
// 他のメソッドも同様にdouble型に変更
- メリット: 計算の精度が向上し、より多くの場面で利用可能になります。
3. メソッドの静的化
- 現状の問題点: インスタンス変数がないにもかかわらず、クラスをインスタンス化しなければメソッドを使用できません。
- 改善案: メソッドを
static
にして、クラス名から直接呼び出せるようにします。
public static double add(double a, double b) {
return a + b;
}
- メリット: ユーティリティクラスとして扱いやすくなり、無駄なインスタンス生成を防げます。
4. ドキュメンテーションコメントの追加
- 改善案: 各メソッドにJavaDocコメントを追加し、使用方法や注意点を明確にします。
/**
* 2つの数値の和を計算します。
* @param a 1つ目の数値
* @param b 2つ目の数値
* @return aとbの合計
*/
public static double add(double a, double b) {
return a + b;
}
- メリット: コードの可読性とメンテナンス性が向上し、他の開発者が理解しやすくなります。
5. 不要なコメントの削除
- 現状の問題点:
divide
メソッド内のコメント// または他の適切な値を返す
は、コードの意図を明確にしていません。 - 改善案: コメントを削除または具体的な説明に変更します。
6. クラスの最終化
- 改善案: クラスを
final
にして継承を防ぎます。
public final class Calculator {
// メソッド群
}
- メリット: クラスの不変性を保証し、予期しない拡張を防ぎます。
7. パッケージの利用
- 改善案: クラスを適切なパッケージに配置し、名前空間を整理します。
package com.example.calculator;
public final class Calculator {
// メソッド群
}
最終的なコード例
package com.example.calculator;
/**
* シンプルな計算機能を提供するクラス。
*/
public final class Calculator {
/**
* 2つの数値の和を計算します。
* @param a 1つ目の数値
* @param b 2つ目の数値
* @return aとbの合計
*/
public static double add(double a, double b) {
return a + b;
}
/**
* 2つの数値の差を計算します。
* @param a 減算される数値
* @param b 減算する数値
* @return aからbを引いた結果
*/
public static double subtract(double a, double b) {
return a - b;
}
/**
* 2つの数値の積を計算します。
* @param a 1つ目の数値
* @param b 2つ目の数値
* @return aとbの積
*/
public static double multiply(double a, double b) {
return a * b;
}
/**
* 2つの数値の商を計算します。
* @param a 被除数
* @param b 除数
* @return aをbで割った結果
* @throws ArithmeticException 除数が0の場合にスローされます。
*/
public static double divide(double a, double b) {
if (b == 0) {
throw new ArithmeticException("0で割ることはできません。");
}
return a / b;
}
}
改善点のまとめ
- 例外処理の適切な使用: エラーを正しくハンドリングし、プログラムの信頼性を高めました。
- データ型の汎用性向上:
double
型を使用することで、より広範な数値計算に対応しました。 - メソッドの静的化: ユーティリティクラスとしての使用が容易になり、無駄なインスタンス化を防ぎました。
- コードの可読性向上: JavaDocコメントやパッケージ構成により、コードの理解と保守がしやすくなりました。
- 不要な要素の削除: 無意味なコメントを削除し、コードを簡潔に保ちました。
- クラスの最終化: クラスを
final
にして、意図しない継承を防止しました。
これらの改善により、コードの品質、可読性、保守性が向上し、より堅牢なアプリケーション開発が可能になります。
このように、2回目のレビューでは7つもの最適化案を提案し、最終的なコードも出力してくれました。
最終的なコードは、最初のコードに比べ格段に良くなっている(さまざまなケースに対応可能になっている)ことがわかります。
このように反復的にレビューを依頼し、その都度修正を加えることで、コードの品質を着実に向上できます。
反復的なレビューは、最初に見落としがちな細かな部分にも改善の目を向けさせ、全体の完成度を高める重要なアプローチです。
コードやプロジェクトの背景情報を共有する
ChatGPTにコードレビューを依頼する際には、コードやプロジェクトの背景情報を共有することが非常に重要です。
そのコードがどのようなプロジェクトや目的に関連しているか、どのような設計方針にもとづいているかを伝えることで、的確で有用なフィードバックを得られます。
プロジェクトの背景情報がなければ、ChatGPTは表面的なエラーや効率の問題しか指摘できませんが、意図や文脈を理解させることで、プロジェクトに適したフィードバックが可能になります。
具体的な例を示します。
たとえば、このようなコードがあるとします。
コード例:
def calculate_shipping_cost(weight, country):
if country == "USA":
return weight * 5
elif country == "Canada":
return weight * 7
else:
return weight * 10
このコードは、商品の重量と発送先の国(アメリカ、カナダ)にもとづいて送料を計算します。
しかしこのままでは、たとえば特定の商品の優遇措置や、特定地域への特別な割引などの背景に対応できない可能性があります。
そこで、以下のように背景情報を含んだ指示を出して修正させます。
プロンプト例:
「このコードは、国ごとに異なる送料を計算するロジックです。ただし、今後特定の国に特別な割引を適用する可能性があります。また、将来的に複数の商品カテゴリーに対応した料金体系を導入する予定です。この点を考慮して、コードを柔軟に拡張できるようにしてください。」
出力結果
今後の要件である「特定の国への特別な割引の適用」や「複数の商品カテゴリーに対応した料金体系の導入」を考慮して、コードを柔軟に拡張できるようにリファクタリングします。
改善ポイント
- データ構造の活用:
- 送料率と割引率を辞書で管理:国ごとの基本送料率や割引率、商品カテゴリーごとの追加料金率を辞書にまとめます。これにより、新しい国やカテゴリーを追加する際にコードを変更する必要がなくなります。
- 関数のパラメータ化:
- カテゴリーの追加:
category
パラメータを関数に追加し、商品カテゴリーに応じた料金計算ができるようにします。
- 柔軟な計算ロジックの実装:
- 割引の適用:特定の国に対して割引を適用できるようにします。
- カテゴリー別の料金調整:商品カテゴリーに応じて送料を調整します。
改善後のコード
def calculate_shipping_cost(weight, country, category):
# 国ごとの基本送料率
base_rates = {
"USA": 5,
"Canada": 7,
"UK": 6,
"Default": 10
}
# 国ごとの割引率(0から1の間)
country_discounts = {
"Canada": 0.1, # 10%割引
"UK": 0.05 # 5%割引
# 必要に応じて他の国を追加
}
# カテゴリーごとの追加料金率
category_rates = {
"Electronics": 1.2,
"Clothing": 1.0,
"Books": 0.8,
"Default": 1.0
}
# 基本送料率を取得
rate = base_rates.get(country, base_rates["Default"])
# カテゴリーによる料金調整
category_rate = category_rates.get(category, category_rates["Default"])
rate *= category_rate
# 割引の適用
discount = country_discounts.get(country, 0)
final_rate = rate * (1 - discount)
# 送料の計算
shipping_cost = weight * final_rate
return shipping_cost
コードの説明
- 基本送料率:
base_rates
辞書で国ごとの送料率を定義します。未定義の国に対しては"Default"
の値を使用します。 - 割引率:
country_discounts
辞書で国ごとの割引率を定義します。割引がない場合は0
を適用します。 - カテゴリー料金率:
category_rates
辞書で商品カテゴリーごとの料金調整率を定義します。 - 計算手順:
- 国に対応する基本送料率を取得します。
- 商品カテゴリーによる料金調整を行います。
- 国ごとの割引を適用します。
- 重量に応じて最終的な送料を計算します。
使用例
# 2kgの電子機器をCanadaに配送する場合
cost = calculate_shipping_cost(2, "Canada", "Electronics")
print(f"送料: ${cost:.2f}")
# 1.5kgの本をUKに配送する場合
cost = calculate_shipping_cost(1.5, "UK", "Books")
print(f"送料: ${cost:.2f}")
# 未定義の国とカテゴリーの場合
cost = calculate_shipping_cost(3, "Brazil", "Toys")
print(f"送料: ${cost:.2f}")
出力:
送料: $11.88
送料: $6.84
送料: $30.00
メリット
- 拡張性:新しい国、割引、カテゴリーを追加する際、辞書にエントリを追加するだけで対応できます。
- メンテナンス性:送料率や割引率を一元管理でき、コードの可読性と保守性が向上します。
- 柔軟性:特定の国やカテゴリーに対する特別な料金設定が容易になります。
さらなる改善
- 外部設定ファイルの利用:
- 送料率や割引率をJSONやYAMLなどの外部ファイルから読み込むようにすると、非エンジニアでもデータを更新できます。
- エラーハンドリングの強化:
- 無効な入力(例:負の重量や存在しない国名)に対するエラーチェックを追加します。
- ログの導入:
- 送料計算の履歴をログとして残すことで、データ分析や問題発生時のトラブルシューティングに役立ちます。
- オブジェクト指向プログラミングの採用:
- クラスを使って、送料計算のロジックをオブジェクトとして表現することで、さらなる柔軟性と再利用性を確保できます。
結論
このリファクタリングにより、コードは将来の要件変更に対して柔軟に対応できるようになりました。新たな国や商品カテゴリー、割引政策が導入された場合でも、コードの大部分を変更することなく、簡単に適応できます。
このように、背景情報を加味して正確に改善案を提示してくれるだけでなく、今後のさらなる改善(機能拡張)案も提案してくれます。
背景情報を事前に提供することで、コード全体の意図やプロジェクトの長期的なニーズに沿ったフィードバックが得られ、より実践的な提案を受けることが可能になります。
VSCodeとGitHubでChatGPTを活用したコードレビューをする方法
ChatGPTをVSCodeやGitHubと連携して使用することで、開発環境内でのコードレビューがさらに効率化されます。
リアルタイムでフィードバックを得ることができ、開発スピードやコードの品質向上が期待できます。
ここでは、VSCodeとGitHubとChatGPTを連携する具体的な連携手順と活用方法を説明します。
- VSCodeでChatGPTを導入してコードレビューをする方法
- GitHubでChatGPTを導入してコードレビューをする方法
VSCodeでChatGPTを導入してコードレビューをする方法
VSCodeとChatGPTを連携することで、エディタ内でリアルタイムにフィードバックを受けられ、開発作業の効率が格段に向上します。
ここでは、VSCode内でChatGPTを活用してコードレビューを実行するための具体的な手順を紹介します。
なお、ここで紹介するプラグインはあくまでも一例であり、その他にもさまざまな方法でChatGPTとVSCodeを連携できます。
1. ChatGPTプラグインのインストール
VSCodeでChatGPTを使うには、まず「Genie AI」プラグインをインストールします。
- VSCodeを開く。
- サイドバーの拡張機能アイコン(四角のアイコン)をクリック。
- 検索バーに「Genie AI」と入力。
- 出てきた「Genie AI」をクリックしてインストール。
これでVSCodeにChatGPTのプラグインが導入され、レビュー環境が整います。
2. OpenAI APIキーの設定
Genie AIでChatGPTを利用するにはOpenAIのAPIキーが必要です。
以下の手順でAPIキーを設定します。
- OpenAIの公式サイトでAPIキーを取得します(公式サイトでアカウントを作成し、APIキーを生成)。
- Genie AIの初回使用時にAPIキーの設定を求められるので、自身のAPIキーを入力します。
この設定が完了すると、VSCodeからChatGPTを利用できるようになります。
3. コードレビューを実行する
実際にコードレビューを実行するには、以下の手順でChatGPTに指示を出します。
- レビューしたいコードを開く
- レビューさせたいコードの全体または一部を選択し、右クリック>Genieをクリック
- Genie: Optimizeをクリックすると、選択したコードのレビュー、修正が開始
すると、ChatGPTがコードの最適化提案を行ってくれます。
これらの手順を踏むことで、VSCode内で簡単にChatGPTを活用してコードレビューを実行できます。
特に、VSCodeのコマンドパレットからChatGPTを直接操作できる点が、作業効率の向上に大きく寄与します。
なお、Genie AIにはOptimize以外にもバグ発見機能やテキスト追加機能もあります。
VSCodeとChatGPTの連携については、以下の記事で詳しく解説していますので、こちらもあわせてご確認ください。
GitHubでChatGPTを導入してコードレビューをする方法
GitHubとChatGPTを連携させることで、プルリクエストの際に自動的にコードレビューを実行でき、レビュー作業が大幅に効率化されます。
GitHubのプルリクエストの際にChatGPTを使ってコードを解析し、問題点や改善点の指摘を自動で行えます。
ここでは、anc95/ChatGPT-CodeReviewとGitHub Actionsを使った方法を具体的に説明します。
1. ChatGPT-CodeReviewとGitHub Actionsを利用して自動化する
GitHubでは、ChatGPT-CodeReviewとGitHub Actionsを使ってChatGPTによるコードレビューを自動化できます。
GitHub Actionsは、リポジトリに特定のアクション(プルリクエストの作成など)が発生したときに、自動的に指定されたタスクを実行する仕組みです。
以下の手順で、ChatGPTを使ったコードレビューを設定します。
- GitHubリポジトリを開く。
- .GitHub/workflows フォルダを作成し、その中に新しいYAMLファイルを作成します。
2. GitHub Actionsの設定
次に、GitHub ActionsでChatGPT-CodeReviewを使ってChatGPTを使用するための設定を行います。
先ほど作成したYAMLファイルの中身をこのように設定します。
name: Code Review
permissions:
contents: read
pull-requests: write
on:
pull_request:
types: [opened, reopened, synchronize]
jobs:
test:
# if: ${{ contains(GitHub.event.*.labels.*.name, 'gpt review') }} # Optional; to run only when a label is attached
runs-on: ubuntu-latest
steps:
- uses: anc95/ChatGPT-CodeReview@main
env:
GitHub_TOKEN: ${{ secrets.GitHub_TOKEN }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
# Optional
LANGUAGE: Japanese
OPENAI_API_ENDPOINT: https://api.openai.com/v1
MODEL: gpt-4o# https://platform.openai.com/docs/models
PROMPT: 以下のコードに関して、パフォーマンスの最適化、バグの発見、およびセキュリティ上の懸念点などがあれば指摘してください。
top_p: 1 # https://platform.openai.com/docs/api-reference/chat/create#chat/create-top_p
temperature: 1 # https://platform.openai.com/docs/api-reference/chat/create#chat/create-temperature
max_tokens: 10000
MAX_PATCH_LENGTH: 10000 # if the patch/diff length is large than MAX_PATCH_LENGTH, will be ignored and won't review. By default, with no MAX_PATCH_LENGTH set, there is also no limit for the patch/diff length.
このYAMLファイルでは、プルリクエストが作成されたときに、OpenAI APIを呼び出して、GPT-4oによるコードレビューを実行するよう設定しています。
この方法ではAPIを利用しますので、APIキーを設定する必要があります。
3. GitHub SecretsにAPIキーを追加する
- リポジトリのSettingsに移動。
- Secrets and variables -> Actionsに移動。
- New repository secretをクリックし、名前をOPENAI_API_KEYとして、取得したAPIキーを追加。
これで、GitHub ActionsからChatGPT APIを使ってコードレビューが実行されるようになります。
4. プルリクエスト作成時に自動レビューを実行
プルリクエストが作成されると、自動的にGitHub Actionsがトリガーされ、ChatGPTがコードレビューを実行します。
レビュー結果は、プルリクエスト内のチェックとして表示され、修正点や改善点が指摘されます。
GitHubとChatGPTを連携させることで、プルリクエスト時のコードレビューを自動化し、作業の効率を大幅に向上できます。
GitHub Actionsを活用することで、エンジニアが手作業で行うレビューを減らし、統一された基準でのコードチェックが可能になります。
これにより、チーム全体の生産性を高めるとともに、コードの品質も向上できます。
また、今回紹介した方法とは別にGitHub Copilotを使った方法もあるので、気になる方は調べてみてください。
ChatGPTで安全にコードレビューを行うための注意点4選
ChatGPTを使ってコードレビューを行う際には、セキュリティやプライバシーに関する注意が必要です。
特に企業の機密情報や未公開のソースコードを扱う場合、適切な対応をしなければリスクが生じる可能性があります。
ここでは、ChatGPTを使ったコードレビューを安全に行うために押さえておきたい以下の4つの注意点を紹介します。
- セキュリティとプライバシーを考慮する
- 出力結果は必ずしも正しいとは限らない
- 複雑すぎるコードは正しくレビューできない可能性がある
- プログラミング言語によって性能に差が出る場合がある
セキュリティとプライバシーを考慮する
ChatGPTを使ってコードレビューを行う際、特に重要なポイントはセキュリティとプライバシーの確保です。
ChatGPTにコードを送信すると、そのデータは外部サーバーで処理されるため、企業やプロジェクトに関する機密情報が含まれている場合、情報漏えいのリスクが伴います。
このようなリスクを最小限に抑えるために、以下のように適切な対策を講じる必要があります。
1. 機密情報や個人データを含むコードを送信しない
機密性の高いデータや、個人情報が含まれるコードをChatGPTに送信することは避けましょう。
たとえば、APIキー、パスワード、ユーザーの個人情報などが含まれる場合、これらが外部に漏えいする可能性があります。
対策:
- 機密データは送信前にマスク処理を行うか、削除してからレビューを依頼する。
- 必要に応じて、コードの一部のみをレビューさせる、もしくは公開されているコードのみを送信するようにする。
2. OpenAIのデータ利用方針を確認する
ChatGPTは、送信されたデータを利用してモデルの改善を行いますが、企業やプロジェクトのポリシーによっては、このようなデータ利用を許可しない場合があります。
OpenAIは、企業向けにセキュリティが強化されたAPIを提供していますが、不安な場合はAzure OpenAI Serviceを利用することも検討すべきです。
対策:
- Azure OpenAI Serviceの利用を検討する。
- OpenAIのデータ利用方針やプライバシーポリシーをよく確認し、送信するデータやAPIを利用する際のセキュリティ対策を決定する。
3. 内部環境での利用を検討する
外部に情報を送信するのが不安な場合、オープンソースのコードレビューツールや、社内サーバーでホストできるAIソリューションを検討するのも一つの方法です。
これにより、データが社外に出るリスクを回避できます。
対策:
- 社内でホスティング可能なAIツールを利用する。
- オープンソースのソリューションを導入し、社内ネットワークでのみ利用するようにする。
このような対策を取ることで、ChatGPTを安全にコードレビューに活用しながら、機密情報やプライバシーに関するリスクを最小限に抑えられます。
出力結果は必ずしも正しいとは限らない
ChatGPTによるコードレビューは便利ですが、必ずしも正確ではありません。
ChatGPTはコードの全体的な文脈やプロジェクトの設計方針を十分に理解できないことがあるため、提案がプロジェクトの要件に合わない場合があります。
したがって、出力された結果を鵜呑みにせず、最終的な判断は必ず人間が行うべきです。
特に、フレームワークやライブラリに特有の制約や仕様を考慮する必要がある場合、ChatGPTはその技術的背景を十分に理解できないことがあります。
そのため、ChatGPTからの提案を慎重に検討し、他の改善案と比較することが大切です。
また、ChatGPTの提案を導入する前には、必ずテストを行い、コードが期待通りに動作するかを確認することが不可欠です。
ChatGPTによる修正が適切であっても、予期しない問題が発生する可能性があるため、十分なテストを通じてプロジェクトに悪影響を与えないようにする必要があります。
このように、ChatGPTのレビューは参考にしつつ、最終的な判断と確認は人間が行うことで、安全かつ正確なコードレビューを実現できます。
複雑すぎるコードは正しくレビューできない可能性がある
ChatGPTは、一般的なプログラミングパターンには強い一方で、複雑なアルゴリズムや特殊なロジックを含むコードに対しては、正確なレビューや改善提案ができないことがあります。
これは、ChatGPTがプログラムの目的や全体的な設計意図を理解することができず、特定の条件下でしか発生しない問題やケースに対して十分な対応ができないためです。
たとえば、非常に複雑なデータ処理や並列処理を行うコード、または高度なパフォーマンスチューニングが必要なケースでは、ChatGPTは基本的な部分での改善でしか活用できない可能性があります。
こうした場合には、ChatGPTのフィードバックを参考にしつつも、より専門的な知識を持つエンジニアが追加でレビューする必要があります。
実際に複雑なコードを扱う際には、次のような手法が考えられます。
- ChatGPTには部分的なコード、特に問題のある箇所だけを入力し、その部分に絞って改善提案を求める。
- 全体的な設計や大規模なロジックに関しては、ChatGPTに任せず、チーム内でのピアレビューや専門家によるチェックを並行して行う。
このように、ChatGPTによるコードレビューは強力なツールではありますが、複雑なコードについてはその限界を理解し、適切な対応策を講じることが重要です。
プログラミング言語によって性能に差が出る場合がある
ChatGPTはさまざまなプログラミング言語に対応していますが、すべての言語に対して同じ精度でレビューできるわけではありません。
たとえば、PythonやJavaScriptなどの広く使用されている言語には強い傾向がありますが、マイナーな言語や特定の業界でのみ使用される特殊な言語に対しては、精度が落ちる可能性があります。
これにより、特定の言語で書かれたコードのレビューにおいて、ChatGPTの提案が不正確だったり、重要な問題を見落としたりすることがあります。
特に、動的型付けの言語や、独自の構文を持つ言語の場合には、ChatGPTが適切な提案を行えないケースがあります。
また、ライブラリやフレームワークの仕様を熟知しているかどうかも、出力されるフィードバックの精度に影響を与えます。
具体的には、Pythonのような言語ではChatGPTのレビュー結果が比較的信頼できることが多いですが、HaskellやRustのような専門的な言語の場合、誤った出力をする可能性があります。
このようなケースに対処するためには、ChatGPTが得意とする言語では積極的に活用し、対応が難しい言語や技術に関しては、エンジニアによる手動の確認を行うのが効果的です。
こうすることで誤った提案をそのまま受け入れてしまうリスクが減り、品質を確保できます。
ChatGPTでコードレビューを圧倒的に効率化しよう!
ChatGPTを活用することで、コードレビューを圧倒的に効率化し、チーム全体の生産性を大幅に向上させることが可能です。
手作業で時間をかけて行っていたコードレビューを、リアルタイムのフィードバックでスピーディに行い、エラーの早期発見やコードの最適化が簡単に実現できます。
特に大規模なプロジェクトでは、手間のかかるレビュー作業が効率化され、全体の開発スピードが飛躍的に向上します。
自動化されたレビューによって、手動で行うよりも一貫した品質チェックが可能となり、作業が効率化されます。
ただし、ChatGPTによるコードレビューには、いくつかの注意点もあります。
- セキュリティとプライバシー: ChatGPTに送信されたコードは外部のサーバーで処理されるため、機密情報や個人情報が含まれる場合、漏えいのリスクがあります。機密性の高いデータはマスク処理を行うか、レビュー対象から除外することが必要です。
- 出力結果の精度: ChatGPTが提供するフィードバックは必ずしも正確とは限りません。特にプロジェクトの文脈や設計意図をAIが理解できない場合、誤った提案が出ることがあります。最終的な確認は必ず人間が行いましょう。
- 複雑なコードの対応力: ChatGPTは、単純なバグや改善提案には強いですが、複雑なアルゴリズムや特殊なコードに対しては、適切なフィードバックができない場合があります。複雑な箇所はエンジニアによる手動のレビューが必要です。
- プログラミング言語による差異: ChatGPTは広く使われている言語には強いですが、マイナーな言語や特定のフレームワークに対応する際、提案の精度が低下する可能性があります。AIの得意な言語であれば積極的に利用し、不得意な言語では人間による確認を併用しましょう。
これらを理解した上で活用することで、より安全かつ効果的なレビューが実現できます。
ChatGPTは、コードレビューだけでなくあらゆる業務に活用して効率化を図れます。
さらに業務効率を向上させたい方は、ぜひ弊社SHIFT AIで開催している無料のセミナーへのご参加を検討ください。
興味のある方は、以下よりセミナーの詳細を確認して、AI人材への第一歩を踏み出してみませんか。
\ AI人材の一歩目! /