Skip to content

[リファクタリング] MigrationExportHtmlPageTrait / MigrationExportNc3PageTrait をサービスクラスへ段階移行します #2378

@gakigaki

Description

@gakigaki

概要

MigrationExportHtmlPageTrait と MigrationExportNc3PageTrait の取り込み処理を、サービスクラスへ段階移行します。
目的は、テスト容易性の改善(自作テストダブル削減)と責務分離です。
本 issue では、PR1(Service 新設 + Trait 互換ラッパー化)と PR2(呼び出し元の切り替え)までを対象にします。

背景と目的

  • Html / Nc3 の trait は、HTTP / Storage / DOM / ファイルI/O をまとめて持っており、責務が大きいです。
  • テスト時に trait ホスト用の自作テストダブルが必要になっており、保守コストが高くなっています。
  • 将来的な HTTP 抽象化や Mock 利用の前段として、まず Service 化で構造を整理したいです。
  • 既存機能を壊さないため、段階移行で進めます。

対象範囲(この issue の範囲)

  • MigrationExportHtmlPageTrait
  • MigrationExportNc3PageTrait
  • PR1 と PR2 まで
  • UI/画面仕様の変更なし
  • 出力ファイル形式(frame_.html, frame_.ini)の変更なし

実装計画

PR1: Service 新設 + Trait 互換ラッパー化(挙動同等)

  1. app/Services/Migration/MigrationExportHtmlPageService.php を新規作成します。
  2. app/Services/Migration/MigrationExportNc3PageService.php を新規作成します。
  3. MigrationExportHtmlPageTrait の処理本体を Html Service に移します(コピーベースで挙動同等を優先します)。
  4. MigrationExportNc3PageTrait の処理本体を Nc3 Service に移します(コピーベースで挙動同等を優先します)。
  5. MigrationExportHtmlPageTrait::migrationHtmlPage() を Service 委譲の薄いラッパーに変更します。
  6. MigrationExportNc3PageTrait::migrationNC3Page() を Service 委譲の薄いラッパーに変更します。
  7. 各 trait に Service 取得用メソッド(例: migrationExportHtmlPageService(), migrationExportNc3PageService())を追加します。
  8. 挙動テストの主軸を Service 側へ移し始めます。
  9. Trait 側のテストは「Service 委譲確認」中心へ縮小します。

PR2: 呼び出し元を Service 直呼びへ切り替え

  1. PageManage の HTML 取り込み呼び出しを Trait 呼び出しから Html Service 直呼びに変更します。
  2. PageManage の NC3 取り込み呼び出しを Trait 呼び出しから Nc3 Service 直呼びに変更します。
  3. ExportNc3PageFromHttp コマンドの呼び出しを Trait 呼び出しから Nc3 Service 直呼びに変更します。
  4. PageManage から MigrationExportHtmlPageTrait / MigrationExportNc3PageTrait の use を外します。
  5. ExportNc3PageFromHttp から MigrationExportNc3PageTrait の use を外します。
  6. 呼び出し元変更後も挙動が変わらないことを確認します。
  7. Trait 自体はこの PR では削除しません(後続で扱います)。

この issue でやらないこと(PR2までの非対象)

  • MigrationExportHtmlPageTrait / MigrationExportNc3PageTrait の削除
  • HTTP 依存のインターフェース化(Gateway 化)
  • Html / Nc3 の内部ロジック統合や大規模再設計
  • 未使用コードの整理(古いコールバックや残存プロパティの掃除)
  • 挙動変更を伴うリファクタリング

補足(HTTP 依存のインターフェース化 / Gateway 化)

HTTP処理をServiceから直接呼ばず、Gatewayインターフェース経由で注入し、実装詳細を隠して差し替え可能にすることで、テストのモック化と変更影響の局所化をしやすくする設計です。

  • 本 issue では非対象です(PR3 以降の別PRで実施想定です)。

テスト方針

PR1

  • Service 側に既存の主要挙動テストを移します(Html / Nc3 ともに)。
  • Trait 側テストは「Service を呼ぶこと」の確認に絞ります。
  • Storage::fake() は継続利用します。
  • 既存テストの意図は維持します。

PR2

  • PageManage 経由の Html / Nc3 取り込みが従来通り動作することを確認します。
  • ExportNc3PageFromHttp コマンド経由の NC3 取り込みが従来通り動作することを確認します。
  • 呼び出し元切り替えによる回帰がないことを確認します。

受け入れ条件

  • PR1/PR2 ともに Html / Nc3 の取り込み挙動が変わらないこと
  • PR1 時点で既存呼び出し元を壊さないこと(Trait 互換を維持すること)
  • PR2 時点で PageManage と ExportNc3PageFromHttp が Service 直呼びへ切り替わっていること
  • 出力ファイルの保存先・ファイル名・内容フォーマットが同等であること
  • テストコードの可読性が改善されること
  • php -l が通ること
  • PHPUnit 対象テストが通ること

想定リスク

  • コピーベース移設時に挙動差分が混入する可能性があります。
  • PR1 と PR2 の間で一時的に実装が二重化して見える可能性があります。
  • テスト移行途中はテストコードが一時的に重複する可能性があります。
  • Nc3 側は Html より処理が重く、移設差分が大きくなる可能性があります。

備考

  • 本 issue は PR2 までを対象とし、trait 削除や HTTP 抽象化は別 issue / 別 PR で扱います。
  • PR1/PR2 は挙動変更を避け、構造整理を優先します。
  • 実装順は Html を先行し、その後 Nc3 を同じ方針で適用する想定です。

Metadata

Metadata

Assignees

Labels

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions