プロジェクト: TrainLCD Mobile App 作成日: 2025-12-25 最終更新: 2026-01-06(テストカバレッジ改善・統計更新)
- 総ファイル数: 398個のTypeScript/TSXファイル
- 本番コード: 302ファイル
- テストファイル: 110ファイル
- カバレッジ: 約83.3%(Lines coverage、977テストケース)
- コンポーネント数: 110個
- カスタムフック数: 78個
- スクリーン数: 10個
深刻度: 🟡 中(以前は🔴最高) 推定工数: 残り2-4週間(以前は8-12週間) 影響範囲: 保守性、開発速度、バグ発生率
類似機能を持つコンポーネントが大量に存在していましたが、LineBoard系・Header系の共通化により約3,000行以上のコード削減を達成。残りはNumberingIcon系の統一が主な課題です。
src/components/LineBoardJRKyushu.tsx (760行 → 約620行)
src/components/LineBoardToei.tsx (751行 → 約610行)
src/components/LineBoardEast.tsx (720行 → 約580行)
src/components/LineBoardWest.tsx (621行 → 510行) ✅ ローカルスタイル共通化完了
src/components/LineBoardSaikyo.tsx (592行 → 約450行)
src/components/LineBoardJO.tsx (482行 → 383行) ✅ ローカルスタイル共通化完了
src/components/LineBoardLED.tsx (396行) - 構造が異なるため適用対象外
src/components/LineBoardYamanotePad.tsx - PadArch委譲のため適用対象外
src/components/LineBoard.tsx
共通化ディレクトリ(新規作成):
src/components/LineBoard/shared/
├── components/
│ ├── LineDot.tsx (72行)
│ ├── StationName.tsx (75行)
│ └── EmptyStationNameCell.tsx (68行)
├── hooks/
│ ├── useBarStyles.ts (35行)
│ ├── useChevronPosition.ts (24行)
│ └── useIncludesLongStationName.ts (12行)
└── styles/
└── commonStyles.ts (307行) ✅ West/JO用バリアント追加
共通テストファイル(新規作成、49テストケース):
src/components/LineBoard/shared/
├── components/
│ ├── LineDot.test.tsx (6 tests)
│ ├── StationName.test.tsx (10 tests)
│ └── EmptyStationNameCell.test.tsx (9 tests)
└── hooks/
├── useBarStyles.test.tsx (8 tests)
├── useChevronPosition.test.tsx (8 tests)
└── useIncludesLongStationName.test.tsx (8 tests)
LineBoardコンポーネントテストファイル(新規作成、95テストケース)✨ **NEW**:
src/components/
├── LineBoard.test.tsx (9 tests)
├── LineBoardEast.test.tsx (9 tests)
├── LineBoardJO.test.tsx (10 tests)
├── LineBoardJRKyushu.test.tsx (13 tests)
├── LineBoardLED.test.tsx (15 tests)
├── LineBoardSaikyo.test.tsx (10 tests)
├── LineBoardToei.test.tsx (10 tests)
├── LineBoardWest.test.tsx (10 tests)
└── LineBoardYamanotePad.test.tsx (10 tests)
達成済みの改善(2025-12-25〜2026-01-05):
- ✅ 約1,119行のコード削減(共通コンポーネント・フック・スタイルの抽出)
- ✅ 6ファイルで重複コードを共通化(LineBoardEast, Saikyo, JRKyushu, Toei, West, JO)
- ✅ 共通コンポーネント3つを作成(LineDot, StationName, EmptyStationNameCell)
- ✅ 共通フック3つを作成(useBarStyles, useChevronPosition, useIncludesLongStationName)
- ✅ LineBoardWest, JOにuseIncludesLongStationNameフックを適用(2026-01-05)
- ✅ LineBoardWest, JOのローカルスタイル定義を共通化(2026-01-05、約200行削減)
- LineBoardWest: 617行 → 510行(107行削減)
- LineBoardJO: 478行 → 383行(95行削減)
- commonStyles.ts: 89行 → 307行(West/JO用バリアント追加)
- ✅ 包括的なテストカバレッジ:49テストケース(6テストファイル)を追加
- ✅ 都営テーマの多言語対応を維持:StationNameToeiコンポーネントで韓国語・中国語表示を保持
- ✅ 保守性の向上:バグ修正・機能追加が1箇所で完結
残りの改善余地:
- ℹ️ LineBoardLED: LEDマーキー表示でテキストベースのため、共通コンポーネント(LineDot, StationName等)の適用対象外
- ℹ️ LineBoardYamanotePad: PadArchコンポーネントに委譲しているため、共通コンポーネントの適用対象外
src/components/HeaderTokyoMetro.tsx (660行 → 306行) ✅ 354行削減
src/components/HeaderJRWest.tsx (656行 → 535行) ✅ 121行削減
src/components/HeaderJRKyushu.tsx (638行 → 287行) ✅ 351行削減
src/components/HeaderTY.tsx (633行 → 293行) ✅ 340行削減
src/components/HeaderSaikyo.tsx (585行 → 284行) ✅ 301行削減
src/components/HeaderJL.tsx (409行 → 246行) ✅ 163行削減
src/components/HeaderE235.tsx (405行 → 239行) ✅ 166行削減
src/components/HeaderLED.tsx (191行)
src/components/Header.tsx (47行、メインコンポーネント)
共通フック・型定義(新規作成):
src/hooks/
├── useHeaderAnimation.ts (206行) ✨ NEW - アニメーション共通化
├── useHeaderCommonData.ts (123行) ✨ NEW - 共通データ取得
├── useHeaderLangState.ts (多言語状態管理)
├── useHeaderStateText.ts (状態テキスト生成)
└── useHeaderStationText.ts (駅名テキスト生成)
src/components/
└── Header.types.ts (72行) ✨ NEW - 共通型定義
Headerテストファイル(128テストケース):
src/components/
├── Header.test.tsx (13 tests)
├── HeaderLED.test.tsx (12 tests)
├── HeaderTokyoMetro.test.tsx (14 tests)
├── HeaderJRWest.test.tsx (26 tests)
├── HeaderJRKyushu.test.tsx (14 tests)
├── HeaderTY.test.tsx (15 tests)
├── HeaderSaikyo.test.tsx (14 tests)
├── HeaderE235.test.tsx (9 tests)
└── HeaderJL.test.tsx (7 tests)
共通フックテストファイル:
src/hooks/
└── useHeaderLangState.test.tsx (テスト有り)
達成済みの改善(2025-12-26〜2026-01-02):
- ✅ 5つの共通フック・ファイルを作成(useHeaderAnimation、useHeaderCommonData、useHeaderLangState、useHeaderStateText、useHeaderStationText、Header.types.ts)
- ✅ 約1,800行のコード削減(純減約677行)- 7つのHeaderコンポーネントで大幅なリファクタリング
- ✅ アニメーションロジックの共通化: useHeaderAnimationフックに集約
- ✅ データ取得ロジックの共通化: useHeaderCommonDataフックに集約
- ✅ 型の統一: Header.types.tsに共通型を定義
- ✅ データ上に存在しない英中韓駅名のスキップ対応: 多言語表示の堅牢性向上
- ✅ 全9個のHeaderコンポーネントにユニットテスト追加(128テストケース)
- ✅ 包括的なテストカバレッジ:
- コンポーネントレンダリング
- ヘッダー状態遷移(CURRENT、NEXT、ARRIVING、各言語版)
- 終点駅・始発駅対応
- 行先選択有無(selectedBound)
- 直通路線表示
- 駅ナンバリング表示
- 多言語対応(日本語、英語、カナ、中国語、韓国語)
- 列車種別別ロゴ表示(HeaderJRWest)
NumberingIcon.tsx (メインコンポーネント)
NumberingIconRound.tsx
NumberingIconSquare.tsx
NumberingIconHalfSquare.tsx
NumberingIconHankyu.tsx
NumberingIconHanshin.tsx
NumberingIconIzuhakone.tsx
NumberingIconKeihan.tsx
NumberingIconKeikyu.tsx
NumberingIconKeio.tsx
NumberingIconKeisei.tsx
NumberingIconKintetsu.tsx
NumberingIconMonochromeRound.tsx
NumberingIconNankai.tsx
NumberingIconNewShuttle.tsx
NumberingIconNTL.tsx
NumberingIconOdakyu.tsx
NumberingIconReversedRound.tsx
NumberingIconReversedRoundHorizontal.tsx
NumberingIconReversedSquare.tsx
NumberingIconReversedSquareHorizontal.tsx
NumberingIconReversedSquareWest.tsx
NumberingIconRoundHorizontal.tsx
NumberingIconSanyo.tsx
NumberingIconSMR.tsx
NumberingIconTWR.tsx
共通テストファイル(新規作成、124テストケース):
src/components/
├── NumberingIcon.test.tsx (11 tests)
├── NumberingIconRound.test.tsx (6 tests)
├── NumberingIconSquare.test.tsx (6 tests)
├── NumberingIconHalfSquare.test.tsx (7 tests)
├── NumberingIconHankyu.test.tsx (3 tests)
├── NumberingIconHanshin.test.tsx (3 tests)
├── NumberingIconIzuhakone.test.tsx (5 tests)
├── NumberingIconKeihan.test.tsx (5 tests)
├── NumberingIconKeikyu.test.tsx (3 tests)
├── NumberingIconKeio.test.tsx (3 tests)
├── NumberingIconKeisei.test.tsx (4 tests)
├── NumberingIconKintetsu.test.tsx (5 tests)
├── NumberingIconMonochromeRound.test.tsx (3 tests)
├── NumberingIconNankai.test.tsx (4 tests)
├── NumberingIconNewShuttle.test.tsx (3 tests)
├── NumberingIconNTL.test.tsx (3 tests)
├── NumberingIconOdakyu.test.tsx (4 tests)
├── NumberingIconReversedRound.test.tsx (6 tests)
├── NumberingIconReversedRoundHorizontal.test.tsx (6 tests)
├── NumberingIconReversedSquare.test.tsx (6 tests)
├── NumberingIconReversedSquareHorizontal.test.tsx (5 tests)
├── NumberingIconReversedSquareWest.test.tsx (4 tests)
├── NumberingIconRoundHorizontal.test.tsx (5 tests)
├── NumberingIconSanyo.test.tsx (5 tests)
├── NumberingIconSMR.test.tsx (6 tests)
└── NumberingIconTWR.test.tsx (3 tests)
達成済みの改善(2025-12-27):
- ✅ 26個全コンポーネントのユニットテスト追加(124テストケース)
- ✅ 包括的なテストカバレッジ:各コンポーネントの主要機能をテスト
- コンポーネントレンダリング
- Props処理(lineColor, stationNumber, size, withOutline等)
- StationNumberのパースと分割処理
- サイズバリアント(SMALL, MEDIUM, LARGE, デフォルト)
- 特殊ケース(darkText, hakone, withDarkTheme等)
- ✅ Biome lintエラー0件:コード品質基準を完全準拠
- ✅ 全テストパス:26テストスイート、124テストケース全て成功
- ✅ CodeRabbit指摘対応完了(PR #4797)
- 全26テストファイルに
afterEach(() => { jest.clearAllMocks() })を追加 - Weak assertions修正:
UNSAFE_root.toBeTruthy()を具体的なgetByText()検証に置換 - withOutlineテストの改善:実際のレンダリング内容を検証
- LARGEサイズバリアントのテスト追加(ReversedRoundHorizontal)
- 冗長・意味のないテストケースを削除
- プロジェクトコーディングガイドライン完全準拠
- 全26テストファイルに
- バグ修正時に複数箇所の修正が必要
- 新機能追加時のコスト増大(各バリエーションに個別実装が必要)
- テストコード量の増大
- コードレビューの困難
共通ロジックの抽出とカスタムフックへの移行✅ 完了(2025-12-25)- ✅ LineDot、StationName、EmptyStationNameCellコンポーネントを共通化
- ✅ useBarStyles、useChevronPosition、useIncludesLongStationNameフックを共通化
- ✅ 共通スタイル定義を抽出
- ✅ 49テストケースを追加(共通コンポーネント・フックの包括的なテスト)
- ✅ 都営テーマの多言語対応を維持(StationNameToeiコンポーネント)
さらなるスタイル共通化✅ 完了(2026-01-05)- ✅ LineBoardWest/JOのローカルスタイルを共通化(約200行削減)
- ✅ commonStyles.tsに25個のWest/JO用バリアントを追加
- テーマベースのpropsシステムに統一(中期目標)
- 各鉄道会社/路線のスタイルをテーマとして定義
- 単一のHeader/LineBoard/NumberingIconコンポーネントに統合
- コンポーネントコンポジションパターンの導入
- 共通のロジックをベースコンポーネントに集約
- バリエーションをpropsで制御
- コード削減: 5,000-7,000行(20-25%)
- ✅ 達成済み: 約1,119行削減(LineBoardコンポーネント共通化)
- ✅ 追加達成: LineBoardWest/JOのローカルスタイル共通化で約200行削減
- 開発速度: 新機能開発時間40%削減
- ✅ 一部達成: 共通コンポーネントにより、4つのLineBoardで同時にバグ修正・機能追加が可能
- バグ削減: 修正漏れのリスク大幅減少
- ✅ 達成: 重複コードが1箇所に集約され、修正漏れリスクが大幅減少
- テストカバレッジ向上:
- ✅ 達成: 共通コンポーネント・フックに49テストケースを追加(カバレッジ15%に向上)
深刻度: 🟢 良好(以前は🔴最高) 推定工数: 継続的な改善 影響範囲: 品質、リグレッション防止
本番コード: 302ファイル
テストファイル: 110ファイル
テストケース: 977個
テストスイート: 110個
カバレッジ詳細(2026-01-06計測):
Statements: 83.04% (2,733/3,291)
Branches: 58.6% (2,540/4,334) ⚠️ 要改善
Functions: 86.81% (724/834)
Lines: 83.27% (2,658/3,192)
最近の改善(2025-12-25〜2025-12-31):
- ✅ LineBoard共通コンポーネント・フックのテスト追加(6ファイル、49テストケース)
- ✅ ビジネスクリティカルなフックのテスト追加(6ファイル、38テストケース)
- useCurrentStation (6テスト)
- useCurrentLine (5テスト)
- useNextStation (10テスト)
- usePreviousStation (4テスト)
- useStoppingState (7テスト)
- useNearestStation (6テスト)
- ✅ Header共通フックのテスト追加(useHeaderLangState)
- ✅ NumberingIcon系全26コンポーネントのテスト追加(26ファイル、124テストケース)
- ✅ LineBoard系全9コンポーネントのテスト追加(9ファイル、95テストケース)
- ✅ Header系全9コンポーネントのテスト追加(9ファイル、108テストケース)✨ NEW
- ✅ CodeRabbit指摘対応完了(weak assertions修正、withOutlineテスト改善、サイズバリアント追加、afterEachクリーンアップ)
- ✅ すべてのテストがプロジェクトガイドライン準拠(afterEachでクリーンアップ、具体的な検証アサーション)
- ✅ 都営バスTTSテスト追加(useBusTTSText.test.tsx)
- ✅ SelectBoundModalテスト追加(SelectBoundModal.test.tsx)
- ✅ ブランチカバレッジ改善のためのフックテスト追加(3ファイル、30テストケース)
- useThreshold (10テスト) - 距離計算ロジックの全分岐をカバー
- useCanGoForward (9テスト) - ナビゲーション判定の全分岐をカバー
- useInRadiusStation (11テスト) - 位置判定の全分岐をカバー
- ✅ 追加のブランチカバレッジ改善テスト追加(3ファイル、36テストケース)
- useSlicedStations (15テスト) - 駅リストスライス処理の全分岐をカバー
- useBoundText (10テスト) - 行先テキスト生成の全分岐をカバー(大江戸線特殊処理含む)
- useDistanceToNextStation (11テスト) - 次駅までの距離計算の全分岐をカバー
- ✅ さらなるブランチカバレッジ改善テスト追加(5ファイル、35テストケース)✨ NEW
- useAutoMode (9テスト) - 自動モード処理の主要分岐をカバー
- useFirstStop (7テスト) - 始発駅判定の全分岐をカバー
- useIsPassing (8テスト) - 通過判定の全分岐をカバー
- useNextLine (4テスト) - 次路線取得の全分岐をカバー
- useNumbering (7テスト) - 駅番号取得の主要分岐をカバー
- ✅ 追加のブランチカバレッジ改善テスト追加(1ファイル、44テストケース)✨ NEW
- trainTypeString (44テスト) - 種別判定の全分岐をカバー(getIsLocal, getIsRapid, getIsLtdExp, find系関数)
- ✅ 既存テストファイルの拡充(line.test.ts)✨ NEW
- filterWithoutCurrentLine, getCurrentStationLinesWithoutCurrentLine, getNextStationLinesWithoutCurrentLineの17テスト追加
- 📈 合計977テストケース(Linesカバレッジ約83.3%に向上)
全体: Branchカバレッジが58.6%と他の指標(83%超)に比べて低い状態です。
以下のフックにはテストファイルが存在せず、0%のブランチカバレッジ:
~~useCanGoForward.ts (0% branch) - 条件分岐3つ~~ → ✅ **テスト追加済み**(9テスト)
~~useThreshold.ts (0% branch) - 条件分岐6つ~~ → ✅ **テスト追加済み**(10テスト)
~~useInRadiusStation.ts (0% branch) - 条件分岐2つ~~ → ✅ **テスト追加済み**(11テスト)
~~useSlicedStations.ts (25% branch)~~ → ✅ **テスト追加済み**(15テスト)
~~useBoundText.ts~~ → ✅ **テスト追加済み**(10テスト)
~~useDistanceToNextStation.ts~~ → ✅ **テスト追加済み**(11テスト)
~~useAutoMode.ts~~ → ✅ **テスト追加済み**(9テスト)
~~useFirstStop.ts~~ → ✅ **テスト追加済み**(7テスト)
~~useIsPassing.ts~~ → ✅ **テスト追加済み**(8テスト)
~~useNextLine.ts~~ → ✅ **テスト追加済み**(4テスト)
~~useNumbering.ts~~ → ✅ **テスト追加済み**(7テスト)
useDeepLink.ts,
useHasPassStationInRegion.ts, useInterval.ts,
useLazyPrevious.ts, useNextTrainType.ts,
usePrevious.ts, useResetMainState.ts, useShouldHideTypeChange.ts,
useTrainTypeStations.ts, useTypeWillChange.ts, useUpdateBottomState.ts,
useWarningInfo.ts, useHeaderAnimation.ts, useHeaderCommonData.ts,
useHeaderStateText.ts, useHeaderStationText.ts, useTransitionHeaderState.ts,
useUpdateLiveActivities.ts, useRefreshLeftStations.ts, useStartBackgroundLocationUpdates.ts
Headerコンポーネントでは多くの条件付きレンダリングが使用されていますが、すべてのパスがテストされていません:
HeaderJRWest.tsx (15.6% branch) - 44個の条件分岐
HeaderLED.tsx (18.6% branch) - 多数の状態遷移
HeaderJL.tsx (37.73% branch)
HeaderE235.tsx (39.68% branch)
NumberingIcon.tsx (25.58% branch) - 26種類のアイコンタイプ分岐
~~trainTypeString.ts (16.66% branch)~~ → ✅ **テスト追加済み**(44テスト)
~~line.ts (28.57% branch)~~ → ✅ **テスト拡充済み**(17テスト追加)
truncateTrainType.ts (42.85% branch)
graphql.ts, graphql.d.ts (0% branch) - GraphQL Codegenで自動生成、テスト対象外
useBounds.ts (39.39% branch) - 早期リターン4箇所
useRefreshStation.ts (42.3% branch) - nullチェック多数
useTelemetrySender.ts (38.46% branch) - WebSocket状態管理の分岐
高優先: テストが存在しない重要フックにテスト追加✅ 完了(2026-01-06)✅ 10テスト追加useThreshold.ts- 距離計算ロジックのテスト✅ 9テスト追加useCanGoForward.ts- ナビゲーション判定のテスト✅ 11テスト追加useInRadiusStation.ts- 位置判定のテスト
高優先: 残りの重要フックにテスト追加✅ 完了(2026-01-06)✅ 15テスト追加useSlicedStations.ts- 駅リストのスライス処理✅ 10テスト追加useBoundText.ts- 行先テキスト生成✅ 11テスト追加useDistanceToNextStation.ts- 次駅までの距離計算
高優先: 残りのフックにテスト追加✅ 完了(2026-01-06)✅ 9テスト追加useAutoMode.ts- 自動モード判定✅ 7テスト追加useFirstStop.ts- 始発駅判定✅ 8テスト追加useIsPassing.ts- 通過判定✅ 4テスト追加useNextLine.ts- 次路線取得✅ 7テスト追加useNumbering.ts- 駅番号取得
- 中優先: Header系コンポーネントの条件分岐テスト拡充
- 各言語(日/英/中/韓)でのレンダリングテスト
- 各ヘッダー状態(CURRENT/NEXT/ARRIVING)でのテスト
- 低優先: ユーティリティ関数のエッジケーステスト
- null/undefined入力時の動作テスト
- デフォルト値が使われるケースのテスト
9つのLineBoardコンポーネント: テスト0個→ ✅ 完了(9ファイル、95テストケース追加)27つのNumberingIconコンポーネント: テスト0個→ ✅ 完了(26ファイル、124テストケース追加)多くのHeader系コンポーネント: 2個のみテスト有→ ✅ 完了(9ファイル、108テストケース追加)- 重要な画面: Main、SelectLineScreen等
短期(1ヶ月): ビジネスクリティカルなロジックのテストを優先✅ 完了(2025-12-27)- ✅ 状態管理(hooks): useCurrentStation、useCurrentLine等にテスト追加済み
- ✅ UI コンポーネント: NumberingIcon系26コンポーネントにテスト追加済み
- ✅ データ変換ロジック: 複数のutilsにテスト追加済み
- ✅ 位置情報処理: useNearestStationにテスト追加済み
中期(3ヶ月): 最低30%のカバレッジを目標設定✅ 大幅超過達成(約81%)- 継続: 新規コードには必ずテスト追加のルール維持・カバレッジ80%以上を維持
- ✅ バグ検出率: 大幅向上(Linesカバレッジ82.6%達成)
- ✅ リグレッション防止: CI/CDでの自動検知が有効
- ✅ リファクタリングの安全性向上: 906テストケースで担保
⚠️ 課題: ブランチカバレッジ57.68%は改善の余地あり(目標: 70%以上)
深刻度: 🔴 高(セキュリティリスク) 推定工数: 2-4週間 影響範囲: セキュリティ、パフォーマンス、互換性
"dayjs": "^1.11.19" // ✅ 最新版に更新済み(2025-12-26以前)
"@react-native-firebase/*": "^23.7.0" // ✅ 最新版に更新済み(2025-12-31確認)
"@react-native-community/cli": 削除済み // ✅ Expo SDK 54でexpo-cliに統合のため不要(2025-12-31)
"@sentry/react-native": "~7.8.0" // ✅ 最新版に更新済み(2025-12-31)
"effect": 削除済み // ✅ 不要と判断し削除(2025-12-31)現時点で計画的な更新が必要なパッケージはありません。四半期ごとの依存関係レビューを継続してください。
今週中:✅ 完了(2025-12-26以前)dayjsを最新版にアップデート1ヶ月以内: Firebase関連を計画的にアップデート✅ 完了(^23.7.0に更新済み)計画的な更新: @sentry/react-native、effectをアップデート✅ 完了(2025-12-31)- @react-native-community/cli: Expo SDK 54への移行に伴い削除済み
- 継続的: 四半期ごとの依存関係レビュープロセスの確立
深刻度: 🟢 低(以前は🟠高) 推定工数: 継続的な最適化 影響範囲: ユーザー体験、バッテリー消費
2025-12-31時点の状況:
useMemo/useCallback/React.memo: 757箇所以上で使用中(145ファイル)- 主要な大型コンポーネントにメモ化を適用済み
達成済みの改善:
- ✅
src/components/TypeChangeNotify.tsx:React.memoを適用(メイン + 子コンポーネント5つ) - ✅
src/screens/SelectLineScreen.tsx:React.memoを適用、useMemo/useCallback多数使用 - ✅
src/screens/Main.tsx:React.memoを適用、useMemo/useCallback多数使用 - ✅
src/hooks/useTTSText.ts:useMemo/useCallbackを多数使用(22箇所)
- パフォーマンスプロファイリングによる継続的な改善
2025-12-31時点の状況:
- 使用箇所(10箇所)の最適化が完了
達成済みの改善:
- ✅
removeClippedSubviewsを7ファイルに追加(Android):TrainTypeList.tsx: 既に適用済みTransfers.tsx: 追加完了TransfersYamanote.tsx: 追加完了StationSearchModal.tsx: 追加完了RouteInfoModal.tsx: 追加完了TrainTypeListModal.tsx: 追加完了EnabledLanguagesSettings.tsx: 既に適用済み
- ✅
getItemLayoutを1ファイルに実装:EnabledLanguagesSettings.tsx: 固定高さ(76px)のため実装済み
- ✅
SelectLineScreenPresets.tsxのメモ化改善:renderItemをuseCallbackでラップkeyExtractorをuseCallbackでラップonScrollをuseCallbackでラップListEmptyComponentをuseMemoでラップItemSeparatorComponentをReact.memoでラップ
残りの推奨アクション:
- 固定高さのアイテムには
getItemLayoutを実装(アイテムが可変サイズのため一部は対象外) windowSizeプロパティの最適化
- 再レンダリング削減: 30-50%
- リストスクロール高速化: 30%
- バッテリー消費削減: 測定必要
深刻度: 🟢 解決済み(以前は🟠高)
推定工数: 2-3週間 → 完了
影響範囲: 保守性、学習コスト
2つの異なる状態管理ライブラリが混在 → Jotaiに統一完了
// 以下のファイルは全て削除され、Jotaiに移行完了:
// src/hooks/useTuningStore.ts → 削除(使用箇所なし)
// src/hooks/useThemeStore.ts → src/store/atoms/theme.ts に移行
// src/hooks/useLocationStore.ts → src/store/atoms/location.ts に移行(以前に完了)src/store/atoms/station.ts
src/store/atoms/line.ts
src/store/atoms/navigation.ts
src/store/atoms/notify.ts
src/store/atoms/speech.ts
src/store/atoms/tuning.ts
src/store/atoms/auth.ts
src/store/atoms/theme.ts // ✅ NEW: themeAtom, isLEDThemeAtom
src/store/atoms/location.ts // ✅ NEW: locationAtom, accuracyHistoryAtom
src/store/selectors/isEn.ts- ✅ zustand依存を完全削除: package.jsonから削除
- ✅ useThemeStore → themeAtom: 40+ファイルで更新
- ✅ useLocationStore → locationAtom: React外部からの状態更新も対応
- ✅ 派生atom追加:
isLEDThemeAtomでtheme === APP_THEME.LEDパターンを簡略化 - ✅ テストファイル更新: jotaiモックに統一
- ✅ lint/typecheck通過: 全て成功
状態管理の一貫性がない→ ✅ Jotaiに統一新規開発者がどちらを使うべきか混乱→ ✅ Jotaiのみ使用デバッグが困難(2つのDevToolsを使用)→ ✅ Jotai DevToolsのみ
状態管理をJotaiに統一✅ 完了- 状態管理のガイドライン文書を作成(任意)
Zustandで管理している3つの状態をJotaiに移行✅ 完了
深刻度: 🟠 中 推定工数: 3-4週間 影響範囲: 保守性、可読性
src/__fixtures__/station.ts (7,698行) - テストデータ
src/@types/graphql.d.ts (6,884行) - 自動生成
src/hooks/useTTSText.ts (1,199行) - ビジネスロジック
src/components/TypeChangeNotify.tsx (1,089行) - コンポーネント
src/lineSymbolImage.ts (707行) - 設定ファイル ✅ 改善済み
src/screens/SelectLineScreen.tsx (817行) - 画面
src/screens/Main.tsx (568行) - 画面
2025-12-31に改善完了(PR #4862)
以前の問題だったswitch-case文をオブジェクト(Record<number, LineSymbolImage>)に変換:
// Before: 巨大なswitch-case文
switch (lineId) {
case 11101:
return require('./assets/numbering/JR/line_symbol_jr_east_tokaido.png');
// ... 1000行以上続く
}
// After: オブジェクトマッピング ✅
const LINE_SYMBOL_IMAGE_WITH_COLOR: Record<number, LineSymbolImage> = {
11301: { signPath: require('../assets/marks/jre/jt.webp') },
11302: { signPath: require('../assets/marks/jre/jy.webp') },
// ...
};達成済みの改善:
- ✅ 362行のコード削減(約34%削減)
- ✅ コードの可読性向上: switch-caseからオブジェクト形式へ
- ✅ 保守性の向上: 新しい路線の追加がより簡潔に
- ✅ 型安全性の向上:
Record<number, LineSymbolImage>で型定義
✅ 完了(オブジェクト形式に改善済み)lineSymbolImage.tsをJSONマッピングファイルに変換useTTSText.tsを複数の小さなフックに分割useTTSTextStation.tsuseTTSTextTransfer.tsuseTTSTextBound.ts
- 大きなコンポーネントを機能別に分割
深刻度: 🟡 中 推定工数: 2-3週間 影響範囲: 保守性、学習コスト
78個のカスタムフックが存在し、依存関係が複雑:
useAfterNextStation, useAndroidWearable, useAnonymousUser,
useAppleWatch, useAutoMode, useBadAccuracy, useBounds,
useBoundText, useCachedInitAnonymousUser, useCanGoForward,
useCheckStoreVersion, useClock, useConnectedLines,
useConnectivity, useCurrentLine, useCurrentStation,
useCurrentTrainType, useDeepLink, useDistanceToNextStation,
... (他52個)- フックの責任範囲が不明確
- 循環依存のリスク
- テストが困難
- 新規開発者の学習コスト増大
- フックを機能別にグルーピング
- 位置情報系:
hooks/location/ - 駅情報系:
hooks/station/ - UI状態系:
hooks/ui/ - デバイス連携系:
hooks/devices/
- 位置情報系:
- 使用頻度の低いフックの統合検討
- フックの命名規則とドキュメント整備
- 依存関係の可視化(dependency graph)
深刻度: 🟡 中 推奨工数: 1-2週間 影響範囲: 保守性、テスト容易性
70箇所でPlatform.selectやPlatform.OSを使用:
fontSize: isTablet ? RFValue(24) : RFValue(21),
lineHeight: Platform.select({
android: isTablet ? RFValue(24) : RFValue(21),
ios: undefined,
}),- プラットフォーム固有のロジックがコンポーネント全体に散在
- Android/iOSの動作差異のテストが困難
- プラットフォーム間の一貫性が保ちにくい
- プラットフォーム固有のスタイルをユーティリティに集約
// utils/platform.ts export const platformLineHeight = (size: number) => Platform.select({ android: size, ios: undefined });
- プラットフォーム分岐を最小化
- プラットフォーム別のテストケースを追加
深刻度: 🟡 中 推定工数: 4-6週間 影響範囲: ユーザビリティ、アプリストア要件
アクセシビリティプロパティの使用がわずか25箇所(8ファイル)のみ:
src/screens/TTSSettings.tsx (2箇所)
src/screens/AppSettings.tsx (2箇所)
src/components/LEDThemeSwitch.tsx (3箇所)
src/screens/EnabledLanguagesSettings.tsx (2箇所)
src/screens/ThemeSettings.tsx (2箇所)
src/components/FooterTabBar.tsx (3箇所)
src/components/TuningSettings.tsx (9箇所)
src/components/WarningPanel.tsx (2箇所)
- 118個のコンポーネント中、わずか8個のみアクセシビリティ対応
- スクリーンリーダー利用者への配慮不足
- App Store/Google Playのアクセシビリティ要件に不適合の可能性
- 重要なインタラクティブ要素に対応(優先)
- ボタン、リンク、入力フィールド
accessibilityLabel、accessibilityRole、accessibilityHintを追加
- フォーカス管理の実装
- アクセシビリティテストの自動化(
@testing-library/react-native)
深刻度: 🟢 低 推定工数: 2-3週間 影響範囲: パフォーマンス(軽微)
69ファイルでインラインスタイルが使用されており、わずかなパフォーマンス影響:
// インラインスタイル(最適化されない)
<View style={{ flex: 1, backgroundColor: 'white' }}>
// StyleSheet.create(最適化される)
<View style={styles.container}>StyleSheet.createへの段階的な移行- 動的スタイルのみインラインスタイルを許可
- Lintルールで新規インラインスタイルを検出
深刻度: 🟢 低 推定工数: 1週間 影響範囲: コード品質
-
src/components/HeaderJRWest.tsx:514case '新快速': // TODO: 東海の新快速と同じにならないようにしたい return fetchJRWSpecialRapidLogo();
推奨: JR東海とJR西日本の新快速ロゴを区別する実装
-
src/screens/Main.tsx:463// TODO: 実装し直す if (isDevApp) { Alert.alert('Unimplemented', 'This feature is not implemented yet.'); }
推奨: このTODOの具体的な内容を明確化。機能が未実装のままリリースされている可能性
深刻度: 🟢 良好 ✅
環境変数は適切に管理されています:
PRODUCTION_TTS_API_URL
DEV_TTS_API_URL
NEARBY_STATIONS_LIMIT
SEARCH_STATION_RESULT_LIMIT
DEV_API_URL
PRODUCTION_API_URL
STAGING_API_URL
PRODUCTION_FEEDBACK_API_URL
DEV_FEEDBACK_API_URL
LOCAL_FEEDBACK_API_URL
SENTRY_DSN
ENABLE_EXPERIMENTAL_TELEMETRY
EXPERIMENTAL_TELEMETRY_ENDPOINT_URL
EXPERIMENTAL_TELEMETRY_TOKEN.envファイルは.gitignoreで適切に除外- シークレットがコードにハードコーディングされていない ✅
推奨: 現状維持。必要に応じて環境変数の検証ロジック追加
以下の点は技術的に優れており、継続すべきです:
@ts-ignore: 0回使用@ts-expect-error: 0回使用@ts-nocheck: 0回使用- TypeScriptの
any型: ほぼ使用なし(テストコードのみ一部使用) - 型定義が適切に行われている
- すべて関数コンポーネント + Hooksで実装
- 非推奨なライフサイクルメソッドなし:
componentWillMount❌componentWillReceiveProps❌componentWillUpdate❌UNSAFE_*系メソッド ❌
- 本番コードに
console.log、console.warn、console.error、console.debugが存在しない
- Biomeを使用(モダンなツール)
- フォーマットとリントが統一
| 項目 | 削減量 |
|---|---|
| LineBoard共通化(達成済み) | -1,119行 ✅ |
| Header系共通化(達成済み) | -1,800行(純減約677行) ✅ |
| NumberingIcon統一(未実施) | -2,000〜3,000行 🔶 |
| その他重複ロジック削減 | -1,000〜2,000行 🔶 |
| 合計 | 約20-25%のコード削減目標(現在約25%達成) |
| 項目 | 改善率 |
|---|---|
| メモ化導入による再レンダリング削減 | 30-50% |
| FlatList最適化によるスクロール高速化 | 30% |
| 項目 | 改善効果 |
|---|---|
| テストカバレッジ 約81%達成 | LineBoard・重要フック・NumberingIcon・Headerの品質保証 ✅ |
| Header系共通化(達成済み) | 7コンポーネントで同時修正可能、約1,800行削減 ✅ |
| テストカバレッジ 80%以上を維持(達成済み) | バグ検出率大幅向上、742テストケース ✅ |
| LineBoard共通化(達成済み) | 4ファイルで同時修正可能 ✅ |
| NumberingIcon全26コンポーネントにテスト追加(達成済み) | 品質保証完了、リグレッション防止 ✅ |
| Header全9コンポーネントにテスト追加(達成済み) | 品質保証完了、リグレッション防止 ✅ |
| 全コンポーネント統一(目標) | 新機能開発時間40%削減 🔶 |
-
dayjsを最新版にアップデート ✅ 完了(2025-12-26以前) -
src/screens/Main.tsx:463のTODOを具体化
- LineBoardコンポーネントの共通化を開始 ✅ 完了(2025-12-25)
- 共通コンポーネント3つ作成(LineDot、StationName、EmptyStationNameCell)
- 共通フック3つ作成(useBarStyles、useChevronPosition、useIncludesLongStationName)
- 4ファイルで適用完了(LineBoardEast、Saikyo、JRKyushu、Toei)
- 49テストケース追加(6テストファイル)
- 907行のコード削減達成
- LineBoardの残り4ファイルへの共通コンポーネント適用 ✅ 完了(2026-01-05)
- LineBoardWest, JOにuseIncludesLongStationNameフックを適用
- ℹ️ LineBoardLED, YamanotePadは構造が異なるため適用対象外
- Header系コンポーネントの統一設計を完了 ✅ 完了(2026-01-02)
- 5つの共通フック・ファイル作成(useHeaderAnimation、useHeaderCommonData、useHeaderLangState、useHeaderStateText、useHeaderStationText、Header.types.ts)
- 型の統一(Header.types.tsに共通型定義)
- アニメーションロジックの共通化(useHeaderAnimation)
- データ取得ロジックの共通化(useHeaderCommonData)
- 約1,800行のコード削減達成(7コンポーネント)
- データ上に存在しない英中韓駅名のスキップ対応
- テストカバレッジ20%を達成 ✅ 達成(2025-12-27)
- ビジネスクリティカルなフックのテスト追加(38テストケース)
- LineBoard共通部分のテスト(49テストケース)
- NumberingIcon系全26コンポーネントのテスト(124テストケース)
- LineBoard系全9コンポーネントのテスト(95テストケース)
- テストカバレッジ22-23%を達成 ✅ 達成(2025-12-27)
- テストカバレッジ24-25%を達成 ✅ 達成(2025-12-31)
- Header系コンポーネントのテスト追加(9ファイル、108テストケース)
- テストカバレッジ30%を達成 ✅ 大幅超過達成(約81%、2026-01-05確認)
- 都営バスTTSテスト追加(useBusTTSText.test.tsx)
- SelectBoundModalテスト追加
- 742テストケース達成
- Firebase関連ライブラリのアップデート計画策定 ✅ 完了(^23.7.0に更新済み)
- パフォーマンス最適化(メモ化導入) ✅ 完了(2025-12-31、757箇所以上で使用中)
- 状態管理の統一 ✅ 完了(2025-12-31、zustand削除・Jotai統一)
- テストカバレッジ30%達成 ✅ 大幅超過達成(約81%)
- コンポーネント重複の完全解消
-
lineSymbolImage.tsのデータ化 ✅ 完了(2025-12-31、PR #4862) - カスタムフックの整理とドキュメント化
- アクセシビリティ対応の全面的な強化
- プラットフォーム固有コードの最小化
| 日付 | 更新内容 |
|---|---|
| 2025-12-25 | 初版作成(包括的な技術負債調査) |
| 2025-12-25 | LineBoard系コンポーネントの重複削減を実施(907行削減) 共通コンポーネント3つ(LineDot、StationName、EmptyStationNameCell)を作成 共通フック3つ(useBarStyles、useChevronPosition、useIncludesLongStationName)を作成 包括的なテストカバレッジ(6ファイル、49テストケース)を追加 都営テーマの多言語対応を維持(StationNameToeiコンポーネント作成) 4ファイルで適用完了(LineBoardEast、Saikyo、JRKyushu、Toei) |
| 2025-12-26 | プロジェクト統計を更新(ファイル数、テスト数、カバレッジを最新化) テストカバレッジ大幅向上: 15% → 17%(38個の新規テストケース追加) ビジネスクリティカルなフックのテスト追加(useCurrentStation、useCurrentLine、useNextStation等) Header系コンポーネントの改善開始:共通フック3つ作成(useHeaderLangState、useHeaderStateText、useHeaderStationText) 型の統一(Station | undefined)実施 依存関係の更新: dayjsを最新版(^1.11.19)に更新完了 次のアクションアイテムを進捗に応じて更新 |
| 2025-12-27 | NumberingIcon系コンポーネントのテスト完全追加 テストカバレッジ大幅向上: 17% → 20%(130個の新規テストケース追加) 全26個のNumberingIconコンポーネントに包括的なユニットテスト追加 各コンポーネントのレンダリング、Props処理、サイズバリアント、特殊ケースをテスト Biome lintエラー完全解消(未使用import削除、any型をunknown型に置換) CodeRabbit指摘対応完了(PR #4797): - afterEachフック追加(全26ファイル) - Weak assertions修正(UNSAFE_root → getByText) - withOutlineテスト改善(実際のコンテンツ検証) - LARGEサイズバリアントテスト追加 - 冗長テストケース削除 プロジェクト統計を更新(テストファイル50 → 76、カバレッジ17% → 20%) 次のマイルストーンをテストカバレッジ25%に設定 LineBoard系コンポーネントのテスト完全追加(PR #4799) テストカバレッジさらに向上: 20% → 22-23%(95個の新規テストケース追加) 全9個のLineBoardコンポーネントに包括的なユニットテスト追加 - LineBoard.test.tsx(9テスト) - LineBoardEast.test.tsx(9テスト) - LineBoardJO.test.tsx(10テスト) - LineBoardJRKyushu.test.tsx(13テスト) - LineBoardLED.test.tsx(15テスト) - LineBoardSaikyo.test.tsx(10テスト) - LineBoardToei.test.tsx(10テスト) - LineBoardWest.test.tsx(10テスト) - LineBoardYamanotePad.test.tsx(10テスト) 各コンポーネントのヘッダー状態遷移、駅情報表示、路線情報、英語表示対応をテスト CodeRabbit指摘対応完了(PR #4799): - jest.clearAllMocks()をbeforeEachからafterEachに移動(全9ファイル) - Jestベストプラクティスに準拠(テスト後クリーンアップ) プロジェクト統計を更新(テストファイル76 → 85、カバレッジ20% → 22-23%) LineBoardコンポーネントのテスト完了により品質保証を強化 |
| 2025-12-28 | LineBoard系テストの品質向上(PR #4799追加改善) CodeRabbit指摘への追加対応完了: - Weak assertions強化: LineBoardSaikyoテストで toBeTruthy()のみの検証をexpect.objectContaining()による具体的なprops検証に改善(StationName、LineDot、ChevronTY、lineColors関連テスト)- テスト名とロジックの不一致修正(4ファイル): • "chevronの色が交互に切り替わる" → "useIntervalフックが1秒間隔で呼ばれる"(実際はuseIntervalの呼び出しのみ検証) • "駅数が8未満の場合、空の配列で埋められる" → "駅数が8未満の場合でもエラーなくレンダリングされる"(実際はレンダリング成功のみ検証) • "arrived状態でChevronが表示される" → "arrived=falseの場合、ChevronJRWestが表示される"(実際はarrived=falseで検証) - 対象ファイル: LineBoardSaikyo.test.tsx、LineBoardJRKyushu.test.tsx、LineBoardToei.test.tsx、LineBoardWest.test.tsx、LineBoardJO.test.tsx テスト名が実際のテストロジックと完全に一致し、テストの意図が明確化 アサーションの具体性向上により、コンポーネントの動作をより厳密に検証 全85テストスイート、551テスト合格を維持 |
| 2025-12-31 | 依存関係の更新遅延を解消 負債ドキュメントに記載の3パッケージを最新版に更新: - @react-native-community/cli: ^15.1.2 → ^20.0.2 - @sentry/react-native: ~7.2.0 → ~7.8.0 - effect: ^3.16.12 → ^3.19.13 lint、typecheck、test全てパスを確認(555テスト合格) 計画的な更新が必要なパッケージが0件に FlatListの最適化完了 - removeClippedSubviewsを5ファイルに追加(Android): Transfers.tsx、TransfersYamanote.tsx、StationSearchModal.tsx、RouteInfoModal.tsx、TrainTypeListModal.tsx- SelectLineScreenPresets.tsxのメモ化改善: renderItem、keyExtractor、onScroll、ListEmptyComponentをuseCallback/useMemoでラップ、ItemSeparatorComponentをReact.memoでラップFlatListの最適化によりAndroidでのスクロールパフォーマンスが向上 iOS依存関係の更新 (chore/bump-deps) - @react-native-community/cli: Expo SDK 54への移行に伴い削除 - 各種パッケージを最新版に更新 Header系コンポーネントのテスト完全追加 テストカバレッジ向上: 22-23% → 24-25%(108個の新規テストケース追加) 全9個のHeaderコンポーネントに包括的なユニットテスト追加: - Header.test.tsx(13テスト): テーマに基づくHeaderコンポーネント選択 - HeaderLED.test.tsx(12テスト): LED表示のヘッダー状態遷移 - HeaderTokyoMetro.test.tsx(14テスト): 東京メトロスタイルのアニメーション・状態 - HeaderJRWest.test.tsx(26テスト): JR西日本スタイル、多言語対応、列車種別 - HeaderJRKyushu.test.tsx(14テスト): JR九州スタイルの状態遷移 - HeaderTY.test.tsx(15テスト): 東急スタイルのダークテーマ - HeaderSaikyo.test.tsx(14テスト): 埼京線スタイル、時計表示、路線色 各コンポーネントのレンダリング、ヘッダー状態遷移、終点駅・始発駅対応、多言語対応をテスト プロジェクト統計を更新(テストファイル85 → 92、テストケース555 → 663、カバレッジ22-23% → 24-25%) 全92テストスイート、663テスト合格を確認 状態管理をJotaiに統一 (zustand完全削除) - zustand依存をpackage.jsonから削除 - useThemeStore → themeAtom (src/store/atoms/theme.ts) に移行 - useLocationStore → locationAtom (src/store/atoms/location.ts) に移行(以前に完了) - useTuningStore → 使用箇所なしのため削除 - 派生atom isLEDThemeAtom を追加(theme === APP_THEME.LED パターンを簡略化)- 40+ファイルでuseThemeStoreをuseAtomValue(themeAtom)に更新 - テストファイル5つをjotaiモックに更新 - Permitted.tsxでsetTheme依存関係を修正 状態管理の混在問題を完全解決、保守性と学習コストが大幅改善 |
| 2026-01-02 | Header系コンポーネントの構造大幅改善 約1,800行のコード削減(純減約677行)を達成: - HeaderTokyoMetro.tsx: 660行 → 306行(354行削減) - HeaderJRKyushu.tsx: 638行 → 287行(351行削減) - HeaderTY.tsx: 633行 → 293行(340行削減) - HeaderSaikyo.tsx: 585行 → 284行(301行削減) - HeaderE235.tsx: 405行 → 239行(166行削減) - HeaderJL.tsx: 409行 → 246行(163行削減) - HeaderJRWest.tsx: 656行 → 535行(121行削減) 新しい共通フック・ファイルを作成: - useHeaderAnimation.ts(206行): アニメーションロジックを共通化 - useHeaderCommonData.ts(123行): 共通データ取得ロジックを集約 - Header.types.ts(72行): 共通型定義を作成 - useTransitionHeaderState.ts: 機能拡張 データ上に存在しない英中韓駅名のスキップ対応 多言語表示の堅牢性が向上、駅データにない言語を自動スキップ テストケース増加: Header系テスト108 → 128テストケース 全92テストスイート、663テスト合格を維持 コード削減目標約25%を達成 |
| 2026-01-05 | プロジェクト統計を更新 - 総ファイル数: 382 → 398個 - 本番コード: 297 → 302ファイル - テストファイル: 92 → 96個 - コンポーネント数: 107 → 110個 - スクリーン数: 9 → 10個(Licenses.tsx追加) テストカバレッジ大幅向上確認 - カバレッジ: 24-25% → 約81%(Lines coverage) - テストケース: 663 → 742個 - テストスイート: 92 → 96個 都営バス対応機能追加(2026-01-02〜01-05) - 駅リストでバス停以外はバス停の乗換案内を隠す機能 - 座標検索クエリからtransportType: TransportType.Rail削除 - 都営バス対応UI改善 - isBusLineヘルパー実装 - 路線リストに都営バス見出し追加 - バスの乗換案内はTTSで流さない機能 - useBusTTSText.test.tsx追加 ライセンス画面追加 - Licenses.tsx新規作成(スクリーン数9 → 10) - READMEにライセンス表示追加 - prodでも都営交通ライセンス表示 その他改善 - 縦画面向けのナンバリング改修 - SelectBoundModal.test.tsx追加 LineBoardの残りファイルへの共通フック適用 - LineBoardWest.tsx: useIncludesLongStationNameフックを適用(621行 → 616行、5行削減) - LineBoardJO.tsx: useIncludesLongStationNameフックを適用(482行 → 477行、5行削減) - LineBoardLED, YamanotePadは構造が異なるため適用対象外と判断 (LED: マーキーテキスト表示、YamanotePad: PadArchに委譲) - 合計約917行のコード削減達成(6ファイルで共通化完了) LineBoardWest/JOのローカルスタイル共通化 - LineBoardWest.tsx: 617行 → 510行(107行削減) • ローカルStyleSheet.create(110行)を削除 • commonLineBoardStylesのバリアントを使用 - LineBoardJO.tsx: 478行 → 383行(95行削減) • ローカルStyleSheet.create(102行)を8行に縮小 • commonLineBoardStylesとマージして使用 - commonStyles.ts: 89行 → 307行(24個のWest/JO用バリアント追加) • BAR_BOTTOM_WEST, BAR_BOTTOM_JO, BAR_TERMINAL_BOTTOM_JO定数 • rootWestJO, barWest, barJO, barTerminalWest, barTerminalJO • stationNameWrapper, stationNameWrapperJO • stationNameContainerWestJO, stationNameContainerJO • stationNameWest, stationNameJO, stationNameEn, stationNameEnJO • chevronWest, chevronJO, lineDotWest • arrivedLineDotWest, arrivedLineDotJO, topBarWest, passMarkWest • numberingContainerWest, numberingTextWest, barDotJO, passChevronJO等 - 合計約1,119行のコード削減達成(LineBoardコンポーネント全体) |
| 2026-01-06 | テストカバレッジ詳細分析実施 テストケース: 742 → 802個、テストスイート: 96 → 98個に更新 カバレッジ詳細(2026-01-06計測) - Statements: 80.27% (2,483/3,093) - Branches: 56.07% (2,318/4,134) - Functions: 82.76% (653/789) - Lines: 80.67% (2,417/2,996) ブランチカバレッジ低下原因を特定 - 原因1: テストが存在しないフック(54個中27個のみテスト有) • useCanGoForward.ts (0%), useThreshold.ts (0%), useInRadiusStation.ts (0%)等 - 原因2: JSX内の条件分岐(三項演算子・論理演算子)の網羅不足 • HeaderJRWest.tsx (15.6%), HeaderLED.tsx (18.6%), NumberingIcon.tsx (25.58%) - 原因3: ユーティリティ関数のnullish合体演算子 • trainTypeString.ts (16.66%), line.ts (28.57%) - 原因4: 自動生成コード(graphql.ts/d.ts)はテスト対象外 - 原因5: 早期リターン・nullチェックの分岐テスト不足 ブランチカバレッジ改善のためのテスト追加(3ファイル、30テストケース) - useThreshold.test.tsx(10テスト): 距離計算ロジックの全分岐をカバー • currentStation/nextStationがnullの場合のデフォルト閾値 • 座標(latitude/longitude)がnullの場合 • 駅間距離が短い/長い場合の閾値計算 - useCanGoForward.test.tsx(9テスト): ナビゲーション判定の全分岐をカバー • 環状線(山手線/大阪環状線/名城線)の判定 • 次の駅存在時/終点停車時の判定 • currentStation/nearestStationがundefinedの場合 - useInRadiusStation.test.tsx(11テスト): 位置判定の全分岐をカバー • 位置情報/座標がnullの場合 • 半径内/外の駅マッチング • 駅座標がnullの場合のスキップ処理 プロジェクト統計を更新(テストファイル98 → 101、テストケース802 → 832) 高優先のブランチカバレッジ改善アクションを完了 |