操作
リファクタ #456
完了skin property: Factory の id/name 解決を汎用 PropertyRegistry に共通化する(Phase 2)
リファクタ #456:
skin property: Factory の id/name 解決を汎用 PropertyRegistry に共通化する(Phase 2)
説明
#176 の整理方針に基づく Phase 2。Phase 1(二重経路の単一化)後に着手する。
背景¶
id→property / name→property の解決が Factory ごとに別実装されており、ロジックが重複している:
-
FloatPropertyFactory/StringPropertyFactory:enum 走査の薄い lookup。 -
IntegerPropertyFactory/BooleanPropertyFactory:enum 走査 + キャッシュ配列 + 反転(-id)処理 をそれぞれ再実装。
name/id の探索戦略(線形走査 / StringType.get マップ / キャッシュ配列)がバラつき、name/id ドリフトのリスクもある。
対応内容¶
- id ・ name 探索、キャッシュ、反転(Boolean の -id)といった反復ボイラープレートを、型ごとにパラメータ化した汎用
PropertyRegistry<T>(仮名)へ抽出し、各 Factory から利用する。 - 算術範囲ハンドラ(LR2 連番 id 規約)はそのまま保持し、registry との合わせ方を整理する。
確認観点¶
- Phase 0 のテスト(registry / ゴールデン / Mapper)を green に保つ。
- キャッシュの同一性保証(
assertSame)や反転振る舞いを崩さない。 - パフォーマンス(ホットパスのキャッシュヒット)を損なわない。
エージェント ちゃん さんが8日前に更新
- 関連している リファクタ #176: skin property 定義群の肥大化を整理する方針を作る を追加
エージェント ちゃん さんが8日前に更新
- 期日 を 2026/06/30 にセット
- 開始日 を 2026/06/28 から 2026/06/30 に変更
- 次のチケットに後続 リファクタ #454: skin property: id→property の二重経路(switch vs enum)を単一化する(Phase 1) を追加
エージェント ちゃん さんが8日前に更新
- 次のチケットに先行 リファクタ #457: skin property: SkinProperty の id 定数をカテゴリ別に整理する(Phase 3) を追加
エージェント ちゃん さんが8日前に更新
- ステータス を 未着手 から 実装中 に変更
- 進捗率 を 0 から 10 に変更
実装に着手しました。
- ブランチ:
feature/456 - 対応方針: id/name 探索・キャッシュ・反転の反復処理を型パラメータ化した汎用
PropertyRegistry<T>に抽出し、Float/String/Integer/Boolean の各 Factory から利用する(評価順・キャッシュ同一性・反転振る舞いは verbatim 維持、算術範囲ハンドラは保持)。
エージェント ちゃん さんが8日前に更新
- ステータス を 実装中 から 完了 に変更
- 進捗率 を 10 から 100 に変更
実装完了・MR マージ済み。
- MR: !130(
feature/456→develop、merge commit1ad49668)
対応内容¶
skin property の各 Factory に散在していた「id/name 探索・キャッシュ・反転(-id)」の反復ボイラープレートを、型パラメータ化した汎用 PropertyRegistry<T> に集約(#176 整理方針 Phase 2、#454 完了後の着手)。観測可能な振る舞いは完全 verbatim 維持の純内部リファクタ。
変更点¶
- 新規
PropertyRegistry<T>: IntMap(id)+HashMap(name) で first-wins/エイリアスid展開/null値保持を統一、任意の配列キャッシュ(ID_LENGTH=65536・非nullのみ)、任意のabsキー反転モード(pos/neg別キャッシュ)、順序付きリゾルバチェーン(範囲ハンドラ/サブFactory/fallbackをenum表とfirst-matchで合成) -
FloatPropertyFactory: rate/float/writer 3レジストリ化、Float→Rate フォールスルー・重複id first-wins・null writer 保持 -
StringPropertyFactory: registry 化(StringType.get/VALUES/ID_MAPを移管・削除) -
IntegerPropertyFactory: value[LaneDuration, TotalNotes, 算術範囲, ValueType, fallback]/image-index[judge範囲, skinSelect, IndexType](ともにキャッシュ有)、fallback テーブルを id-only レジストリへ移行 -
BooleanPropertyFactory:[BooleanType, COURSE_STAGE, fallback]+ pos/neg キャッシュ + -id 反転。IntegerPropertyCacheを registry に畳み込み削除 - 評価順・キャッシュ同一性(assertSame)・反転・enum フィールド名・public シグネチャは不変
テスト¶
-
.\gradlew.bat test全スイート BUILD SUCCESSFUL(回帰なし) - Phase 0 既存テスト群すべて green、新規
PropertyRegistryTest(byName/byId・エイリアス・first-wins・null値・キャッシュ同一性・反転・範囲外null)追加
操作