導入
デザインパターンは、ソフトウェア開発において再利用可能な解決策を提供します。特に、TypeScriptのような型安全な言語では、デザインパターンを適切に活用することで、コードの可読性やメンテナンス性が向上します。本記事では、現場でよく遭遇する「ストラテジーパターン」を取り上げ、その実装方法と注意点を解説します。
教科書レベルの解説(デザインパターン)
重要な概念の整理
ストラテジーパターンは、アルゴリズムの選択をクライアントから分離するためのパターンです。これにより、アルゴリズムを変更する際にクライアントコードを変更する必要がなくなります。特に、異なる戦略を持つクラスが多数存在する場合に有効です。
コード例(TypeScript)
interface Strategy {
execute(a: number, b: number): number;
}
class AddStrategy implements Strategy {
execute(a: number, b: number): number {
return a + b;
}
}
class SubtractStrategy implements Strategy {
execute(a: number, b: number): number {
return a - b;
}
}
class Context {
private strategy: Strategy;
constructor(strategy: Strategy) {
this.strategy = strategy;
}
setStrategy(strategy: Strategy) {
this.strategy = strategy;
}
executeStrategy(a: number, b: number): number {
return this.strategy.execute(a, b);
}
}
// 使用例
const context = new Context(new AddStrategy());
console.log(context.executeStrategy(5, 3)); // 8
context.setStrategy(new SubtractStrategy());
console.log(context.executeStrategy(5, 3)); // 2
コードの行ごとの解説
- interface Strategy: 戦略のインターフェースを定義します。
- class AddStrategy: 加算の具体的な戦略を実装します。
- class SubtractStrategy: 減算の具体的な戦略を実装します。
- class Context: 現在の戦略を保持し、実行するためのクラスです。
- setStrategy: 戦略を変更するメソッドです。
- executeStrategy: 現在の戦略を用いて処理を実行します。
- 使用例: コンテキストを生成し、戦略を切り替えて実行します。
練習問題編
以下の練習問題に挑戦してください。各問題の後に模範解答と解説があります。
- 問題1: ストラテジーパターンを用いて、掛け算の戦略を追加してください。
- 問題2: コンテキストクラスに、現在の戦略を表示するメソッドを追加してください。
- 問題3: 異なる戦略を持つ複数のコンテキストを作成し、それぞれの結果を表示してください。
模範解答
-
問題1の解答:
class MultiplyStrategy implements Strategy { execute(a: number, b: number): number { return a * b; } } -
問題2の解答:
class Context { // ...既存のコード... displayCurrentStrategy(): string { return this.strategy.constructor.name; } } -
問題3の解答:
const context1 = new Context(new AddStrategy()); const context2 = new Context(new MultiplyStrategy()); console.log(context1.executeStrategy(5, 3)); // 8 console.log(context2.executeStrategy(5, 3)); // 15
まとめ
- ストラテジーパターンは、アルゴリズムの選択を柔軟に行えるようにします。
- TypeScriptの型システムを利用することで、戦略の安全な実装が可能です。
- 現場での適用を考慮し、実際の業務に役立つ形でデザインパターンを利用してください。