Skip to content

Latest commit

 

History

History
647 lines (482 loc) · 19.4 KB

File metadata and controls

647 lines (482 loc) · 19.4 KB

アーキテクチャ

OpenFitterUnityUIのシステムアーキテクチャとデザインパターンについて説明します。

概要

OpenFitterは**Model-View-Presenter (MVP)**アーキテクチャパターンを採用しています。このパターンにより、UIロジックとビジネスロジックが明確に分離され、テストしやすく保守しやすいコードベースを実現しています。

MVPアーキテクチャ

Model(モデル)

データとビジネスロジックを表現します。

主要なモデルクラス:

  • OpenFitterState - ウィザード全体の状態を管理
  • ConfigInfo - フィッティング設定情報
  • BlendShapeEntry - ブレンドシェイプのエントリ情報
  • SetupResult - セットアップタスクの結果

モデルは以下の責務を持ちます:

  • アプリケーションの状態を保持
  • データの検証
  • ビジネスルールの実装

View(ビュー)

ユーザーインターフェースを表現し、ユーザー入力を受け取ります。

主要なビューインターフェース:

  • IRootView - ルートウィンドウのインターフェース
  • IWizardView - ウィザードのメインインターフェース
  • ISourceSelectionStepView - ソース選択ステップのビュー
  • ITargetSelectionStepView - ターゲット選択ステップのビュー
  • IEnvironmentSetupStepView - 環境セットアップステップのビュー
  • IBlendShapeStepView - ブレンドシェイプ設定ステップのビュー
  • IExecutionStepView - 実行ステップのビュー
  • ICompletionStepView - 完了ステップのビュー

ビューの実装:

  • UIToolkitを使用してビューを実装
  • .uxmlファイルでUIレイアウトを定義
  • .ussファイル(必要に応じて)でスタイルを定義

ビューの責務:

  • UIの表示と更新
  • ユーザー入力の受付
  • プレゼンターへのイベント通知

Presenter(プレゼンター)

ビューとモデルの間を仲介し、UIロジックを管理します。

主要なプレゼンタークラス:

  • OpenFitterRootPresenter - ルートウィンドウのプレゼンター
  • OpenFitterWizardPresenter - ウィザード全体のコーディネーター
  • SourceSelectionStepPresenter - ソース選択ステップのプレゼンター
  • TargetSelectionStepPresenter - ターゲット選択ステップのプレゼンター
  • EnvironmentSetupStepPresenter - 環境セットアップステップのプレゼンター
  • BlendShapeStepPresenter - ブレンドシェイプ設定ステップのプレゼンター
  • ExecutionStepPresenter - 実行ステップのプレゼンター
  • CompletionStepPresenter - 完了ステップのプレゼンター

プレゼンターの責務:

  • ユーザー入力の処理
  • モデルの更新
  • ビューの更新指示
  • ビジネスロジックの調整

レイヤー構造

┌─────────────────────────────────────┐
│          UI Layer (Views)            │
│  - UIToolkit components              │
│  - .uxml layout files                │
└──────────────┬──────────────────────┘
               │
               ▼
┌─────────────────────────────────────┐
│     Presentation Layer (Presenters) │
│  - UI logic                          │
│  - User interaction handling         │
└──────────────┬──────────────────────┘
               │
               ▼
┌─────────────────────────────────────┐
│      Business Layer (Services)       │
│  - FittingService                    │
│  - EnvironmentService                │
│  - SetupCoordinator                  │
└──────────────┬──────────────────────┘
               │
               ▼
┌─────────────────────────────────────┐
│      Data Layer (Models)             │
│  - State management                  │
│  - Configuration                     │
└─────────────────────────────────────┘

サービス層

ビジネスロジックを実装する主要なサービスクラス:

FittingService

フィッティングプロセス全体を調整します。

主要な機能:

  • フィッティングの実行管理
  • 進捗状況の監視
  • エラーハンドリング

使用する戦略パターン:

  • IFittingStrategy - フィッティング戦略のインターフェース
    • ContinuousFittingStrategy - 連続フィッティング戦略
    • SingleStepFittingStrategy - シングルステップフィッティング戦略

OpenFitterEnvironmentService

Blenderと依存関係の環境セットアップを管理します。

主要な機能:

  • 環境の検証
  • 必要なコンポーネントのインストール状態確認
  • セットアップタスクの調整

OpenFitterSetupCoordinator

インストールタスクを調整し、セットアップワークフローを管理します。

主要な機能:

  • タスクの並列実行
  • 依存関係の解決
  • 進捗レポート

データフロー

1. ユーザー入力フロー

User Input → View → Presenter → Model → Service
                ↓                          ↓
            UI Update ←──────────────── Result

2. フィッティング実行フロー

ExecutionStepPresenter
    ↓
FittingService
    ↓
OpenFitterFittingRunner
    ↓
OpenFitterCommandBuilder
    ↓
OpenFitterCommandRunner
    ↓
Blender (External Process)
    ↓
FittingProgressParser
    ↓
Progress Updates → ExecutionStepView

3. 環境セットアップフロー

EnvironmentSetupStepPresenter
    ↓
OpenFitterSetupCoordinator
    ↓
OpenFitterEnvironmentService
    ↓
┌────────────────┬─────────────────┬──────────────────┐
│                │                 │                  │
BlenderDownloader│BlenderAddonDownloader│OpenFitterCoreDownloader
│                │                 │                  │
BlenderInstaller │BlenderAddonInstaller │OpenFitterCoreInstaller
└────────────────┴─────────────────┴──────────────────┘
    ↓
SetupResult → EnvironmentSetupStepView

デザインパターン

1. Strategy Pattern(戦略パターン)

フィッティング戦略の切り替えに使用:

public interface IFittingStrategy
{
    Task<bool> ExecuteFittingAsync(/* parameters */);
}

public class ContinuousFittingStrategy : IFittingStrategy { }
public class SingleStepFittingStrategy : IFittingStrategy { }

2. Repository Pattern(リポジトリパターン)

設定の永続化に使用:

public interface IOpenFitterConfigRepository
{
    ConfigInfo LoadConfig();
    void SaveConfig(ConfigInfo config);
}

3. Observer Pattern(オブザーバーパターン)

ビューとプレゼンター間のイベント通知に使用:

// View
public event Action OnNextButtonClicked;

// Presenter
view.OnNextButtonClicked += HandleNextButtonClicked;

4. Dependency Injection(依存性注入)

サービスとプレゼンター間の疎結合を実現:

public class ExecutionStepPresenter
{
    private readonly IFittingService fittingService;

    public ExecutionStepPresenter(IFittingService fittingService)
    {
        this.fittingService = fittingService;
    }
}

ステート管理

OpenFitterState

アプリケーション全体の状態を一元管理:

public class OpenFitterState
{
    public OpenFitterWizardStepEnum CurrentStep { get; set; }
    public ConfigInfo Config { get; set; }
    public List<BlendShapeEntry> BlendShapeEntries { get; set; }
    // ... その他の状態
}

状態の変更は常にプレゼンターを通じて行われ、ビューは状態を直接変更しません。

エラーハンドリング

エラーの伝播

Service Layer (Exception thrown)
    ↓
Presenter Layer (Catch and handle)
    ↓
View Layer (Display error to user)

エラーハンドリングのベストプラクティス

  1. サービス層: 詳細なエラー情報を含む例外をスロー
  2. プレゼンター層: 例外をキャッチし、ユーザーフレンドリーなメッセージに変換
  3. ビュー層: エラーメッセージを適切にユーザーに表示

拡張性

新しいウィザードステップの追加

  1. IStepViewインターフェースを実装したビューを作成
  2. .uxmlファイルでUIレイアウトを定義
  3. WizardStepPresenterBaseを継承したプレゼンターを作成
  4. OpenFitterWizardStepEnumに新しいステップを追加
  5. OpenFitterWizardPresenterにステップのナビゲーションロジックを追加

新しいフィッティング戦略の追加

  1. IFittingStrategyインターフェースを実装
  2. 戦略固有のロジックを実装
  3. FittingServiceで新しい戦略を選択可能にする

