@@ -324,7 +324,52 @@ pnpm format src/lib/utils/contest_table_provider.ts
324324- ** 段階的実装** : 型定義 → ベースクラス → 子クラス → Group クラス → プリセット の順序で実装することで、依存関係を最小化
325325- ** 型安全性と実用性のバランス** : TypeScript のテンプレートリテラル型で型安全性を確保しつつ、runtime では string として柔軟に操作
326326
327+ ### 後方互換性に関する重要な知見
328+
329+ ** Backwards Compatibility Regression の防止**
330+
331+ セクション化による Provider 実装変更時、後方互換性が壊れる可能性を検出したので記録:
332+
333+ #### 問題状況
334+
335+ 従来のコードが ` getProvider(ContestType.TESSOKU_BOOK) ` を呼び出していた場合、セクション専用 Provider のみを登録すると以下が発生:
336+
337+ ``` typescript
338+ // 登録: TESSOKU_BOOK::examples, TESSOKU_BOOK::practicals, TESSOKU_BOOK::challenges のみ
339+ // 呼び出し: getProvider(ContestType.TESSOKU_BOOK) ← セクション未指定
340+ // 結果: undefined が返る ❌ (互換性回帰)
341+ ```
342+
343+ #### 回避方法(複数の選択肢)
344+
345+ 1 . ** セクション化+従来 Provider の併記** (最も安全)
346+
347+ ``` typescript
348+ .addProviders (
349+ new TessokuBookProvider (ContestType .TESSOKU_BOOK ), // key: "TESSOKU_BOOK"
350+ new TessokuBookForExamplesProvider (ContestType .TESSOKU_BOOK ), // key: "TESSOKU_BOOK::examples"
351+ new TessokuBookForPracticalsProvider (ContestType .TESSOKU_BOOK ), // key: "TESSOKU_BOOK::practicals"
352+ new TessokuBookForChallengesProvider (ContestType .TESSOKU_BOOK ), // key: "TESSOKU_BOOK::challenges"
353+ )
354+ ```
355+
356+ 2 . ** セクション専用のみ+事前検証** (リスク低い場合)
357+ - grep で既存コード全体から ` getProvider(ContestType.TESSOKU_BOOK) ` の セクション未指定呼び出しが ** 存在しない** ことを確認
358+ - 本プロジェクトではこの検証後、セクション専用のみを採用
359+
360+ #### 実装決定
361+
362+ 本プロジェクトでは方法 2 を採用:
363+
364+ ``` bash
365+ # 検証コマンド例
366+ grep -r " getProvider.*TESSOKU_BOOK" /usr/src/app/src --include=" *.ts" --include=" *.tsx" --include=" *.svelte"
367+ # 結果: すべてが section 付き呼び出し (getProvider(TESSOKU_BOOK, 'examples') など)
368+ ```
369+
370+ ** 結論** : セクション専用 Provider のみの登録は、セクション未指定の呼び出しが存在しないことが確認できればリスクがない。ただしコメント(TSDoc)で明記し、将来のメンテナーに注意喚起することが重要。
371+
327372---
328373
329- ** 状態** : ✅ 完了(ProviderKey 型を活用)
374+ ** 状態** : ✅ 完了(ProviderKey 型を活用、後方互換性検証済み )
330375````
0 commit comments