Skip to content

Commit a50d75c

Browse files
committed
docs: Add lessons and fix path (#3169)
1 parent c3163aa commit a50d75c

File tree

2 files changed

+39
-35
lines changed

2 files changed

+39
-35
lines changed

docs/dev-notes/2026-02-14/refactor-for-contest-table/plan.md

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -25,29 +25,6 @@
2525

2626
---
2727

28-
## 検証
29-
30-
1. `pnpm test:unit` でテストが全て通ること
31-
2. `pnpm check` で型エラーがないこと
32-
3. `pnpm build` でビルドが通ること
33-
4. `/problems` ページで TaskTable が正常に表示されること(開発サーバー確認)
34-
35-
---
36-
37-
## 教訓
38-
39-
1. **`git mv` でファイルを移動する**: `cp` + `rm` より git 履歴が追跡しやすい。`Write` ツールで新規作成しない。
40-
41-
2. **`$features` エイリアスを先に設定してからインポートを書く**: エイリアス未設定のまま移動ファイルを参照すると型チェックが壊れる。設定ファイル変更 → ファイル移動 → import 修正の順が安全。
42-
43-
3. **共有 test_cases は使用元を grep で確認してから移動判断する**: `contest_name_and_task_index.ts` 等は `contest.test.ts` からも参照されており、フィクスチャに移動すると `src/test/lib` 残存テストが壊れる。
44-
45-
4. **同一ディレクトリ内の相対 import は `./` を使う**: `TaskTable.svelte``TaskTableBodyCell.svelte` のように同じディレクトリに移動したコンポーネントは `$features/...` より `./` の方が明確。
46-
47-
5. **`pnpm check` の既存エラーは事前に把握しておく**: リファクタ起因か既存問題かを切り分けるために、作業前の状態を確認しておくとよい。
48-
49-
---
50-
5128
# ファイル分割リファクタリング (第二段階)
5229

5330
## Context
@@ -301,3 +278,30 @@ import { classifyContest } from '$lib/utils/contest'; // no mock needed
301278
- `pnpm lint` — ESLint エラーなし
302279
- `pnpm build` — ビルド成功
303280
- ブラウザで `/problems` ページの表示確認
281+
282+
## 実装から得た教訓
283+
284+
1. **`git mv` でファイルを移動する**: `cp` + `rm` より git 履歴が追跡しやすい。`Write` ツールで新規作成しない。
285+
286+
2. **`$features` エイリアスを先に設定してからインポートを書く**: エイリアス未設定のまま移動ファイルを参照すると型チェックが壊れる。設定ファイル変更 → ファイル移動 → import 修正の順が安全。
287+
288+
3. **共有 test_cases は使用元を grep で確認してから移動判断する**: `contest_name_and_task_index.ts` 等は `contest.test.ts` からも参照されており、フィクスチャに移動すると `src/test/lib` 残存テストが壊れる。
289+
290+
4. **同一ディレクトリ内の相対 import は `./` を使う**: `TaskTable.svelte``TaskTableBodyCell.svelte` のように同じディレクトリに移動したコンポーネントは `$features/...` より `./` の方が明確。
291+
292+
5. **`pnpm check` の既存エラーは事前に把握しておく**: リファクタ起因か既存問題かを切り分けるために、作業前の状態を確認しておくとよい。
293+
294+
6. vi.mock 廃止で発見されたバグ
295+
296+
旧テストでは `classifyContest``getContestNameLabel` を mock していたため、実装との乖離が隠れていた。mock を外して直接 import に切り替えたことで以下が発覚:
297+
298+
- **Tessoku sub-provider のメタデータ不一致**: テストでは `"力試し問題"` 等を期待していたが、実装は `"C. 力試し問題"` のように接頭辞付き。`abbreviationName``tessoku-book-examples` ではなく `tessoku-book-for-examples``for-` 接頭辞)が正しかった。
299+
- **JOI の無効 ID ラベル**: mock では小文字パススルーを期待、実装は `toUpperCase()``'INVALID-ID'` を返す。部分一致するパターン(`joi2024yo1d`)では想定外の `'2024d'` が返る。
300+
301+
**mock は実装との一致を保証しない。純粋関数は直接テストすべき。**
302+
303+
### 分割の実用的な効果
304+
305+
- 1ファイル 100〜300 行に抑えられ、変更時の影響範囲が明確になった
306+
- テスト実行時間が短縮(vitest の並列実行が効く)
307+
- 新規 provider 追加時に既存ファイルを触る必要がほぼなくなった

docs/guides/how-to-add-contest-table-provider.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,11 @@
7171
2. **テスト実装フェーズ**
7272
- Vitest でテストコードを記述
7373
- Provider クラスをスケルトン実装(下記参照)
74-
- `src/lib/utils/contest_table_provider.ts``prepareContestProviderPresets()``contestTableProviderGroups` に登録
74+
- `src/features/tasks/utils/contest-table/contest_table_provider_groups.ts``prepareContestProviderPresets()``contestTableProviderGroups` に登録
7575

