Skip to content

Latest commit

 

History

History
953 lines (794 loc) · 57.7 KB

File metadata and controls

953 lines (794 loc) · 57.7 KB

技術負債リスト

プロジェクト: TrainLCD Mobile App 作成日: 2025-12-25 最終更新: 2026-01-06(テストカバレッジ改善・統計更新)

📊 概要

プロジェクト統計

  • 総ファイル数: 398個のTypeScript/TSXファイル
  • 本番コード: 302ファイル
  • テストファイル: 110ファイル
  • カバレッジ: 約83.3%(Lines coverage、977テストケース)
  • コンポーネント数: 110個
  • カスタムフック数: 78個
  • スクリーン数: 10個

🔴 最重要(1-3ヶ月以内に対応)

1. コンポーネントの大規模な重複 ✨ 大幅改善

深刻度: 🟡 中(以前は🔴最高) 推定工数: 残り2-4週間(以前は8-12週間) 影響範囲: 保守性、開発速度、バグ発生率

問題の詳細

類似機能を持つコンポーネントが大量に存在していましたが、LineBoard系・Header系の共通化により約3,000行以上のコード削減を達成。残りはNumberingIcon系の統一が主な課題です。

LineBoard系コンポーネント(9種類、4,669行)✨ 改善済み・テスト完了
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コンポーネントに委譲しているため、共通コンポーネントの適用対象外
Header系コンポーネント(11種類)✨ 大幅改善・テスト完了
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系コンポーネント(26種類)✨ テスト完了
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)
    • 冗長・意味のないテストケースを削除
    • プロジェクトコーディングガイドライン完全準拠

影響

  • バグ修正時に複数箇所の修正が必要
  • 新機能追加時のコスト増大(各バリエーションに個別実装が必要)
  • テストコード量の増大
  • コードレビューの困難

推奨アクション

  1. 共通ロジックの抽出とカスタムフックへの移行完了(2025-12-25)
    • ✅ LineDot、StationName、EmptyStationNameCellコンポーネントを共通化
    • ✅ useBarStyles、useChevronPosition、useIncludesLongStationNameフックを共通化
    • ✅ 共通スタイル定義を抽出
    • ✅ 49テストケースを追加(共通コンポーネント・フックの包括的なテスト)
    • ✅ 都営テーマの多言語対応を維持(StationNameToeiコンポーネント)
  2. さらなるスタイル共通化完了(2026-01-05)
    • ✅ LineBoardWest/JOのローカルスタイルを共通化(約200行削減)
    • ✅ commonStyles.tsに25個のWest/JO用バリアントを追加
  3. テーマベースのpropsシステムに統一(中期目標)
    • 各鉄道会社/路線のスタイルをテーマとして定義
    • 単一のHeader/LineBoard/NumberingIconコンポーネントに統合
  4. コンポーネントコンポジションパターンの導入
    • 共通のロジックをベースコンポーネントに集約
    • バリエーションをpropsで制御

期待される効果

  • コード削減: 5,000-7,000行(20-25%)
    • 達成済み: 約1,119行削減(LineBoardコンポーネント共通化)
    • 追加達成: LineBoardWest/JOのローカルスタイル共通化で約200行削減
  • 開発速度: 新機能開発時間40%削減
    • 一部達成: 共通コンポーネントにより、4つのLineBoardで同時にバグ修正・機能追加が可能
  • バグ削減: 修正漏れのリスク大幅減少
    • 達成: 重複コードが1箇所に集約され、修正漏れリスクが大幅減少
  • テストカバレッジ向上:
    • 達成: 共通コンポーネント・フックに49テストケースを追加(カバレッジ15%に向上)

2. テストカバレッジの状況 ✅ 大幅改善

深刻度: 🟢 良好(以前は🔴最高) 推定工数: 継続的な改善 影響範囲: 品質、リグレッション防止

現状

本番コード:     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%に向上)

⚠️ ブランチカバレッジが低い原因分析(2026-01-06)

全体: Branchカバレッジが58.6%と他の指標(83%超)に比べて低い状態です。

原因1: テストが存在しないフック(54個中33個テスト有)

