DIVX テックブログ

catch-img

AI活用による効率的なコードリファクタリングの手法


目次[非表示]

  1. 1.はじめに
  2. 2.そもそもリファクタリングとは
  3. 3.どこをリファクタリングするべきか
    1. 3.1.Cursorを活用したコード解析
    2. 3.2.リファクタリング課題の全体像を把握する
    3. 3.3.優先度から修正箇所をよりピンポイントに
  4. 4.AIと一緒にリファクタリングを進める
  5. 5.テストとセットで行う
  6. 6.AIで自動コードレビューできるように
    1. 6.1.DIVX GAI
    2. 6.2.AIコードレビューのメリット
    3. 6.3.実際に作成したプロンプト
    4. 6.4.DIVX GAIでレビューしてみる
  7. 7.まとめ
  8. 8.参考文献
  9. 9.お悩みご相談ください

はじめに

こんにちは!divxの大戸と申します!
「プロジェクトコードの技術負債が溜まっており広範囲に渡るリファクタリングが必要」
「一方でプロジェクト内の納期や優先度的にリファクタリングにそんなにリソースは割けない」
そんなお悩みを抱えている方はいらっしゃいませんか。
私自身そのような状況でリファクタリングを検討した経験があるため、今回は、「どうすれば効率的にリファクタリングを実施できるか?」を「AI活用」という観点からご紹介したいと思います。
皆様のプロジェクトにおける業務改善に少しでも役立つ情報となれば幸いです。

そもそもリファクタリングとは

まずは、リファクタリングの定義とメリットを、Martin Fowlerの著書『リファクタリング ――既存のコードを安全に改善する』を参考に整理します。
リファクタリングとは、「外部から見たときの振る舞いを保ちつつ、理解や修正が簡単になるように、ソフトウェアの内部構造を変化させること」です。これにより、次のようなメリットが期待できます。

  • ソフトウェア設計の改善:短期的な目標のためにリファクタリングなしで実装をした場合、コードの内部構造が徐々に劣化してしまいます。設計を良い状態に保つために、リファクタリングは必要です。
  • ソフトウェアを理解しやすくする:リファクタリングを適切に行うことで自分だけでなく将来の開発者がコードを理解するのにかける負担を減らすことができます。
  • バグの発見を助ける:コードが理解しやすくなることで、バグの原因を推論しやすくなります。

どこをリファクタリングするべきか

リファクタリングとは何か及びそのメリットを整理したところで、AIを活用していかにして効率的に実施するかを早速考えていきたいと思います。「はじめに」で述べたような状況の場合、直すべき箇所全てを直すわけにはいかないため、優先的にどこを直すべきかを整理する必要があります。

Cursorを活用したコード解析

Cursorとは、AI機能が標準搭載されたコードエディタです。プロジェクト内のコードについてAIに質問したり修正してもらったりということが簡単にできることが特徴です。
こちらの記事でも紹介しておりますので、是非ご覧ください。

  VSCode vs Cursor〜コーディング環境を制するものはどちらか? | 株式会社divx(ディブエックス) 株式会社divx(ディブエックス)

Cursorには、ディレクトリ全体を読み取ってそこから回答をしてくれる機能があります。今回はこの機能を使って、修正箇所の整理を手伝ってもらおうと思います。

※今回載せるコードやプロンプト等はあくまでサンプルですが、出来るだけ実際に行ったプロセスを再現できるようにしております。サンプルプロジェクトとして、ASP.NET MVCにViewModelパターンを導入したプロジェクトを用意しました。


リファクタリング課題の全体像を把握する

まず、例えば以下のようなざっくりとした質問でプロジェクトを解析させてみます。

@Codebase
このプロジェクトのコードベースを解析して、リファクタリングが必要な箇所を教えてください。
それぞれのポイントに対して、「なぜ問題なのか」「修正案」も教えてください。

出力結果の全てを載せると長くなってしまうので割愛しますが、次の画像のように、問題点を列挙してくれます。画像にある「ViewModelでのデータアクセス」の他にも「Controllerの責務過多」「Viewでのビジネスロジック」など計7個の指摘がありました。


優先度から修正箇所をよりピンポイントに

では、この結果を参考にさっそくリファクタリング……と先に進みたくなりますが、ここで一旦立ち止まってみましょう。 コードベース全体のように、リファクタリングの範囲が広い場合、この提案を全て反映させようとすると、それだけでもかなりの時間がかかってしまいます。
そのため、ここでの出力は「リファクタリング課題の全体像を掴む」という目的に留め、実際に着手すべき改善項目を絞るため、AIへの質問を変えてみます。

