はじめに
複雑な業務ロジックを読むのは大変です。
関数の呼び出し関係を追うだけでも時間がかかります。特に大規模なプロジェクトでは、どこから読めばいいか分からなくなります。
この記事では、コールツリーを使って業務ロジックを理解する方法を紹介します。
AI にプロンプトを投げるだけで、関数の呼び出し関係を視覚化できます。
ポイント: コールツリーを使うと、関数の呼び出し関係が一目で分かります。
コールツリーとは
コールツリーは、関数の呼び出し関係をツリー構造で表現したものです。
例
ユーザー登録機能のロジックフローです。
UserController::register()
└─> UserBusiness::createUser()
├─> UserBusiness::validateUserData() (トランザクション内)
│ ├─> UserService::checkEmailExists() - メールアドレス重複チェック
│ ├─> UserService::validatePassword() - パスワード強度チェック
│ └─> UserService::checkUsernameExists() - ユーザー名重複チェック
├─> UserService::store() - ユーザー登録
│ ├─> User::create() - ユーザーデータ作成
│ ├─> Hash::make() - パスワードハッシュ化
│ └─> UserService::assignDefaultRole() - デフォルトロール付与
│ └─> RoleService::getDefaultRole() - デフォルトロール取得
├─> EmailService::sendWelcomeEmail() - ウェルカムメール送信
│ ├─> EmailTemplateService::getWelcomeTemplate() - テンプレート取得
│ └─> Mail::send() - メール送信
└─> UserBusiness::createUserProfile() - ユーザープロフィール作成
├─> ProfileService::store() - プロフィール登録
└─> ProfileService::setDefaultSettings() - デフォルト設定
このコールツリーを見ると、以下のことが分かります:
- エントリーポイントは
UserController::register() - トランザクション内でバリデーションとユーザー登録が行われる
- ネストされた関数の呼び出し関係が一目で分かる
上記のコールツリーを手動で作成するのは大変ですが、AIを使って簡単に作成することができます。
以下にコールツリーを作成するためのプロンプト例を示します。
プロンプト例
### プロンプト
[機能名]の[処理名]ロジックフローを関数単位でまとめて
**参考形式:**
Controller::method() 内容の解説
└─> Service::method()
├─> Service::method1()
│ └─> Service::method2()
└─> Service::method3()
**出力形式:**
- `.md`形式の`.txt`のコードスニペットで出力する
- 関数名は「クラス名::メソッド名()」形式で記載
- インデントで階層を表現(├─、└─、│を使用)
- 補足情報があれば最後に記載
**調査方法:**
1. エントリーポイント(Controller)を特定
2. 各関数の呼び出し関係を追跡
3. 主要な処理の有無を確認
4. データベース操作(INSERT/UPDATE/DELETE)を確認
**詳細な記載ルール:**
1. **トランザクション処理**
- `DB::transaction()` やトランザクション内の処理は明示的に記載
- 例:`DB::transaction()` の下に処理を階層化
2. **条件分岐**
- 重要な条件分岐(if文、早期リターン)は補足情報に記載
- 条件によって処理が分岐する場合は、条件を明記
- 例:`if (条件) { return; }` → 補足情報に「条件の場合はスキップ」と記載
3. **ループ処理**
- `foreach` や `for` ループ内の処理は、ループの対象を明記
- グルーピング処理(`groupBy`)は補足情報に記載
- 例:`foreach ($groupedDetails as $details)` → 補足情報に「発注先・仕入先・調達区分ごとにグルーピング」と記載
4. **データベース操作**
- INSERT/UPDATE/DELETE操作は補足情報に記載
- 対象テーブル名を明記
- 例:`INSERT: placing_orders テーブル(発注ヘッダ)`
5. **例外処理・エラーハンドリング**
- `try-catch` や例外処理がある場合は補足情報に記載
- エラー時の動作を明記
6. **補足情報の記載項目**
- 主要な処理の説明(各関数の役割)
- データベース操作一覧(INSERT/UPDATE/DELETE)
- 重要な判定条件(内部発注作成の条件、ステータス変更の条件など)
- グルーピング条件(どの項目でグルーピングしているか)
- 注意点・制約事項(数量が0の場合はスキップなど)
**出力例:**
```txt
# [機能名]の[処理名]ロジックフロー
Controller::method()
└─> Business::method()
├─> Service::method1()
│ └─> Service::method2()
└─> Business::method3()
└─> DB::transaction()
├─> Service::store()
└─> Service::update()
## 補足情報
### 主要な処理の説明
1. **Controller::method()**
- エントリーポイントの説明
### データベース操作
- **INSERT**:
- `table_name` テーブル(説明)
- **UPDATE**:
- `table_name` テーブル(説明)
### 重要な判定条件
1. **条件名**:
- 条件の詳細説明
### グルーピング条件
- 項目1、項目2、項目3ごとにグルーピング
まとめ
- コールツリーで関数の呼び出し関係を視覚化できる
- 全体像を把握してから詳細を読むと効率的
- AI プロンプトで簡単にコールツリーを作成できる
- エントリーポイントから順番に追うと理解しやすい
コールツリーを使うことで、複雑な業務ロジックも効率的に読むことができるので、ぜひ使ってみてください!