# リファクタリング計画 (Refactoring Plan)

## 0. 方針 (Policy)

- 処理の変更は一切行わない．構造の整理のみを目的とする．
- 各フェーズ完了後に必ずテストを実施し，動作が変わっていないことを確認してから次へ進む．
- テストの具体的な手順は `TEST_01_テスト仕様.md` を参照する．

## 1. 現状の問題点 (Current Issues)

`CameraBase.cs` に以下の責務が集中している．

- カメラ制御の抽象定義（Connect/Disconnect/Shot）
- チャート検出（ArUco マーカー検出，ホモグラフィ計算，マスク生成）
- 色補正処理（TCC行列計算，多項式拡張，画像変換）
- ファイル I/O（CSV読み書き，保存フォルダ生成，撮影情報出力）
- サウンド再生

## 2. 目標とするディレクトリ構成 (Target Structure)

```
TIASshot/
├── Cameras/            ← カメラ制御（CameraBase, IScam, Lucam）
├── ChartDetection/     ← チャート検出（CameraBaseから分離）
├── ColorCorrection/    ← 色補正・TCC計算（CameraBaseから分離）
├── UI/                 ← フォーム（Form1, PreviewMonitor）
├── Config.cs           ← 設定ファイル読み込み（変更なし）
├── LightSource.cs      ← 光源制御（変更なし）
└── Program.cs          ← エントリポイント（変更なし）
```

## 3. フェーズ構成 (Phases)

### 3-1. フェーズ1: フォルダ整理とファイル移動

**作業内容**

- 以下のフォルダを作成し，既存ファイルを移動する．
  - `Cameras/` ← CameraBase.cs, IScam.cs, Lucam.cs
  - `UI/` ← Form1.cs, Form1.Designer.cs, Form1.resx, PreviewMonitor.cs, PreviewMonitor.Designer.cs, PreviewMonitor.resx
- 名前空間（namespace）はそのまま `TIASshot` で統一する．
- ファイルの中身は変更しない．

**テスト**

- ビルドが成功することを確認する．
- アプリが起動し，カメラが接続されることを確認する（手動）．

### 3-2. フェーズ2: 色補正処理の分離

**作業内容**

- `ColorCorrection/` フォルダを作成する．
- CameraBase から以下を新クラス `ColorCorrector` に切り出す．
  - フィールド: `TCC_SRGB`, `TCC_XYZ`, `ChannelList`, `ExtendChannels`, `UpdateRate`
  - メソッド: `ExtendMat`, `CalcConvertMatrix`, `ConvertColor`, `ConvertImage`
  - メソッド: `CalcTcc`（チャート RGB 値の受け取りと行列計算・保存を担当）
- CameraBase は `ColorCorrector` を保持し，処理を委譲する．

**テスト**

- ビルドが成功することを確認する．
- 回帰テスト: 同一入力画像から算出した変換行列が，リファクタリング前と一致することを確認する．
  - 具体的な手順は `TEST_01_テスト仕様.md` の「2. 回帰テスト」を参照する．

### 3-3. フェーズ3: チャート検出処理の分離

**作業内容**

- `ChartDetection/` フォルダを作成する．
- CameraBase から以下を新クラス `ChartDetector` に切り出す．
  - フィールド: `ARDict`, `PointsDst40`, `PointsDst41`, `_detectionCount`, `_lastPosition`
  - メソッド: `DetectChart`
  - 出力: チャートマスクリスト（`List<Mat>`）を戻り値または引数で渡す
- CameraBase は `ChartDetector` を保持し，処理を委譲する．

**テスト**

- ビルドが成功することを確認する．
- 回帰テスト: 保存済みの実画像を入力として，チャートマスクの位置が一致することを確認する．
  - 具体的な手順は `TEST_01_テスト仕様.md` の「3. チャート検出テスト」を参照する．

### 3-4. フェーズ4: ファイル I/O・サウンドの分離

**作業内容**

- CameraBase から以下をユーティリティクラスとして切り出す（配置先は `Cameras/` または新フォルダ）．
  - `LoadMatFromCsv`, `SaveMatToCsv`
  - `SetSaveFolder`, `WriteInfo`
  - `EventSound`

**テスト**

- ビルドが成功することを確認する．
- 撮影からファイル保存までの一連の動作を手動で確認する．
- 保存された CSV・画像の内容がリファクタリング前と一致することを確認する．

## 4. 共通ルール (Common Rules)

- 各フェーズは独立したブランチではなく，`refactor/code-cleanup` ブランチ上で順に進める．
- フェーズ完了ごとにコミットする．コミットメッセージは `[clean]` タグを使用する．
  - 例: `[clean] 色補正処理を ColorCorrector クラスに分離`
- テストが通らない場合は，次のフェーズに進まない．