以下のフックにはテストファイルが存在せず、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
原因2: JSX内の条件分岐(三項演算子・論理演算子)

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種類のアイコンタイプ分岐
原因3: ユーティリティ関数のnullish合体演算子(??)・OR演算子(||)
~~trainTypeString.ts      (16.66% branch)~~ → ✅ **テスト追加済み**(44テスト)
~~line.ts                 (28.57% branch)~~ → ✅ **テスト拡充済み**(17テスト追加)
truncateTrainType.ts    (42.85% branch)
原因4: 自動生成コード
graphql.ts, graphql.d.ts (0% branch) - GraphQL Codegenで自動生成、テスト対象外
原因5: 早期リターン・nullチェックの分岐
useBounds.ts            (39.39% branch) - 早期リターン4箇所
useRefreshStation.ts    (42.3% branch) - nullチェック多数
useTelemetrySender.ts   (38.46% branch) - WebSocket状態管理の分岐
ブランチカバレッジ改善の推奨アクション
  1. 高優先: テストが存在しない重要フックにテスト追加完了(2026-01-06)
    • useThreshold.ts - 距離計算ロジックのテスト10テスト追加
    • useCanGoForward.ts - ナビゲーション判定のテスト9テスト追加
    • useInRadiusStation.ts - 位置判定のテスト11テスト追加
  2. 高優先: 残りの重要フックにテスト追加完了(2026-01-06)
    • useSlicedStations.ts - 駅リストのスライス処理15テスト追加
    • useBoundText.ts - 行先テキスト生成10テスト追加
    • useDistanceToNextStation.ts - 次駅までの距離計算11テスト追加
  3. 高優先: 残りのフックにテスト追加完了(2026-01-06)
    • useAutoMode.ts - 自動モード判定9テスト追加
    • useFirstStop.ts - 始発駅判定7テスト追加
    • useIsPassing.ts - 通過判定8テスト追加
    • useNextLine.ts - 次路線取得4テスト追加
    • useNumbering.ts - 駅番号取得7テスト追加
  4. 中優先: Header系コンポーネントの条件分岐テスト拡充
    • 各言語(日/英/中/韓)でのレンダリングテスト
    • 各ヘッダー状態(CURRENT/NEXT/ARRIVING)でのテスト
  5. 低優先: ユーティリティ関数のエッジケーステスト
    • null/undefined入力時の動作テスト
    • デフォルト値が使われるケースのテスト

テストが存在しないクリティカルなコンポーネント

  • 9つのLineBoardコンポーネント: テスト0個 → ✅ 完了(9ファイル、95テストケース追加)
  • 27つのNumberingIconコンポーネント: テスト0個 → ✅ 完了(26ファイル、124テストケース追加)
  • 多くのHeader系コンポーネント: 2個のみテスト有 → ✅ 完了(9ファイル、108テストケース追加)
  • 重要な画面: Main、SelectLineScreen等

推奨アクション

  1. 短期(1ヶ月): ビジネスクリティカルなロジックのテストを優先完了(2025-12-27)
    • ✅ 状態管理(hooks): useCurrentStation、useCurrentLine等にテスト追加済み
    • ✅ UI コンポーネント: NumberingIcon系26コンポーネントにテスト追加済み
    • ✅ データ変換ロジック: 複数のutilsにテスト追加済み
    • ✅ 位置情報処理: useNearestStationにテスト追加済み
  2. 中期(3ヶ月): 最低30%のカバレッジを目標設定大幅超過達成(約81%)
  3. 継続: 新規コードには必ずテスト追加のルール維持・カバレッジ80%以上を維持

達成された効果

  • バグ検出率: 大幅向上(Linesカバレッジ82.6%達成)
  • リグレッション防止: CI/CDでの自動検知が有効
  • リファクタリングの安全性向上: 906テストケースで担保
  • ⚠️ 課題: ブランチカバレッジ57.68%は改善の余地あり(目標: 70%以上)

3. 依存関係の更新遅延

深刻度: 🔴 高(セキュリティリスク) 推定工数: 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)
🟢 継続的な監視が必要

現時点で計画的な更新が必要なパッケージはありません。四半期ごとの依存関係レビューを継続してください。

推奨アクション

  1. 今週中: dayjsを最新版にアップデート完了(2025-12-26以前)
  2. 1ヶ月以内: Firebase関連を計画的にアップデート完了(^23.7.0に更新済み)
  3. 計画的な更新: @sentry/react-native、effectをアップデート完了(2025-12-31)
    • @react-native-community/cli: Expo SDK 54への移行に伴い削除済み
  4. 継続的: 四半期ごとの依存関係レビュープロセスの確立

🟠 高優先(3-6ヶ月以内に対応)

4. パフォーマンス最適化 ✅ 大幅改善

深刻度: 🟢 低(以前は🟠高) 推定工数: 継続的な最適化 影響範囲: ユーザー体験、バッテリー消費

