1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

複雑な業務ロジックを読むのは大変です。

関数の呼び出し関係を追うだけでも時間がかかります。特に大規模なプロジェクトでは、どこから読めばいいか分からなくなります。

この記事では、コールツリーを使って業務ロジックを理解する方法を紹介します。

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 プロンプトで簡単にコールツリーを作成できる
  • エントリーポイントから順番に追うと理解しやすい

コールツリーを使うことで、複雑な業務ロジックも効率的に読むことができるので、ぜひ使ってみてください!

参考:複雑な業務ロジックを読むコツ:26,000 ファイル超のプロジェクトで実践している方法

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?