32
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ChatGPT (Model: GPT-4) でコードリファクタリングをやってみる

Last updated at Posted at 2023-03-16

みなさま、ChatGPT (Model: GPT-4) は利用されているでしょうか。私は早速遊んでますが、単純にとても楽しいです。OK Google や Hey Siri のような単調の返しではなく、何処となく人間っぽい文章を返してくるのが非常に楽しいです。

さて、エンジニアとしては、ChatGPT がソースコードが書けるのか、リファクタリングができるのかが気になるということで、試してみました。リファクタリングにちょうどいい具合のソースコードはないかと探したところ、弊社の iOS エンジニアコードチェック課題がありました。早速試してみましょう。

表示の区別のため、ChatGPTの出力結果は引用で表示します。また実際にはソースコードも出力されましたが、今回は省略します。

ChatGPT によるリファクタリング

ViewController.swift を渡して、ソースコードの問題点を次のように指摘してもらいました。

  1. 変数名の命名規則:
    • 変数名はわかりやすく、意味のある名前にすることが推奨されます。例えば、SchBrsearchBarに変更し、repo repositoriesに変更することをお勧めします。
  2. エラーハンドリング:
    • try!を使用すると、エラーが発生した場合にクラッシュが発生します。代わりに、try?またはdo-catchを使用してエラーを適切に処理することが推奨されます。
  3. グローバル変数の使用:
    • word, url, idxなどのグローバル変数を使用する代わりに、関数間で必要な情報を渡す方法を検討してください。例えば、performSegueを使用する際にsenderパラメーターを使って情報を渡すことができます。
  4. コードの整理:
    • APIリクエストを行う部分を別の関数または専用のクラスに分割することで、コードの構造と可読性を向上させることができます。
  5. セルの再利用:
    • UITableViewCell()の代わりに、tableView.dequeueReusableCell(withIdentifier:for:)を使用してセルを再利することで、パフォーマンスを向上させることができます。
  6. 不要なコメントの削除:
    • コードの意図が明確であれば、不要なコメントは削除してコードをシンプルに保ちます。

次に ViewController2.swift を渡しました。

  1. 変数名の命名規則:
    • 変数名はわかりやすく、意味のある名前にすることが推奨されます。例えば、ImgViewimageViewに変更し、TtlLbltitleLabelに変更することをお勧めします。
  2. ViewController間のデータの受け渡し:
    • ViewController2ViewController1のインスタンス(vc1)を参照してデータを取得するのではなく、ViewController1から必要なデータを渡すようにして、ViewController2が独立して動作できるようにすることが推奨されます。
  3. エラーハンドリング:
    • UIImage(data: data!)!で強制アンラップを使用するのではなく、オプショナルバインディングを使用して適切にエラーを処理することが推奨されます。

グローバル変数の指摘は誤りのように見えますが、他は的確に指摘しています。命名規則は Swift API Design Guidelines で推奨されてますし、責務分けやエラーハンドリングが指摘されています。何が問題なのか認識されて、素直にすごいです。また、TtlLbltitleLabel に変更するところで、その Ttl を title と認識したのは逆に怖さも感じました。

アーキテクチャの適用

試しに、アーキテクチャについて聞きました。ViewController.swift を MVVM で書き直してください。

MVVMアーキテクチャに従って、ViewController.swiftを書き直すには、RepositoryモデルとRepositoryListViewModelという名前のViewModelが必要です。以下にその概要を示します。

  1. Repositoryモデル:

    • リポジトリに関する情報を表現するモデルです。例えば、fullName, language, stargazersCount, watchersCount, forksCount, openIssuesCount, avatarUrlなどのプロパティを持つことができます。
  2. RepositoryListViewModel:

    • Repositoryモデルに関するビジネスロジックを処理するViewModelです。このViewModelは、APIからデータを取得し、リポジトリのリストを表示するために使用されます。また、テーブルビューのデータソースとして機能するためのメソッドも実装します。
  3. これらの変更により、ViewControllerの責任が軽減され、テストや保守が容易になります。また、ビジネスロジックがViewModelに集約れているため、アプリケーション全体の構造が改善されます。

すごい…、自然言語処理の進歩すごい。アーキテクチャの適用もできるとは、素直に素晴らしいです。この一文「ViewControllerの責任が軽減され、テストや保守が容易になります」がとてもいいです。そして次に、ViewModelのテストコードを作成してと依頼したところ、まずテストがしやすいように DI(依存性の注入) に拡張して、テストコードを書いていくと人間さながらの流れでした。

まとめ

ChatGPTはすごく強力ですが、まだ人間側でこういう開発やリファクタリングをしたいという知識を持ってハンドリングする必要があると思いました。まだエンジニア失業は免れそうです。コーティングの壁打ちや自身でのコードレビューに利用すると、非常に強力なツール、いや相棒になるのではないでしょうか。

さいごに

弊社の iOS 入社課題における ChatGPT の取り扱いについてです。エンジニアは公式ドキュメントだけでなく、QiitaなどのWeb検索も利用して開発しているので、その選択肢に ChatGPT が入ってくると考えています。実際の業務開発ではまだまだライセンス云々で不安なところはありますが、それを除いたシーンではよいのでは?と思いました。まるまる ChatGPT にやってもらうと困りますが、理解したうえで一部の利用ならば問題なさそうです。ChatGPT を利用した場合は「利用した」と申告をお願いします。また、ChatGPTとのやりとりも分かると嬉しいです。

32
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?