Newer
Older
TIASShot / docs / 03_PLAN / PLAN_01_リファクタリング計画.md

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

方針 (Policy)

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

現状の問題点 (Current Issues)

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

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

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

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

フェーズ構成 (Phases)

フェーズ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 で統一する.
  • ファイルの中身は変更しない.

テスト

  • ビルドが成功することを確認する.
  • アプリが起動し,カメラが接続されることを確認する(手動).

フェーズ2: 色補正処理の分離

作業内容

  • ColorCorrection/ フォルダを作成する.
  • CameraBase から以下を新クラス ColorCorrector に切り出す.
    • フィールド: TCC_SRGB, TCC_XYZ, ChannelList, ExtendChannels
    • メソッド: ExtendMat, CalcConvertMatrix, ConvertColor, ConvertImage
    • メソッド: CalcTcc(チャート RGB 値の受け取りと行列計算・保存を担当)
  • CameraBase は ColorCorrector を保持し,処理を委譲する.
  • UpdateRate はゲイン/ホワイトバランス補正(GetRatio)専用で色補正とは別関心事のため,CameraBase に残す(当初案から変更).

テスト

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

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

作業内容

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

テスト

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

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

作業内容

  • CameraBase から以下をユーティリティクラスとして切り出す(配置先は Utils/IoUtil).
    • LoadMatFromCsv, SaveMatToCsv
    • SetSaveFolder, WriteInfo
    • EventSound
  • SetSaveFolder/WriteInfo/SetInfo_saveFolder/_ShotInfo(派生クラスと共有する状態)に結合するため,純粋ロジックのみ IoUtil へ移し,CameraBase 側は薄いラッパーとして残した(当初案から変更).

テスト

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

フェーズ5: 派生カメラクラスの重複処理の集約(当初案に追加)

動機

  • フェーズ1〜4 完了後も,IScamLucam にプレビュー/校正フロー(白パッチ計測・ゲイン更新・CalcTcc・チャート検出)と撮影ループ(CSV 書き込み・タイミング制御)のほぼ同一コードが重複して残っていた.

作業内容

  • 重複していた共通骨格を CameraBase にテンプレートメソッドとして集約する.
    • プレビュー/校正フロー → CameraBase の共通メソッド+カメラ固有部を抽象メソッド化
    • 撮影ループ → CameraBase の共通メソッド+撮影前後処理・フレーム取得を抽象メソッド化
  • カメラ固有部(ゲイン/ホワイトバランス反映,撮影情報の記録,フレーム取得,撮影前後処理)は抽象メソッドで派生クラスに残す.
  • IScam の撮影前後処理(Sink 切替・最初のフレーム捨て)は Lucam と実行順序が異なるため,共通骨格に取り込まず派生クラス側に残した(順序維持を優先).

テスト

  • ビルドが 0 エラー 0 警告で成功することを確認する.
  • 校正・1 枚撮影・連続撮影の一連の動作を実機で確認する(ハードウェア依存パスのため自動テスト不可).

共通ルール (Common Rules)

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