alpha-bbb / alter-ego

0 stars 0 forks source link

フォルダー構成およびアーキテクチャーの構成設計 #8

Open You-keitou opened 1 day ago

You-keitou commented 1 day ago
root/
├── packages/
│   ├── shared/                    # 共有パッケージ
│   │   ├── types/                 # 共有の型定義
│   │   │   ├── entities/          # ドメインエンティティの型
│   │   │   └── dto/              # DTOの型定義
│   │   └── utils/                 # 共有ユーティリティ
│   │
│   ├── bot/                       # LINE Botアプリケーション
│   │   ├── src/
│   │   │   ├── domain/           # ドメイン層
│   │   │   │   ├── entities/     # ドメインエンティティ
│   │   │   │   ├── repositories/ # リポジトリインターフェース
│   │   │   │   └── services/     # ドメインサービス
│   │   │   │
│   │   │   ├── application/      # アプリケーション層
│   │   │   │   ├── usecases/     # ユースケース
│   │   │   │   ├── dto/         # DTOの定義
│   │   │   │   └── services/     # アプリケーションサービス
│   │   │   │
│   │   │   ├── infrastructure/   # インフラストラクチャ層
│   │   │   │   ├── line/        # LINE SDK実装
│   │   │   │   ├── llm/         # LLMサービス実装
│   │   │   │   ├── database/    # データベース実装
│   │   │   │   └── repositories/ # リポジトリ実装
│   │   │   │
│   │   │   └── interfaces/       # インターフェース層
│   │   │       ├── controllers/  # コントローラー
│   │   │       ├── middlewares/  # ミドルウェア
│   │   │       └── validators/   # バリデーター
│   │   │
│   │   ├── tests/                # テストファイル
│   │   │   ├── unit/            # ユニットテスト
│   │   │   ├── integration/     # 統合テスト
│   │   │   └── e2e/             # E2Eテスト
│   │   │
│   │   └── config/              # 設定ファイル
│   │
│   └── liff/                     # LIFFアプリケーション
│       ├── src/
│       │   ├── domain/          # ドメイン層
│       │   │   ├── entities/    # ドメインエンティティ
│       │   │   └── services/    # ドメインサービス
│       │   │
│       │   ├── application/     # アプリケーション層
│       │   │   ├── usecases/    # ユースケース
│       │   │   └── services/    # アプリケーションサービス
│       │   │
│       │   ├── infrastructure/  # インフラストラクチャ層
│       │   │   ├── line/       # LINE LIFF SDK実装
│       │   │   ├── api/        # APIクライアント
│       │   │   └── storage/    # ストレージ実装
│       │   │
│       │   └── presentation/    # プレゼンテーション層
│       │       ├── components/  # Reactコンポーネント
│       │       │   ├── pages/   # ページコンポーネント
│       │       │   ├── features/ # 機能別コンポーネント
│       │       │   └── shared/  # 共有コンポーネント
│       │       ├── hooks/       # カスタムフック
│       │       ├── stores/      # 状態管理
│       │       └── styles/      # スタイル定義
│       │
│       ├── tests/              # テストファイル
│       │   ├── unit/          # ユニットテスト
│       │   ├── integration/   # 統合テスト
│       │   └── e2e/           # E2Eテスト
│       │
│       └── config/            # 設定ファイル
│
├── tools/                     # ビルドツール、スクリプトなど
├── .github/                   # GitHub Actions設定
├── package.json              # ルートpackage.json
└── tsconfig.json            # ルートTypeScript設定

重要なポイント:

1. 共有パッケージ(shared)

2. Botアプリケーション(bot)

3. LIFFアプリケーション(liff)

4. アーキテクチャの特徴

  1. 依存関係の方向:

    • 外層から内層への依存(domain ← application ← infrastructure/presentation)
    • 依存性逆転の原則に従う
  2. 責務の分離:

    • 各レイヤーが明確な役割を持つ
    • テスタビリティの向上
  3. スケーラビリティ:

    • 機能追加が容易
    • コードの再利用性が高い

5. 実装例(botパッケージの場合):


// domain/entities/ChatHistory.ts
export class ChatHistory {
  constructor(
    private readonly id: string,
    private readonly messages: Message[],
    private readonly metadata: ChatMetadata
  ) {}

  analyze(): AnalysisResult {
    // ビジネスロジック
  }
}

// application/usecases/AnalyzeChatHistory.ts
export class AnalyzeChatHistoryUseCase {
  constructor(
    private chatRepository: ChatHistoryRepository,
    private llmService: LLMService
  ) {}

  async execute(chatId: string): Promise<AnalysisResult> {
    const history = await this.chatRepository.findById(chatId);
    const analysis = history.analyze();
    return this.llmService.processAnalysis(analysis);
  }
}

// infrastructure/llm/DifyLLMService.ts
export class DifyLLMService implements LLMService {
  async processAnalysis(analysis: AnalysisResult): Promise<LLMResponse> {
    //