テスタビリティ

MVPアーキテクチャにより、以下のテストが容易になります:

ユニットテスト

  • プレゼンター: モックビューとモックサービスを使用してテスト
  • サービス: ビジネスロジックを独立してテスト
  • モデル: データ検証ロジックをテスト

インテグレーションテスト

  • プレゼンターとサービスの統合をテスト
  • エンドツーエンドのワークフローをテスト

まとめ

OpenFitterUnityUIのアーキテクチャは以下の原則に基づいています:

  • 関心の分離: UI、ビジネスロジック、データが明確に分離
  • 疎結合: インターフェースを使用して依存関係を最小化
  • テスタビリティ: 各コンポーネントが独立してテスト可能
  • 拡張性: 新しい機能を容易に追加可能
  • 保守性: コードが読みやすく、理解しやすい

English

Architecture

This document explains the system architecture and design patterns of OpenFitter.

Overview

OpenFitter adopts the Model-View-Presenter (MVP) architectural pattern. This pattern provides clear separation between UI logic and business logic, resulting in a testable and maintainable codebase.

MVP Architecture

Model

Represents data and business logic.

Key Model Classes:

  • OpenFitterState - Manages overall wizard state
  • ConfigInfo - Fitting configuration information
  • BlendShapeEntry - Blendshape entry information
  • SetupResult - Setup task results

Model responsibilities:

  • Hold application state
  • Data validation
  • Implement business rules

View

Represents the user interface and receives user input.

Key View Interfaces:

  • IRootView - Root window interface
  • IWizardView - Main wizard interface
  • ISourceSelectionStepView - Source selection step view
  • ITargetSelectionStepView - Target selection step view
  • IEnvironmentSetupStepView - Environment setup step view
  • IBlendShapeStepView - Blendshape configuration step view
  • IExecutionStepView - Execution step view
  • ICompletionStepView - Completion step view

View Implementation:

  • Implement views using UIToolkit
  • Define UI layout in .uxml files
  • Define styles in .uss files (as needed)

View responsibilities:

  • Display and update UI
  • Accept user input
  • Notify presenter of events

Presenter

Mediates between view and model, managing UI logic.

Key Presenter Classes:

  • OpenFitterRootPresenter - Root window presenter
  • OpenFitterWizardPresenter - Overall wizard coordinator
  • SourceSelectionStepPresenter - Source selection step presenter
  • TargetSelectionStepPresenter - Target selection step presenter
  • EnvironmentSetupStepPresenter - Environment setup step presenter
  • BlendShapeStepPresenter - Blendshape configuration step presenter
  • ExecutionStepPresenter - Execution step presenter
  • CompletionStepPresenter - Completion step presenter

Presenter responsibilities:

  • Process user input
  • Update model
  • Instruct view updates
  • Coordinate business logic

Layer Structure

┌─────────────────────────────────────┐
│          UI Layer (Views)            │
│  - UIToolkit components              │
│  - .uxml layout files                │
└──────────────┬──────────────────────┘
               │
               ▼
┌─────────────────────────────────────┐
│     Presentation Layer (Presenters) │
│  - UI logic                          │
│  - User interaction handling         │
└──────────────┬──────────────────────┘
               │
               ▼
┌─────────────────────────────────────┐
│      Business Layer (Services)       │
│  - FittingService                    │
│  - EnvironmentService                │
│  - SetupCoordinator                  │
└──────────────┬──────────────────────┘
               │
               ▼
┌─────────────────────────────────────┐
│      Data Layer (Models)             │
│  - State management                  │
│  - Configuration                     │
└─────────────────────────────────────┘

Service Layer

Key service classes implementing business logic:

FittingService

Orchestrates the entire fitting process.

Key Features:

  • Manage fitting execution
  • Monitor progress
  • Error handling

Strategy Pattern Usage:

  • IFittingStrategy - Fitting strategy interface
    • ContinuousFittingStrategy - Continuous fitting strategy
    • SingleStepFittingStrategy - Single-step fitting strategy

OpenFitterEnvironmentService

Manages environment setup for Blender and dependencies.

