プロジェクト

全般

プロフィール

リファクタ #176

完了

skin property 定義群の肥大化を整理する方針を作る

リファクタ #176: skin property 定義群の肥大化を整理する方針を作る

エージェント ちゃん さんが25日前に追加. 8日前に更新.

ステータス:
完了
優先度:
通常
担当者:
対象バージョン:
開始日:
2026/06/11
期日:
進捗率:

100%

予定工数:

説明

Redmine #165 のコードベースレビューからの派生タスクです。

背景

skin/property/ 配下の property / event 定義群が肥大化しています。JSON、LR2、Lua の互換に関わるため、いきなり共通化や削除を進めると回帰リスクが高い領域です。

対応内容

  • SkinProperty.javaEventType.javaIntegerPropertyTypes.javaFloatPropertyTypes.javaStringPropertyTypes.javaBooleanPropertyTypes.java、各 Factory の責務を整理する。
  • 重複している責務と、フォーマット互換のために分けるべき責務を分類する。
  • 小さく安全に進められる分割単位を提案する。
  • 互換テストの不足があれば、先に追加すべきテストを洗い出す。

確認観点

  • JSON / LR2 / Lua スキンの既存互換性を壊さないこと。
  • 変更する場合は default skin と既存ローカルスキン互換テストで確認できること。

関連するチケット 5 (0件未完了5件完了)

関連している beatoraja - リファクタ #165: コードベースの棚卸完了いづ さん2026/06/11

操作
関連している beatoraja - リファクタ #455: skin property: 分割前の先行互換テストを整備する(Phase 0)完了いづ さん2026/06/28

操作
関連している beatoraja - リファクタ #454: skin property: id→property の二重経路(switch vs enum)を単一化する(Phase 1)完了いづ さん2026/06/292026/06/29

操作
関連している beatoraja - リファクタ #456: skin property: Factory の id/name 解決を汎用 PropertyRegistry に共通化する(Phase 2)完了いづ さん2026/06/302026/06/30

操作
関連している beatoraja - リファクタ #457: skin property: SkinProperty の id 定数をカテゴリ別に整理する(Phase 3)完了いづ さん2026/07/012026/07/01

操作

いづ さん さんが25日前に更新 操作 #1

いづ さん さんが22日前に更新 操作 #2

  • 対象バージョンBacklog にセット

いづ さん さんが12日前に更新 操作 #3

  • 対象バージョンBacklog から 1.2.1 に変更

いづ さん さんが10日前に更新 操作 #4

  • 対象バージョン1.2.1 から Backlog に変更

いづ さん さんが8日前に更新 操作 #5

  • 対象バージョンBacklog から 1.3.1 に変更

エージェント ちゃん さんが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.javaid 値(LR2 数値契約 + JSON/Lua の name→id アンカー)。リナンバー/削除は破壊的変更。
  • 意図的な重複 id / エイリアス(例:NUMBER_TOTAL_RATENUMBER_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(keyJudgeValueIdgetKeyJudgeValuePlayer/OffsetbombTimerId/holdTimerId 境界、isCustomTimerId/isCustomEventId 範囲、getSkinSelectTypeskinSelectTypeId)。
  • ゴールデン契約テスト:同梱 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) を作成・関連付け済みのため本チケットを完了とする。実作業は各派生チケットで進める。

他の形式にエクスポート: PDF Atom