@Codebase 
このプロジェクトのコードベースを解析して、リファクタリングが必要な箇所を教えてください。
リファクタリングに割く作業は最小限にしたいので、次の優先事項を元に、優先度の高い順に修正箇所を並べてください。 
優先事項は「実装作業の短縮」「コーディングミスによる修正作業にかかる時間を減らすこと」です。 
それぞれの修正箇所に対して、「なぜ問題なのか」「なぜその優先度なのか」「修正案」も具体的に教えてください。

ここでのポイントは、プロジェクトの優先事項を一緒に伝えることです。私が経験したプロジェクトでは「機能追加の実装時間を短縮したい」「テスト時の修正時間を短縮したい」のように、とにかくスピード上げるためのリファクタリングが必要でした。そのため、上記の質問でも「実装時間の短縮」「コーディングミスによる修正作業にかかる時間を減らすこと」を優先事項として伝えたり、作業数を減らしたい旨を明確に伝えています。
この質問を伝えたところ、次の画像のように、「View内のビジネスロジックの混在」「Modelの責務の不明確さ」という2点のみに絞って回答してくれました。また、「修正の発生しやすさ」や「小さな修正で大きな効果が得られるか」のような視点から説明してくれています。

これにより、優先的にどこを直すべきか、よりピンポイントな提案を得ることができます。
繰り返しになりますが、ここでのポイントはプロジェクトの優先事項を一緒に伝えることです。ここに関しては、AIにコードだけを通して判断させることは難しいため、開発チーム・顧客とのコミュニケーションの中で整理することが重要です。また、AIからの提案をどこまで採用するかについても、同様にコミュニケーションの中で決めていくべきでしょう。

AIと一緒にリファクタリングを進める

リファクタリングの対象箇所が明確になったところで、実際に修正を進めていきます。
ここでもAIを活用することで、具体的なコードの改善提案や修正方法を効率よく得ることが可能です。簡単に実践例をご紹介します。
先ほど修正箇所の提案をしてもらったチャットに、続けて以下のように指示をすることでより具体的な修正をしてもらいます。

実際にリファクタリングを行っていこうと思います。
提案通り、ビュー内のビジネスロジック混在から解決したいです。

すると、画像のように説明と共に修正コードを提案してくれます。Cursorでは「Apply」ボタンを押すだけで提案内容をそのままコードに反映させることができます。


テストとセットで行う

最初の方で整理したように、リファクタリングのポイントは「外部から見た振る舞いは保つ」というところにあります。AIの提案内容が必ずしも正しい変更であるとも限らないため、「内部構造のみを変更できているか」について、細かい動作確認や単体テストなどで確認することが重要です。

今回は単体テストで確認してみましょう。以下のようなテストによってViewModelの表示ロジックの入出力をチェックします。単体テストがそもそも無い場合も、同様にAIに指示することで大枠を作成することが可能です。

using Xunit;
using MyMvcApp.ViewModel;

namespace MyMvcApp.Tests
{
    public class ProductViewModelTests
    {
        [Theory]
        [InlineData(9999, "¥9,999(送料別)")]
        [InlineData(10000, "¥10,000(送料別)")]
        [InlineData(10001, "¥10,001(送料無料)")]
        public void GetFormattedPrice_ReturnsCorrectFormat(decimal price, string expected)
        {
            // Arrange
            var viewModel = new ProductViewModel { Price = price, Name = "テスト商品" };

            // Act
            var result = viewModel.GetFormattedPrice();

            // Assert
            Assert.Equal(expected, result);
        }
    }
} 

実際にテストを実行し、入出力に問題が発生していないことを確認します。

このように、テストを通すことで、ViewModelとViewのロジックが適切に分離されつつ、期待する動作が保持されていることが確認できました。この分離により、各要素が独立して機能し、将来的な仕様変更にも柔軟に対応できるようになります。

AIで自動コードレビューできるように

さて、プロジェクトにおけるリファクタリングの優先事項を整理する中で、今後のコーディングやレビューでも気を付けたい項目がチーム内で整理されることもあると思います。
せっかくなので、ここで整理された内容をAIにプロンプトとして提供し、自動的にコードレビューをしてもらえるようにしてみましょう。ここでは、DIVX GAIというツールを活用してみます。

DIVX GAI

DIVX GAIとは、弊社が開発した法人向けのChatGPTのサービスです。AIの学習に使用されないセキュアな環境でChatGPTを利用できるため、開発で使用するコードのAIレビューも安心して行うことができます。
詳しくはこちらをご覧ください。

  DIVX GAI DIVX GAIは、法人向けのChatGPTのサービスです。 ChatGPTは、法人でも利用できます。しかし、そのままでは入力内容がAIの学習データとして再利用され、思わぬところで情報が流出するリスクがあります。 DIVX GAIは、AIの学習に使用されないセキュアな環境でChatGPTを利用でき、業務の生産性を向上させるのに役立ちます。 株式会社divx(ディブエックス)

