ChatGPTにコードレビューしてみてもらった
皆さんこんにちは!ダイサンデジタル事業部です。
本日は、ChatGPTにソースコードを提示し、レビューと修正をしてもらおうと思います。
試そうと思ったきっかけ
人力でコードレビューを行うと、かなり工数がかかりますよね。今日はそんなコードレビューをChatGPTにお願いできたら、
工数が削減できる
いつでもコードレビューをお願いできる
レビュー品質の揺れを少なくできる
などなど、メリットが大きいのではと思ったのが本記事作成のきっかけです。早速試していきましょう!
GPTにレビューを依頼する内容
取り込むソースコード
①一番シンプルな実装
def FizzBuzz(value):
if value % 15 == 0:
print("FizzBuzz")
elif value % 3 == 0:
print("Fizz")
elif value % 5 == 0:
print("Buzz")
②条件分岐がネストしている実装
def FizzBuzz(value):
if value % 3 == 0:
if value % 5 == 0:
print("FizzBuzz")
else:
print("Fizz")
elif value % 5 == 0:
print("Buzz")
③Boolを使って一行で書く
def FizzBuzz(value):
print('Fizz'*(not value % 3) + 'Buzz'*(not value % 5) or "")
コードレビューのプロンプト
結果
①一番シンプルな実装の場合
可読性
ポジティブ点
関数名FizzBuzzは、一般的なプログラミング問題で使用される慣習的な名前を採用しており、その機能を適切に表しています。
条件式がクリアであり、理解しやすい。
改善点
関数名の大文字使用: Pythonでは、関数名は通常、小文字のスネークケース(snake_case)で記述されることが推奨されます。例えば、fizz_buzzとする方がPythonの標準的なスタイルガイド(PEP 8)に準拠します。
引数や関数のドキュメンテーション: 引数や関数の目的を説明するドキュメントコメントが欠けています。これを追加することで、他の開発者がコードを理解しやすくなります。
複雑性
ポジティブ点
条件分岐がシンプルで、無駄なネストがありません。elifを使用しており、効率的な判断が行われています。
改善点
出力の一貫性: 特定の条件に該当しない場合、何も出力されないため、ユーザーが入力した値が3の倍数でも5の倍数でもない場合には何も表示されません。これは予期しない振る舞いかもしれません。可能であれば、この点を明確にするか、何かしらの出力を提供することが望ましいです。
修正案
以下は、上記の改善点を取り入れた修正後のコードです。
def fizz_buzz(value):
"""
Print "Fizz" if the value is a multiple of 3, "Buzz" if it's a multiple of 5,
and "FizzBuzz" if it's a multiple of 15. Prints the number itself if it does
not meet any of these conditions.
"""
if value % 15 == 0:
print("FizzBuzz")
elif value % 3 == 0:
print("Fizz")
elif value % 5 == 0:
print("Buzz")
else:
print(value)
②条件分岐がネストしている実装
可読性
ポジティブ点
一般的なFizzBuzz問題の要件に沿っています。ifとelifを使った基本的な条件分岐で、各条件が何を意味するかが明確です。
改善点
関数名の大文字使用: 以前のレビューと同様、Pythonでは関数名には小文字のスネークケースが推奨されます(例: fizz_buzz)。
内部のネスト: このコードは無駄なネストを含んでいます。15の倍数を判定するために、5と3の両方で割り切れるかを個別に確認していますが、これは効率的ではありません。このネストを除去し、コードの効率を向上させることができます。
複雑性
ポジティブ点
基本的なフローは簡潔で直接的です。
改善点
ネストの削減: value % 15 == 0と直接判断することで、ネストを減らし、読みやすく、効率的なコードにすることができます。この方法では、15の倍数であることを最初に確認し、次に3の倍数、最後に5の倍数という順序でチェックすることが一般的です。
修正案
以下は、改善点を取り入れた修正後のコードです。
def fizz_buzz(value):
"""
Print "Fizz" if the value is a multiple of 3, "Buzz" if it's a multiple of 5,
and "FizzBuzz" if it's a multiple of 15. If none of these conditions are met,
no output will be produced.
"""
if value % 15 == 0:
print("FizzBuzz")
elif value % 3 == 0:
print("Fizz")
elif value % 5 == 0:
print("Buzz")
③一行で処理を実装した場合
可読性
ポジティブ点
この実装は非常にコンパクトで、一行でFizzBuzzのロジックを処理しています。これにより、行数が削減され、簡潔さが増します。
改善点
コードの直感性: このコードは非常に短く効率的ですが、特に新しいまたは未経験のプログラマーにとっては直感的ではないかもしれません。not value % 3やnot value % 5という式は、初見では理解しづらい可能性があります。これらの式がどのように機能するかを短く説明するコメントを追加することが有効です。
関数名: Pythonでは関数名には小文字のスネークケースを使用することが一般的です。
複雑性
ポジティブ点
非常に簡潔な実装であり、不要な変数やネストが全くありません。これにより、実行時のオーバーヘッドが少なくなります。
改善点
保守性: このコードの保守性は低いかもしれません。理由は、そのコンパクトさがかえって理解を難しくしているからです。特にコードのこの部分がバグを含む場合、デバッグが困難になる可能性があります。
修正案
以下は、改善点を取り入れた修正後のコードです。
def fizz_buzz(value):
"""
Print "Fizz" if the value is a multiple of 3, "Buzz" if it's a multiple of 5,
and "FizzBuzz" if it's a multiple of both 3 and 5. If none of these conditions
are met, print the value itself.
"""
# Using expressions to determine the output directly
fizz = 'Fizz' * (value % 3 == 0)
buzz = 'Buzz' * (value % 5 == 0)
print(fizz + buzz or value)
おわりに
ここまで読んでくださりありがとうございました!
今回は簡単なプログラムで試しましたが、かなり精度高く問題点の指摘と修正プログラムを提示してくれました。
プログラミング学習中の方は、いろんな問題を解いた後にレビューをしてもらうことで今までの何倍もの速さで成長できるかもしれませんね!
この記事が気に入ったらサポートをしてみませんか?