再利用可能なパターンの開発 - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

再利用可能なパターンの開発

ソフトウェアのデザインパターンは、ソフトウェア開発に共通する問題に対する再利用可能なソリューションです。これらは、ソフトウェアエンジニアがベストプラクティスに従った製品を開発するのに役立つガイドまたはパラダイムとして機能します。このセクションでは、 AWS CDK コードベースで使用できる 2 つの再利用可能なパターンの概要を説明します。抽象ファクトリーパターンと Chain of Responsibility パターンです。各パターンをブループリントとして使用し、コード内にある特定の設計上の問題に合わせてカスタマイズできます。デザインパターンの詳細については、Refactoring.Guru ドキュメントの「デザインパターン」を参照してください。

Abstract Factory

Abstract Factory パターンは、具体的なクラスを指定せずに関連オブジェクトや依存関係オブジェクトのファミリーを作成するためのインターフェイスを提供します。このパターンは、次のようなユースケースに適用されます。

  • クライアントが、システム内のオブジェクトの作成方法や構成方法に依存しない場合

  • システムが複数のオブジェクトファミリーで構成されており、これらのファミリーを一緒に使用できるように設計されている場合

  • 特定の依存関係を構築するためのランタイム値が必要な場合

Abstract Factory パターンの詳細については、Refactoring.Guru ドキュメントの「 の Abstract Factory TypeScript」を参照してください。

次のコード例は、Abstract Factory パターンを使用して Amazon Elastic Block Store (Amazon EBS) ストレージファクトリを構築する方法を示しています。

abstract class EBSStorage { abstract initialize(): void; } class ProductEbs extends EBSStorage{ constructor(value: String) { super(); console.log(value); } initialize(): void {} } abstract class AbstractFactory { abstract createEbs(): EBSStorage } class EbsFactory extends AbstractFactory { createEbs(): ProductEbs{ return new ProductEbs('EBS Created.') } } const ebs = new EbsFactory(); ebs.createEbs();

Chain of Responsibility

Chain of Responsibility とは、ハンドラー候補チェーンの 1 人がリクエストを処理するまで、ハンドラー候補チェーンに沿ってリクエストを渡せるようにする行動デザインパターンです。Chain of Responsibility パターンは、次のようなユースケースに適用されます。

  • 実行時に決定された複数のオブジェクトがリクエストを処理する候補となる場合

  • コードでハンドラーを明示的に指定しない場合

  • レシーバーを明示的に指定せずに、複数のオブジェクトのうちの 1 つにリクエストを発行したい場合

責任連鎖パターンの詳細については、Refactoring.Guru ドキュメントの「 における責任連鎖 TypeScript」を参照してください。

以下のコードは、Chain of Responsibility パターンを使用して、タスクの完了に必要な一連のアクションを構築する方法の例を示しています。

interface Handler { setNext(handler: Handler): Handler; handle(request: string): string; } abstract class AbstractHandler implements Handler { private nextHandler: Handler; public setNext(handler: Handler): Handler { this.nextHandler = handler; return handler; } public handle(request: string): string { if (this.nextHandler) { return this.nextHandler.handle(request); } return ''; } } class KMSHandler extends AbstractHandler { public handle(request: string): string { return super.handle(request); } }