AIコードレビューのメリット

AIを活用したコードレビューには、例えば次のようなメリットがあります。

  • 一貫した視点でのレビュー:AIは特定の基準やルールに基づいてコードを評価するため、開発者ごとに異なる主観が入り込みにくく、一定の品質を維持しやすくなります。
  • 時間短縮:AIによるコードレビューは自動化されているため、レビューにかかる時間の削減が期待できます。

実際に作成したプロンプト

最後に、実際に作成したレビュー用プロンプトを紹介します。どんなプロンプトが適切かはチームやプロジェクトの状況によって異なるので、あくまでも一例としてご紹介します。

# コードレビュープロンプト

あなたは上級ソフトウェアエンジニアとして、以下の観点でコードレビューを行ってください。

## 重点レビュー項目

### 1. 拡張性の向上
以下の観点で、コードの拡張性を評価し、改善案を提示してください:

a) 責務の分離
- ビジネスロジックの適切な配置
- データアクセスの分離
- 表示ロジックの分離

b) 共通処理の抽出可能性
- 重複コードの有無
- 汎用的な処理の抽出余地

c) 依存性の分離
- DIの適切な使用
- インターフェースの活用
- 具象クラスへの直接依存の有無

### 2. バグ発生リスクの低減
以下の観点で、コーディングミスを防ぐための改善案を提示してください:

a) 型安全性
- 暗黙的な型変換の有無
- Nullチェックの適切な実装
- 型の明示的な指定

b) エラーハンドリング
- 例外処理の一貫性
- エラー状態の適切な伝播
- ログ出力の適切性

c) 副作用の制御
- トランザクション管理の一貫性
- 外部サービス呼び出しの適切な配置
- 状態変更の追跡容易性

# 期待する出力形式

各問題点について以下の形式で指摘してください:

1. 問題の概要
2. なぜ問題なのか(拡張性またはバグリスクの観点で)
3. 具体的な改善案(コードの提示)
4. 改善による期待効果

## 制約事項
- 拡張性の向上とバグリスクの低減に焦点を当ててください

今回のプロンプトでは、リファクタリングの際にも優先事項として挙げた「実装作業の短縮」「コーディングミスの削減」を達成させることに特化させています。「一般的に直した方が良いと言われているが案件特有の理由でこの書き方になっている」パターンもあるため、そこを破壊せずに修正することが目的です。

DIVX GAIでレビューしてみる

DIVX GAIにはプロンプトを設定する機能もあるため、ここに先程のプロンプトを設定しつつ、今回はプロジェクトコード内のControllerを読み込ませて問題点を洗い出してもらいました。

レビュー結果を見ると、例えば、ビジネスロジックの適切な配置や型安全性について、実装可能な形で指摘されているのが分かります。このように、AIを活用することで、人の目だけでは難しい常に一貫した視点での効率的なレビューが実施できます。

まとめ

リファクタリングはソフトウェア開発において重要なプロセスですが、リソースや時間の制約から十分に取り組めない場合もあります。そこで、AIを活用することで、効率的かつ効果的にリファクタリングを進めるアプローチは有効です。本記事で紹介したAIの活用について、主なポイントをまとめます。

  • 優先事項の明確化:AIによるコードベース解析で、優先度の高いリファクタリング箇所を特定し、限られた時間で効果的な改善を実現できます。「プロジェクト内の優先事項」を伝えることでよりプロジェクト状況に沿った提案を得られます。
  • 具体的なリファクタリングの支援:AIが具体的なコード改善案を提供することで、実装作業を効率化できます。ここでは外部から見た振る舞いを保つように修正することが重要です。
  • 自動コードレビューの活用:AIによる自動コードレビューを導入することで、品質を保ちながら開発スピードを向上できます。

また、今回は必要最小限な箇所に絞ってリファクタリング・AIレビューを行うという内容でしたが、技術負債の放置が好ましくないということは変わりません。長期的な視点としては、今回の修正を最初のステップとして、段階を追いながらさらなるリファクタリングを進めていくことが大事だと考えます。
ぜひ、皆さんのプロジェクトでもAIを活用したリファクタリングを試してみてください。

参考文献

Martin Fowler著, 『リファクタリング ――既存のコードを安全に改善する』(ISBN: 978-4274224547)
Cursor公式サイト:https://www.cursor.com/

お悩みご相談ください


  ご相談フォーム | 株式会社divx(ディブエックス) DIVXのご相談フォームページです。 株式会社divx(ディブエックス)



お気軽にご相談ください


ご不明な点はお気軽に
お問い合わせください

サービス資料や
お役立ち資料はこちら

DIVXブログ

テックブログ タグ一覧

人気記事ランキング

関連記事

GoTopイメージ