質問
ドメイン層のサービス実装において、以下の 2 つのパターンのどちらを採用すべきか判断に迷っています。
現状の 2 つのパターン
パターン 1: 依存性注入が必要な場合(ファクトリ関数)
domain/ └── service.ts
typescript
1// domain/service.ts 2export function createServiceA(database: DatabaseFacade): ServiceA { 3 return { 4 async updateData(id: string, value: boolean): Promise<void> { 5 await database.update(id, value); 6 }, 7 async getData(): Promise<Data[]> { 8 return await database.getAll(); 9 }, 10 }; 11}
パターン 2: 依存性注入が不要な場合(関数群)
domain/ └── services/ └── processor.ts
typescript
1// domain/services/processor.ts 2export function processData(input: Input[]): Output[] { 3 return input.map((item) => ({ 4 id: item.id, 5 value: transform(item.value), 6 })); 7} 8 9function transform(value: string): string { 10 return value.toUpperCase(); 11} 12 13function validate(input: Input): boolean { 14 return input.id.length > 0; 15}
検討している 2 つの選択肢
選択肢 A: 全部ファクトリ関数で統一
domain/ └── service.ts // すべてのサービスをここに
typescript
1// 依存性あり 2createServiceA(database); 3 4// 依存性なし(空の引数でもOK) 5createProcessorService();
メリット:
- 統一されたパターンで一貫性がある
- 将来的に依存性が追加されても変更が少ない
デメリット:
- 依存性がないのにファクトリ関数にするのは不自然かもしれない
- 純粋関数をわざわざオブジェクトに包む必要がある
選択肢 B: 依存性の有無で区分
domain/ ├── service.ts // 依存性あり → ファクトリ関数 └── services/ └── processor.ts // 依存性なし → 関数群
typescript
1// 依存性あり → ファクトリ関数 2createServiceA(database); 3 4// 依存性なし → 関数群 5processData(input);
メリット:
- 依存性の有無がコードから明確に分かる
- 純粋関数はそのまま関数として定義できてシンプル
- 不要な抽象化を避けられる
デメリット:
- パターンが混在する
- 将来的に依存性が追加された場合、関数群からファクトリ関数への変更が必要
質問
- どちらの選択肢がより良い設計だと思いますか?
- その判断理由を教えてください。
- 業界のベストプラクティスやモダンな実装パターンとして、どちらが推奨されますか?
補足情報
- TypeScript と、コンポーネントという概念の入門者です。(JavaScript は書けますが、体系的な知識はありません。)
回答1件
あなたの回答
tips
プレビュー
2025/12/06 03:30
2025/12/07 05:56