bake modelコマンドについて、ChatGPTと一緒にコード読んでみた

ChatGPT

株式会社レコチョクのエンジニアをしております西村拓海です。
現在サーバーサイドエンジニアとしてmurketというサービスに携わっております。

はじめに

コードを読むのが億劫なことってないですか…?僕はあります!
つい先日CakePHPの bake modelコマンドを利用する機会があり、内部の実装について
気になるけど、読み始めると時間がかかるし面倒だなと思い、腰が重く、なかなか動けていませんでした。

そんな時思いつきました!ChatGPTに読んでもらえばよくね!?と
そこで今回はChatGPTと一緒に bake modelコマンドの内容についてコードを読みました。
その結果からChatGPTを利用してコード読むことについて、良かった点をお伝えできたらと思います。

目標: CakePHPのbake modelコマンドについて、どのようにしてTableファイルが生成されるか理解する

備考

  • 利用したChatGPTバージョン: 4
  • 対象のCakePHPバージョン: 4.2.4
  • ChatGPTの出力は一部要約・省略しています。

ChatGPTとの会話

1ターン目

まず bake modelコマンドを実行した際の処理の全体像を知るために、以下の質問をしました。

質問

question_first.png

回答

得られた情報

  • bake modelコマンドに関する大枠の処理の流れについて(6つの手順)

2ターン目

bake modelコマンドの大枠の処理についてなんとなく理解できました。
しかしコードを読み進めるための情報が足りなかった為、以下の質問をしました。

質問

question_second.png

回答

得られた情報

  • bake modelコマンドに関する大枠の処理の流れについて
    • 各ファイルの定義位置とその処理内容

イメージ図
bake_model.png

3ターン目

bake modelコマンドに関する大枠の処理は理解できたので、各手順の中身について見ていきます。

質問

question_code.png

回答

得られた情報

  • bin/cake.phpについて
    • コンソールコマンドを実行するためのエントリファイル
    • アプリケーションの設定情報を持って、コマンドを解析するファイルをインスタンス化している

4ターン目

bin/cake.php内で定義されているCommandRunner::run関数にてコマンドを実行することが分かった為、次はその関数について見ていきます。

質問

question_code.png

回答

得られた情報

  • CommandRunner::run関数について
    • 処理2~3にてCakePHPで実行できるコマンドの情報をまとめる
    • 処理6にてまとめたコマンド情報とコマンドライン引数から実行するコマンドを決定・実行する

5ターン目

次にコマンドオブジェクトの取得箇所、CommandRunner::getCommand関数について詳しく見ていきます。

質問

question_code.png

回答

得られた情報

  • getCommand関数について
    • シェルまたはコマンドを取得するための関数
    • 取得したコマンド名を引数にcreateCommand関数を実行し、コマンドオブジェクト(ModelCommand.php)を生成する

6ターン目

getCommand関数内で定義されているcreateCommnad関数内で、ModelCommandがインスタンス化されることが分かりました。なので次にcreateCommand関数を見ていきたい所なのですが、処理を理解する上で必要な箇所は読めた & あまり深追いすると大変なので、createCommand関数は飛ばして、次はbake modelコマンドの核となるModelCommand.phpを見ていきたいと思います。
ここで困ったことに、どのようにModelCommand.phpが呼び出されるのか分からないのでAIに頼ります!

質問

question_sixth.png

回答

得られた情報

  • ModelCommand.phpについて
    • エントリポイントはexecute関数

7ターン目

ModelCommand.phpのエントリポイントはexecute関数だとChatGPTに教えてもらったので、そこからコードを読んでいきます。

質問

question_code.png

回答

得られた情報

  • ModelCommand::execute関数について
    • ModelCommand.phpに関する準備を行う関数
    • bake関数でファイルの生成を行う

8ターン目

次にファイル生成を行うModelCommand::bake関数について見ていきます。

質問

question_code.png

回答

得られた情報

  • ModelCommand::bake関数について
    • モデルに関するファイルを生成をする関数
    • モデルに関する情報の取得し、各ファイルを生成する(テーブル・エンティティ・フィクスチャ・テスト)

9ターン目

ついにファイル生成箇所まで読み進めることができました。今回はTableファイルがどうやって作成されているかを知りたいので、ModelCommandl::bakeTable関数に絞って中身を見ていきます。

質問

question_code.png

回答

得られた情報

  • ModelCommand::bakeTable関数
    • テーブルに関する情報を$dataに追加し、set関数を用いてテンプレートエンジンに渡す
    • テンプレートエンジン(table.twig)に情報を配置し、createFile関数にてファイル生成を行う
    • これにてコード読み終了

ChatGPTと一緒にコードを読んでみて

今回ChatGPTと一緒に bake modelコマンドに関するコードを読みました。所要時間は1時間程度でコードを読むことができました。自分としては短時間で内容を理解することができたのではないかとおもいます。またChatGPTを使ったことで以下3つの良さを感じました。

1. 全体像の把握

「コードを読む上で大まかな流れを把握しておくと理解が深まる」というのはよく言われますが、それは仕様書がある、もしくはまず読んでみないことには全体像を理解できないと思います。その点、ChatGPTはコード読まずして全体像を教えてくれるので、常に全体像を把握しながら効率よくコードを読むことができました。

2. 必要な箇所だけ読める

コードの全てを理解するというのはそれだけの時間を要します。効率的にコードを読むには、そのコードを理解する必要性があるのかを考えて、コードを読む必要があると思います。ChatGPTはその際に便利です。ChatGPTがコードの概要について教えてくれるので、コードを読む必要があるのか取捨選択ができます。例えば5ターン目で出てきたcreateCommand関数はChatGPTの出力結果から読まないという選択ができ、時間短縮に繋がりました。

3. 困りごとの解決

コードの意味・定義場所など聞いたら全て教えてくれます(たまに間違う)。

まとめ

「bake modelコマンドについてChatGPTと一緒にコード読んでみた」でした。ここまで読んでいただきありがとうございました。今回はOSSのコードをChatGPTと一緒に読みましたが、運用しているプロジェクトでも同じようにコードが読めることができたら嬉しいですね。今後もAIを利用して模索してみます。

ChatGPT