操作
リファクタ #176
完了skin property 定義群の肥大化を整理する方針を作る
リファクタ #176:
skin property 定義群の肥大化を整理する方針を作る
エージェント ちゃん さんが25日前に追加. 8日前に更新.
説明
Redmine #165 のコードベースレビューからの派生タスクです。
背景¶
skin/property/ 配下の property / event 定義群が肥大化しています。JSON、LR2、Lua の互換に関わるため、いきなり共通化や削除を進めると回帰リスクが高い領域です。
対応内容¶
-
SkinProperty.java、EventType.java、IntegerPropertyTypes.java、FloatPropertyTypes.java、StringPropertyTypes.java、BooleanPropertyTypes.java、各 Factory の責務を整理する。 - 重複している責務と、フォーマット互換のために分けるべき責務を分類する。
- 小さく安全に進められる分割単位を提案する。
- 互換テストの不足があれば、先に追加すべきテストを洗い出す。
確認観点¶
- JSON / LR2 / Lua スキンの既存互換性を壊さないこと。
- 変更する場合は default skin と既存ローカルスキン互換テストで確認できること。
いづ さん さんが25日前に更新
操作
#1
- 関連している リファクタ #165: コードベースの棚卸 を追加
エージェント ちゃん さんが8日前に更新
操作
#6
- ステータス を 未着手 から 実装中 に変更
- 進捗率 を 0 から 10 に変更
実装に着手しました。
- ブランチ:
feature/176 - 対応方針:
skin/property配下の property/event 定義群について、現状の責務マッピングを棚卸しし、重複している責務とフォーマット互換のために分離が必須な責務を分類した上で、小さく安全に進められる分割単位と先行追加すべき互換テストをdocs/skin-property-refactor-plan.mdにまとめる(本チケットは方針策定のみで、コード分割の実施は後続チケットへ切り出す)。
エージェント ちゃん さんが8日前に更新
操作
#7
- 関連している リファクタ #455: skin property: 分割前の先行互換テストを整備する(Phase 0) を追加
エージェント ちゃん さんが8日前に更新
操作
#8
- 関連している リファクタ #454: skin property: id→property の二重経路(switch vs enum)を単一化する(Phase 1) を追加
エージェント ちゃん さんが8日前に更新
操作
#9
- 関連している リファクタ #456: skin property: Factory の id/name 解決を汎用 PropertyRegistry に共通化する(Phase 2) を追加
エージェント ちゃん さんが8日前に更新
操作
#10
- 関連している リファクタ #457: skin property: SkinProperty の id 定数をカテゴリ別に整理する(Phase 3) を追加
エージェント ちゃん さんが8日前に更新
操作
#11
skin property 定義群の整理方針¶
skin/property 配下を棚卸しした結果と、小さく安全に進めるための方針を以下にまとめる。本チケットは方針策定のみで、実作業は末尾の派生チケットで進める。
1. 現状の責務マッピング¶
| 要素 | 行数 | 責務 |
|---|---|---|
SkinProperty.java |
1081 | id 定数の名前空間。LR2 数値 op 契約 / JSON・Lua の name→id アンカー。ロジックはほぼ無し |
SkinPropertyMapper.java |
167 | id 算術ヘルパ(key/player offset、範囲判定)。純関数 |
型 enum 群(*PropertyTypes, EventType) |
各 391〜782 |
(id, name, lambda[, writer]) の登録テーブル。実体のレジストリ |
Factory 群(*PropertyFactory) |
各 35〜513 | id→/name→ 解決。Float/String は薄い lookupだが、Integer/Boolean は enum走査 + 算術範囲ハンドラ + 巨大 switch(getXxx0) + キャッシュ を抱えて肥大化 |
2. 重複している責務(共通化・単一化候補)¶
-
id→property が 2 形態で存在:enum 登録(
ValueType/BooleanType)と手書き switch(getIntegerProperty0/getBooleanProperty0)。新規エントリがどちらにも追加できることが肥大化・不整合の主因。 -
name→/id→ 解決が Factory ごとに別実装(線形走査 /
StringType.getマップ / キャッシュ配列)。name/id ドリフトのリスク。 - 反転(-id)・キャッシュが型ごとに再実装されている。
- 重い
import static SkinProperty.*+ 同一 import ブロックが複数ファイルで重複。
3. 互換のために分離必須な責務(触れてはいけない)¶
-
SkinProperty.javaの id 値(LR2 数値契約 + JSON/Lua の name→id アンカー)。リナンバー/削除は破壊的変更。 -
意図的な重複 id / エイリアス(例:
NUMBER_TOTAL_RATEとNUMBER_SCORE_RATE2)。既存テストもduplicateCountsで重複を許容している。 -
enum 定数名 = JSON/Lua の公開プロパティ名。typo 名(
playtime_totla_saecond,currenttime_saecond等)も契約なので「修正」禁止。 - 算術範囲(judge/key/player offset)は LR2 連番 id 規約。数式を完全保存。
4. 小さく安全な分割単位(派生チケット)¶
| Phase | チケット | 内容 |
|---|---|---|
| 0 | #455 | 分割前の先行互換テストを整備(安全網) |
| 1 | #454 | id→property の二重経路(switch vs enum)を単一化 |
| 2 | #456 | Factory の id/name 解決を汎用 PropertyRegistry<T> に共通化 |
| 3 | #457 |
SkinProperty の id 定数をカテゴリ別に整理 |
Phase 0 → 1 → 2 → 3 の順(precedes で連結)。各 Phase は独立して develop へマージ可能な粒度とする。
5. 先に追加すべき互換テスト(Phase 0 = #455 で詳述)¶
既存 SkinPropertyFactoryRegistryTest は enum 登録の id/name 解決を網羅済。未カバーの seam は以下:
-
getIntegerProperty0/getBooleanProperty0の switch フォールバック各 case の解決・値。 - 算術範囲ハンドラ(judge/key/player offset 等)の解決・値。
-
SkinPropertyMapperの round-trip(keyJudgeValueId↔getKeyJudgeValuePlayer/Offset、bombTimerId/holdTimerId境界、isCustomTimerId/isCustomEventId範囲、getSkinSelectType↔skinSelectTypeId)。 -
ゴールデン契約テスト:同梱
skin/defaultの JSON スキン(追跡済 27 ファイル)を読み、参照される全 property name/id が non-null 解決されることを assert。誤削除・誤リネームを検出できる。
エージェント ちゃん さんが8日前に更新
操作
#12
- ステータス を 実装中 から 完了 に変更
- 進捗率 を 10 から 100 に変更
方針策定完了。派生作業チケット #455(Phase 0) / #454(Phase 1) / #456(Phase 2) / #457(Phase 3) を作成・関連付け済みのため本チケットを完了とする。実作業は各派生チケットで進める。
操作