AI活用による効率的なコードリファクタリングの手法
目次[非表示]
- 1.はじめに
- 2.そもそもリファクタリングとは
- 3.どこをリファクタリングするべきか
- 3.1.Cursorを活用したコード解析
- 3.2.リファクタリング課題の全体像を把握する
- 3.3.優先度から修正箇所をよりピンポイントに
- 4.AIと一緒にリファクタリングを進める
- 5.テストとセットで行う
- 6.AIで自動コードレビューできるように
- 6.1.DIVX GAI
- 6.2.AIコードレビューのメリット
- 6.3.実際に作成したプロンプト
- 6.4.DIVX GAIでレビューしてみる
- 7.まとめ
- 8.参考文献
- 9.お悩みご相談ください
はじめに
こんにちは!divxの大戸と申します!
「プロジェクトコードの技術負債が溜まっており広範囲に渡るリファクタリングが必要」
「一方でプロジェクト内の納期や優先度的にリファクタリングにそんなにリソースは割けない」
そんなお悩みを抱えている方はいらっしゃいませんか。
私自身そのような状況でリファクタリングを検討した経験があるため、今回は、「どうすれば効率的にリファクタリングを実施できるか?」を「AI活用」という観点からご紹介したいと思います。
皆様のプロジェクトにおける業務改善に少しでも役立つ情報となれば幸いです。
そもそもリファクタリングとは
まずは、リファクタリングの定義とメリットを、Martin Fowlerの著書『リファクタリング ――既存のコードを安全に改善する』を参考に整理します。
リファクタリングとは、「外部から見たときの振る舞いを保ちつつ、理解や修正が簡単になるように、ソフトウェアの内部構造を変化させること」です。これにより、次のようなメリットが期待できます。
- ソフトウェア設計の改善:短期的な目標のためにリファクタリングなしで実装をした場合、コードの内部構造が徐々に劣化してしまいます。設計を良い状態に保つために、リファクタリングは必要です。
- ソフトウェアを理解しやすくする:リファクタリングを適切に行うことで自分だけでなく将来の開発者がコードを理解するのにかける負担を減らすことができます。
- バグの発見を助ける:コードが理解しやすくなることで、バグの原因を推論しやすくなります。
どこをリファクタリングするべきか
リファクタリングとは何か及びそのメリットを整理したところで、AIを活用していかにして効率的に実施するかを早速考えていきたいと思います。「はじめに」で述べたような状況の場合、直すべき箇所全てを直すわけにはいかないため、優先的にどこを直すべきかを整理する必要があります。
Cursorを活用したコード解析
Cursorとは、AI機能が標準搭載されたコードエディタです。プロジェクト内のコードについてAIに質問したり修正してもらったりということが簡単にできることが特徴です。
こちらの記事でも紹介しておりますので、是非ご覧ください。
Cursorには、ディレクトリ全体を読み取ってそこから回答をしてくれる機能があります。今回はこの機能を使って、修正箇所の整理を手伝ってもらおうと思います。
※今回載せるコードやプロンプト等はあくまでサンプルですが、出来るだけ実際に行ったプロセスを再現できるようにしております。サンプルプロジェクトとして、ASP.NET MVCにViewModelパターンを導入したプロジェクトを用意しました。
リファクタリング課題の全体像を把握する
まず、例えば以下のようなざっくりとした質問でプロジェクトを解析させてみます。
出力結果の全てを載せると長くなってしまうので割愛しますが、次の画像のように、問題点を列挙してくれます。画像にある「ViewModelでのデータアクセス」の他にも「Controllerの責務過多」「Viewでのビジネスロジック」など計7個の指摘がありました。
優先度から修正箇所をよりピンポイントに
では、この結果を参考にさっそくリファクタリング……と先に進みたくなりますが、ここで一旦立ち止まってみましょう。 コードベース全体のように、リファクタリングの範囲が広い場合、この提案を全て反映させようとすると、それだけでもかなりの時間がかかってしまいます。
そのため、ここでの出力は「リファクタリング課題の全体像を掴む」という目的に留め、実際に着手すべき改善項目を絞るため、AIへの質問を変えてみます。
ここでのポイントは、プロジェクトの優先事項を一緒に伝えることです。私が経験したプロジェクトでは「機能追加の実装時間を短縮したい」「テスト時の修正時間を短縮したい」のように、とにかくスピード上げるためのリファクタリングが必要でした。そのため、上記の質問でも「実装時間の短縮」「コーディングミスによる修正作業にかかる時間を減らすこと」を優先事項として伝えたり、作業数を減らしたい旨を明確に伝えています。
この質問を伝えたところ、次の画像のように、「View内のビジネスロジックの混在」「Modelの責務の不明確さ」という2点のみに絞って回答してくれました。また、「修正の発生しやすさ」や「小さな修正で大きな効果が得られるか」のような視点から説明してくれています。
これにより、優先的にどこを直すべきか、よりピンポイントな提案を得ることができます。
繰り返しになりますが、ここでのポイントはプロジェクトの優先事項を一緒に伝えることです。ここに関しては、AIにコードだけを通して判断させることは難しいため、開発チーム・顧客とのコミュニケーションの中で整理することが重要です。また、AIからの提案をどこまで採用するかについても、同様にコミュニケーションの中で決めていくべきでしょう。
AIと一緒にリファクタリングを進める
リファクタリングの対象箇所が明確になったところで、実際に修正を進めていきます。
ここでもAIを活用することで、具体的なコードの改善提案や修正方法を効率よく得ることが可能です。簡単に実践例をご紹介します。
先ほど修正箇所の提案をしてもらったチャットに、続けて以下のように指示をすることでより具体的な修正をしてもらいます。
すると、画像のように説明と共に修正コードを提案してくれます。Cursorでは「Apply」ボタンを押すだけで提案内容をそのままコードに反映させることができます。
テストとセットで行う
最初の方で整理したように、リファクタリングのポイントは「外部から見た振る舞いは保つ」というところにあります。AIの提案内容が必ずしも正しい変更であるとも限らないため、「内部構造のみを変更できているか」について、細かい動作確認や単体テストなどで確認することが重要です。
今回は単体テストで確認してみましょう。以下のようなテストによってViewModelの表示ロジックの入出力をチェックします。単体テストがそもそも無い場合も、同様にAIに指示することで大枠を作成することが可能です。
実際にテストを実行し、入出力に問題が発生していないことを確認します。
このように、テストを通すことで、ViewModelとViewのロジックが適切に分離されつつ、期待する動作が保持されていることが確認できました。この分離により、各要素が独立して機能し、将来的な仕様変更にも柔軟に対応できるようになります。
AIで自動コードレビューできるように
さて、プロジェクトにおけるリファクタリングの優先事項を整理する中で、今後のコーディングやレビューでも気を付けたい項目がチーム内で整理されることもあると思います。
せっかくなので、ここで整理された内容をAIにプロンプトとして提供し、自動的にコードレビューをしてもらえるようにしてみましょう。ここでは、DIVX GAIというツールを活用してみます。
DIVX GAI
DIVX GAIとは、弊社が開発した法人向けのChatGPTのサービスです。AIの学習に使用されないセキュアな環境でChatGPTを利用できるため、開発で使用するコードのAIレビューも安心して行うことができます。
詳しくはこちらをご覧ください。
AIコードレビューのメリット
AIを活用したコードレビューには、例えば次のようなメリットがあります。
- 一貫した視点でのレビュー:AIは特定の基準やルールに基づいてコードを評価するため、開発者ごとに異なる主観が入り込みにくく、一定の品質を維持しやすくなります。
- 時間短縮:AIによるコードレビューは自動化されているため、レビューにかかる時間の削減が期待できます。
実際に作成したプロンプト
最後に、実際に作成したレビュー用プロンプトを紹介します。どんなプロンプトが適切かはチームやプロジェクトの状況によって異なるので、あくまでも一例としてご紹介します。
今回のプロンプトでは、リファクタリングの際にも優先事項として挙げた「実装作業の短縮」「コーディングミスの削減」を達成させることに特化させています。「一般的に直した方が良いと言われているが案件特有の理由でこの書き方になっている」パターンもあるため、そこを破壊せずに修正することが目的です。
DIVX GAIでレビューしてみる
DIVX GAIにはプロンプトを設定する機能もあるため、ここに先程のプロンプトを設定しつつ、今回はプロジェクトコード内のControllerを読み込ませて問題点を洗い出してもらいました。
レビュー結果を見ると、例えば、ビジネスロジックの適切な配置や型安全性について、実装可能な形で指摘されているのが分かります。このように、AIを活用することで、人の目だけでは難しい常に一貫した視点での効率的なレビューが実施できます。
まとめ
リファクタリングはソフトウェア開発において重要なプロセスですが、リソースや時間の制約から十分に取り組めない場合もあります。そこで、AIを活用することで、効率的かつ効果的にリファクタリングを進めるアプローチは有効です。本記事で紹介したAIの活用について、主なポイントをまとめます。
- 優先事項の明確化:AIによるコードベース解析で、優先度の高いリファクタリング箇所を特定し、限られた時間で効果的な改善を実現できます。「プロジェクト内の優先事項」を伝えることでよりプロジェクト状況に沿った提案を得られます。
- 具体的なリファクタリングの支援:AIが具体的なコード改善案を提供することで、実装作業を効率化できます。ここでは外部から見た振る舞いを保つように修正することが重要です。
- 自動コードレビューの活用:AIによる自動コードレビューを導入することで、品質を保ちながら開発スピードを向上できます。
また、今回は必要最小限な箇所に絞ってリファクタリング・AIレビューを行うという内容でしたが、技術負債の放置が好ましくないということは変わりません。長期的な視点としては、今回の修正を最初のステップとして、段階を追いながらさらなるリファクタリングを進めていくことが大事だと考えます。
ぜひ、皆さんのプロジェクトでもAIを活用したリファクタリングを試してみてください。
参考文献
Martin Fowler著, 『リファクタリング ――既存のコードを安全に改善する』(ISBN: 978-4274224547)
Cursor公式サイト:https://www.cursor.com/