ADR-001: 重複コード解消のためのヘルパー関数整備
Status
Proposed
Context
コードレビューにおいて、複数のコマンドファイル(add.js, install.js, remove.js, update.js, list.js)で以下の重複パターンが特定された:
- ファイルシステム操作の重複: ディレクトリ作成、パス結合、ファイル存在確認
- 設定ファイル操作の重複: config/lockファイルの読み込み・保存パターン
- リポジトリパス処理の重複: リポジトリキー解析処理
- lock-helpers.js使用の不統一: 一部のコマンドで新しいヘルパー関数が未使用
これらの重複により、保守性の低下とコードの一貫性の欠如が発生している。
Decision
重複コードを解消するため、以下の方針で共通ヘルパー関数を整備する:
1. 新規ファイルの作成
src/utils/command-helpers.js: コマンド共通処理のヘルパー関数群
tests/utils/command-helpers.test.js: 対応するテストファイル
2. 既存ファイルの拡張
src/utils/filesystem.js: ファイルシステム操作関数の追加
src/types/index.d.ts: 型定義の追加
3. 主要なヘルパー関数
setupCommandEnvironment(isLocal): 設定ファイル一括読み込み
createRepositoryPaths(commandsDir, user, repo): リポジトリパス情報作成
saveCommandEnvironment(env, isLocal): 設定ファイル一括保存
parseRepositoryKey(repoKey): リポジトリキー解析の統一
createCommandFilePath(targetDir, fileName): コマンドファイルパス生成
機能要件
FR1: ファイルシステム操作の統一化
- 目的: 複数のコマンドで重複するファイルシステム操作を共通化
- 制約: 既存APIの互換性を維持
FR2: 設定ファイル操作の統一化
- 目的: 設定ファイルの読み込み・保存パターンを共通化
- 制約: 既存のconfig.jsの関数との互換性を維持
FR3: リポジトリパス処理の統一化
- 目的: リポジトリキーの解析処理を統一
- 制約: 既存のparseRepositoryPath関数との互換性を維持
FR4: lock-helpers.js使用の統一化
- 目的: 全コマンドでlock-helpers.jsの関数を使用
- 対象: add.js, update.js, list.js
FR5: 包括的なテストカバレッジ
- 目的: 新しいヘルパー関数の品質保証
- 要件: ユニットテスト、エッジケーステスト、既存テスト更新
基本設計
モジュール構成
command-helpers.js
├── config.js (既存)
├── filesystem.js (拡張)
├── lock-helpers.js (既存)
└── 各コマンドファイル (add.js, install.js, etc.)
型定義
interface CommandEnvironment {
config: CccscConfig;
lock: CccscLock;
commandsDir: string;
}
interface RepositoryPathInfo {
user: string;
repo: string;
repoKey: string;
targetDir: string;
}
詳細設計
技術選定
- JavaScript (ES6+): 既存コードベースとの統一
- fs-extra: 既存ファイルシステム操作との統一
- Vitest: 既存テストフレームワークとの統一
インターフェース設計
各ヘルパー関数は純粋関数として設計し、副作用を最小限に抑制。エラーハンドリングは適切な例外スローにより実現。
ユニットテスト方針
- 各ヘルパー関数に対する包括的なテスト
- エッジケース(無効な入力、ファイルシステムエラー)のテスト
- 既存テストの更新とモック対象の調整
移行計画
- Phase 1: ヘルパー関数の実装とテスト
- Phase 2: add.jsの移行
- Phase 3: install.js, remove.js, update.jsの移行
- Phase 4: list.jsの移行とlock-helpers.js統合
Consequences
正の影響
- 保守性向上: 重複コードの削減により、変更の影響範囲が明確化
- 一貫性確保: 統一されたAPIにより、コードの読みやすさが向上
- テスタビリティ向上: 共通関数の独立したテストが可能
負の影響
- 初期実装コスト: 新しいヘルパー関数の実装と既存コードの移行
- 学習コスト: 開発者が新しいAPIを習得する必要
リスク
- 移行時の回帰: 既存機能の動作変更のリスク(包括的なテストで軽減)
- 複雑性の増加: 抽象化レイヤーの追加(明確なインターフェース設計で軽減)
実装チェックリスト
ADR-001: 重複コード解消のためのヘルパー関数整備
Status
Proposed
Context
コードレビューにおいて、複数のコマンドファイル(add.js, install.js, remove.js, update.js, list.js)で以下の重複パターンが特定された:
これらの重複により、保守性の低下とコードの一貫性の欠如が発生している。
Decision
重複コードを解消するため、以下の方針で共通ヘルパー関数を整備する:
1. 新規ファイルの作成
src/utils/command-helpers.js: コマンド共通処理のヘルパー関数群tests/utils/command-helpers.test.js: 対応するテストファイル2. 既存ファイルの拡張
src/utils/filesystem.js: ファイルシステム操作関数の追加src/types/index.d.ts: 型定義の追加3. 主要なヘルパー関数
setupCommandEnvironment(isLocal): 設定ファイル一括読み込みcreateRepositoryPaths(commandsDir, user, repo): リポジトリパス情報作成saveCommandEnvironment(env, isLocal): 設定ファイル一括保存parseRepositoryKey(repoKey): リポジトリキー解析の統一createCommandFilePath(targetDir, fileName): コマンドファイルパス生成機能要件
FR1: ファイルシステム操作の統一化
FR2: 設定ファイル操作の統一化
FR3: リポジトリパス処理の統一化
FR4: lock-helpers.js使用の統一化
FR5: 包括的なテストカバレッジ
基本設計
モジュール構成
型定義
詳細設計
技術選定
インターフェース設計
各ヘルパー関数は純粋関数として設計し、副作用を最小限に抑制。エラーハンドリングは適切な例外スローにより実現。
ユニットテスト方針
移行計画
Consequences
正の影響
負の影響
リスク
実装チェックリスト
src/utils/command-helpers.jsの実装src/utils/filesystem.jsの拡張src/types/index.d.tsの型定義追加tests/utils/command-helpers.test.jsの実装tests/utils/filesystem.test.jsの更新add.jsの移行install.jsの移行remove.jsの移行update.jsの移行list.jsの移行とlock-helpers.js統合