メモ化の状況 ✅ 改善済み

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箇所)

残りの改善余地

  1. パフォーマンスプロファイリングによる継続的な改善

FlatListの最適化 ✅ 改善済み

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のメモ化改善:
    • renderItemuseCallbackでラップ
    • keyExtractoruseCallbackでラップ
    • onScrolluseCallbackでラップ
    • ListEmptyComponentuseMemoでラップ
    • ItemSeparatorComponentReact.memoでラップ

残りの推奨アクション:

  1. 固定高さのアイテムにはgetItemLayoutを実装(アイテムが可変サイズのため一部は対象外)
  2. windowSizeプロパティの最適化

期待される効果

  • 再レンダリング削減: 30-50%
  • リストスクロール高速化: 30%
  • バッテリー消費削減: 測定必要

5. 状態管理の混在 ✅ 解決済み

深刻度: 🟢 解決済み(以前は🟠高) 推定工数: 2-3週間 → 完了 影響範囲: 保守性、学習コスト

問題の詳細(解決済み)

2つの異なる状態管理ライブラリが混在Jotaiに統一完了

Zustand: 3箇所のみで使用 → ✅ 削除済み(2025-12-31)
// 以下のファイルは全て削除され、Jotaiに移行完了:
// src/hooks/useTuningStore.ts → 削除(使用箇所なし)
// src/hooks/useThemeStore.ts → src/store/atoms/theme.ts に移行
// src/hooks/useLocationStore.ts → src/store/atoms/location.ts に移行(以前に完了)
Jotai: 110+ファイルで使用(唯一の状態管理ライブラリ)
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

達成済みの改善(2025-12-31)

  • zustand依存を完全削除: package.jsonから削除
  • useThemeStore → themeAtom: 40+ファイルで更新
  • useLocationStore → locationAtom: React外部からの状態更新も対応
  • 派生atom追加: isLEDThemeAtomtheme === APP_THEME.LEDパターンを簡略化
  • テストファイル更新: jotaiモックに統一
  • lint/typecheck通過: 全て成功

影響 → 解決済み

  • 状態管理の一貫性がない → ✅ Jotaiに統一
  • 新規開発者がどちらを使うべきか混乱 → ✅ Jotaiのみ使用
  • デバッグが困難(2つのDevToolsを使用) → ✅ Jotai DevToolsのみ

推奨アクション → 完了

  1. 状態管理をJotaiに統一完了
  2. 状態管理のガイドライン文書を作成(任意)
  3. Zustandで管理している3つの状態をJotaiに移行完了

6. 巨大ファイルの分割

深刻度: 🟠 中 推定工数: 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行) - 画面

✅ 改善完了: src/lineSymbolImage.ts(1,069行 → 707行、362行削減)

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>で型定義

推奨アクション(残り)

  1. lineSymbolImage.tsをJSONマッピングファイルに変換完了(オブジェクト形式に改善済み)
  2. useTTSText.tsを複数の小さなフックに分割
    • useTTSTextStation.ts
    • useTTSTextTransfer.ts
    • useTTSTextBound.ts
  3. 大きなコンポーネントを機能別に分割

🟡 中優先(6-12ヶ月以内に対応)

7. カスタムフックの過剰な増殖

深刻度: 🟡 中 推定工数: 2-3週間 影響範囲: 保守性、学習コスト

現状

78個のカスタムフックが存在し、依存関係が複雑:

useAfterNextStation, useAndroidWearable, useAnonymousUser,
useAppleWatch, useAutoMode, useBadAccuracy, useBounds,
useBoundText, useCachedInitAnonymousUser, useCanGoForward,
useCheckStoreVersion, useClock, useConnectedLines,
useConnectivity, useCurrentLine, useCurrentStation,
useCurrentTrainType, useDeepLink, useDistanceToNextStation,
... (他52個)

問題点

  • フックの責任範囲が不明確
  • 循環依存のリスク
  • テストが困難
  • 新規開発者の学習コスト増大

推奨アクション

  1. フックを機能別にグルーピング
    • 位置情報系: hooks/location/
    • 駅情報系: hooks/station/
    • UI状態系: hooks/ui/
    • デバイス連携系: hooks/devices/
  2. 使用頻度の低いフックの統合検討
  3. フックの命名規則とドキュメント整備
  4. 依存関係の可視化(dependency graph)

8. プラットフォーム固有コードの散在

深刻度: 🟡 中 推奨工数: 1-2週間 影響範囲: 保守性、テスト容易性

問題の詳細