Key Features:

  • Environment validation
  • Check installation status of required components
  • Coordinate setup tasks

OpenFitterSetupCoordinator

Coordinates installation tasks and manages setup workflow.

Key Features:

  • Parallel task execution
  • Dependency resolution
  • Progress reporting

Data Flow

1. User Input Flow

User Input → View → Presenter → Model → Service
                ↓                          ↓
            UI Update ←──────────────── Result

2. Fitting Execution Flow

ExecutionStepPresenter
    ↓
FittingService
    ↓
OpenFitterFittingRunner
    ↓
OpenFitterCommandBuilder
    ↓
OpenFitterCommandRunner
    ↓
Blender (External Process)
    ↓
FittingProgressParser
    ↓
Progress Updates → ExecutionStepView

3. Environment Setup Flow

EnvironmentSetupStepPresenter
    ↓
OpenFitterSetupCoordinator
    ↓
OpenFitterEnvironmentService
    ↓
┌────────────────┬─────────────────┬──────────────────┐
│                │                 │                  │
BlenderDownloader│BlenderAddonDownloader│OpenFitterCoreDownloader
│                │                 │                  │
BlenderInstaller │BlenderAddonInstaller │OpenFitterCoreInstaller
└────────────────┴─────────────────┴──────────────────┘
    ↓
SetupResult → EnvironmentSetupStepView

Design Patterns

1. Strategy Pattern

Used for switching fitting strategies:

public interface IFittingStrategy
{
    Task<bool> ExecuteFittingAsync(/* parameters */);
}

public class ContinuousFittingStrategy : IFittingStrategy { }
public class SingleStepFittingStrategy : IFittingStrategy { }

2. Repository Pattern

Used for configuration persistence:

public interface IOpenFitterConfigRepository
{
    ConfigInfo LoadConfig();
    void SaveConfig(ConfigInfo config);
}

3. Observer Pattern

Used for event notification between view and presenter:

// View
public event Action OnNextButtonClicked;

// Presenter
view.OnNextButtonClicked += HandleNextButtonClicked;

4. Dependency Injection

Achieves loose coupling between services and presenters:

public class ExecutionStepPresenter
{
    private readonly IFittingService fittingService;

    public ExecutionStepPresenter(IFittingService fittingService)
    {
        this.fittingService = fittingService;
    }
}

State Management

OpenFitterState

Centrally manages application-wide state:

public class OpenFitterState
{
    public OpenFitterWizardStepEnum CurrentStep { get; set; }
    public ConfigInfo Config { get; set; }
    public List<BlendShapeEntry> BlendShapeEntries { get; set; }
    // ... other state
}

State changes are always made through presenters; views never modify state directly.

Error Handling

Error Propagation

Service Layer (Exception thrown)
    ↓
Presenter Layer (Catch and handle)
    ↓
View Layer (Display error to user)

Error Handling Best Practices

  1. Service Layer: Throw exceptions with detailed error information
  2. Presenter Layer: Catch exceptions and convert to user-friendly messages
  3. View Layer: Appropriately display error messages to user

Extensibility

Adding a New Wizard Step

  1. Create a view implementing the IStepView interface
  2. Define UI layout in .uxml file
  3. Create a presenter inheriting from WizardStepPresenterBase
  4. Add new step to OpenFitterWizardStepEnum
  5. Add step navigation logic to OpenFitterWizardPresenter

Adding a New Fitting Strategy

  1. Implement the IFittingStrategy interface
  2. Implement strategy-specific logic
  3. Make new strategy selectable in FittingService

Testability

The MVP architecture facilitates the following tests:

Unit Tests

  • Presenters: Test using mock views and mock services
  • Services: Test business logic independently
  • Models: Test data validation logic

Integration Tests

  • Test integration of presenters and services
  • Test end-to-end workflows

Summary

OpenFitter's architecture is based on the following principles:

  • Separation of Concerns: Clear separation of UI, business logic, and data
  • Loose Coupling: Minimize dependencies using interfaces
  • Testability: Each component can be tested independently
  • Extensibility: New features can be easily added
  • Maintainability: Code is readable and understandable