7676
3. **Provider 実装フェーズ**
7777
- テストが RED → GREEN になるまで段階的に実装
78-
- 実行: `pnpm test:unit src/test/lib/utils/contest_table_provider.test.ts`
78+
- 実行: `pnpm test:unit src/features/tasks/utils/contest-table/`
7979

8080
### スケルトン Provider の最小例
8181

@@ -105,7 +105,7 @@ export class MyNewProvider extends ContestTableProviderBase {
105105

106106
### Provider 登録(テスト実行環境構築)
107107

108-
**ファイル**: `src/lib/utils/contest_table_provider.ts`
108+
**ファイル**: `src/features/tasks/utils/contest-table/contest_table_provider_groups.ts`
109109

110110
```typescript
111111
function prepareContestProviderPresets() {
@@ -124,7 +124,7 @@ export const contestTableProviderGroups: Record<ProviderKey, ContestTableProvide
124124

125125
**重要**: これらを登録しないとテストが実行できません。
126126

127-
詳細な実装例は [Provider実装ファイル](../src/lib/utils/contest_table_provider.ts) を参照してください。
127+
詳細な実装例は [Provider実装ディレクトリ](../src/features/tasks/utils/contest-table/) を参照してください。
128128

129129
---
130130

@@ -152,7 +152,7 @@ protected setFilterCondition(): (taskResult: TaskResult) => boolean {
152152
}
153153
```
154154

155-
その他の実装(`getMetadata()``getDisplayConfig()` など)は [Provider実装ファイル](../src/lib/utils/contest_table_provider.ts) を参照してください。
155+
その他の実装(`getMetadata()``getDisplayConfig()` など)は [Provider実装ディレクトリ](../src/features/tasks/utils/contest-table/) を参照してください。
156156

157157
**注意**: ARC、AGC も同じパターン。範囲フィルタ型を参照してください。
158158

@@ -180,7 +180,7 @@ protected setFilterCondition(): (taskResult: TaskResult) => boolean {
180180
}
181181
```
182182

183-
その他の実装は [Provider実装ファイル](../src/lib/utils/contest_table_provider.ts) を参照してください。
183+
その他の実装は [Provider実装ディレクトリ](../src/features/tasks/utils/contest-table/) を参照してください。
184184

185185
**注意**: TDPC、FPS_24 も同じパターン。`contest_id` とメタデータだけ異なります。
186186

@@ -232,7 +232,7 @@ class TessokuBookSectionProvider extends TessokuBookProvider {
232232
}
233233
```
234234

235-
その他の実装は [Provider実装ファイル](../src/lib/utils/contest_table_provider.ts) を参照してください。
235+
その他の実装は [Provider実装ディレクトリ](../src/features/tasks/utils/contest-table/) を参照してください。
236236

237237
---
238238

@@ -373,13 +373,13 @@ Provider クラスのテスト完了後、`prepareContestProviderPresets()` か
373373

374374
**セクション識別子の指定**:
375375

376-
複数プロバイダーを含むグループでは、`getProvider()` の第2引数にセクション識別子を渡します。セクション定数は `src/lib/types/contest_table_provider.ts` で定義されています:
376+
複数プロバイダーを含むグループでは、`getProvider()` の第2引数にセクション識別子を渡します。セクション定数は `src/features/tasks/types/contest-table/contest_table_provider.ts` で定義されています:
377377

378378
- `TESSOKU_SECTIONS`: `examples``practicals``challenges`
379379
- `JOI_SECOND_QUAL_ROUND_SECTIONS`: `'2020Onwards'``from2006To2019`
380380
- `JOI_FINAL_ROUND_SECTIONS`: `semiFinal`
381381

382-
詳細な実装例は [単体テストファイル](../src/test/lib/utils/contest_table_provider.test.ts) を参照してください
382+
詳細な実装例は [単体テストディレクトリ](../src/features/tasks/utils/contest-table/) の各 `*.test.ts` ファイルを参照してください
383383

384384
---
385385

@@ -534,9 +534,9 @@ describe('CustomProvider with unique config', () => {
534534

535535
### 実装ファイル
536536

537-
- [Provider 実装](../src/lib/utils/contest_table_provider.ts)
538-
- [単体テスト](../src/test/lib/utils/contest_table_provider.test.ts)
539-
- [モックデータ](../src/test/lib/utils/test_cases/contest_table_provider.ts)
537+
- [Provider 実装ディレクトリ](../src/features/tasks/utils/contest-table/)
538+
- [単体テスト](../src/features/tasks/utils/contest-table/) (各 `*.test.ts` ファイル)
539+
- [テストフィクスチャ](../src/features/tasks/fixtures/contest-table/contest_table_provider.ts)
540540

541541
---
542542

0 commit comments

Comments
 (0)