70箇所でPlatform.selectPlatform.OSを使用:

fontSize: isTablet ? RFValue(24) : RFValue(21),
lineHeight: Platform.select({
  android: isTablet ? RFValue(24) : RFValue(21),
  ios: undefined,
}),

影響

  • プラットフォーム固有のロジックがコンポーネント全体に散在
  • Android/iOSの動作差異のテストが困難
  • プラットフォーム間の一貫性が保ちにくい

推奨アクション

  1. プラットフォーム固有のスタイルをユーティリティに集約
    // utils/platform.ts
    export const platformLineHeight = (size: number) =>
      Platform.select({ android: size, ios: undefined });
  2. プラットフォーム分岐を最小化
  3. プラットフォーム別のテストケースを追加

9. アクセシビリティの不足

深刻度: 🟡 中 推定工数: 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のアクセシビリティ要件に不適合の可能性

推奨アクション

  1. 重要なインタラクティブ要素に対応(優先)
    • ボタン、リンク、入力フィールド
    • accessibilityLabelaccessibilityRoleaccessibilityHintを追加
  2. フォーカス管理の実装
  3. アクセシビリティテストの自動化(@testing-library/react-native

🟢 低優先(必要に応じて対応)

10. インラインスタイルの使用

深刻度: 🟢 低 推定工数: 2-3週間 影響範囲: パフォーマンス(軽微)

問題の詳細

69ファイルでインラインスタイルが使用されており、わずかなパフォーマンス影響:

// インラインスタイル(最適化されない)
<View style={{ flex: 1, backgroundColor: 'white' }}>

// StyleSheet.create(最適化される)
<View style={styles.container}>

推奨アクション

  1. StyleSheet.createへの段階的な移行
  2. 動的スタイルのみインラインスタイルを許可
  3. Lintルールで新規インラインスタイルを検出

11. TODOコメントの解消

深刻度: 🟢 低 推定工数: 1週間 影響範囲: コード品質

既存のTODO(わずか2件)

  1. src/components/HeaderJRWest.tsx:514

    case '新快速':
      // TODO: 東海の新快速と同じにならないようにしたい
      return fetchJRWSpecialRapidLogo();

    推奨: JR東海とJR西日本の新快速ロゴを区別する実装

  2. src/screens/Main.tsx:463

    // TODO: 実装し直す
    if (isDevApp) {
      Alert.alert('Unimplemented', 'This feature is not implemented yet.');
    }

    推奨: このTODOの具体的な内容を明確化。機能が未実装のままリリースされている可能性


12. 環境変数管理

深刻度: 🟢 良好 ✅

現状

環境変数は適切に管理されています:

定義されている環境変数(src/@types/react-native-dotenv.d.ts
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で適切に除外
  • シークレットがコードにハードコーディングされていない ✅

推奨: 現状維持。必要に応じて環境変数の検証ロジック追加


✅ 良好な点

以下の点は技術的に優れており、継続すべきです:

1. 型安全性 ✅

  • @ts-ignore: 0回使用
  • @ts-expect-error: 0回使用
  • @ts-nocheck: 0回使用
  • TypeScriptのany型: ほぼ使用なし(テストコードのみ一部使用)
  • 型定義が適切に行われている

2. モダンなReact実践 ✅

  • すべて関数コンポーネント + Hooksで実装
  • 非推奨なライフサイクルメソッドなし:
    • componentWillMount
    • componentWillReceiveProps
    • componentWillUpdate
    • UNSAFE_*系メソッド ❌

3. コンソールログの除去 ✅

  • 本番コードにconsole.logconsole.warnconsole.errorconsole.debugが存在しない

4. Linter/Formatter ✅

  • 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を具体化

1ヶ月以内

  • 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に更新済み)

3ヶ月以内

  • パフォーマンス最適化(メモ化導入) ✅ 完了(2025-12-31、757箇所以上で使用中)
  • 状態管理の統一 ✅ 完了(2025-12-31、zustand削除・Jotai統一)
  • テストカバレッジ30%達成 ✅ 大幅超過達成(約81%)

6ヶ月以内

  • コンポーネント重複の完全解消
  • lineSymbolImage.tsのデータ化 ✅ 完了(2025-12-31、PR #4862)
  • カスタムフックの整理とドキュメント化

12ヶ月以内

  • アクセシビリティ対応の全面的な強化
  • プラットフォーム固有コードの最小化

📝 更新履歴

日付 更新内容
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)
高優先のブランチカバレッジ改善アクションを完了

📚 参考リソース