Javaにおける収集パラメータパターン:効率的なパラメータ処理の習得
別名
- コレクター
- アキュムレータ
収集パラメータデザインパターンの意図
Javaデザインパターンにおける収集パラメータパターンは、複数のパラメータを単一のコレクションオブジェクトに集約することで、メソッド呼び出しを簡素化することを目的としています。このパターンは、さまざまなメソッド呼び出しを通じて単一のコレクションオブジェクトを渡すことで情報を収集するメソッドに特に効果的です。各メソッドは、独自のコレクションを作成する代わりに、このコレクションに結果を追加できます。このアプローチは、コードの可読性と保守性を向上させ、Javaプログラミングにおける情報収集プロセスを最適化します。
実際の例を用いた収集パラメータパターンの詳細な説明
実世界の例
ソフトウェア開発では、収集パラメータパターンは、メソッド呼び出しを最適化し、コードの保守性を向上させることで、大きな利点を提供します。
ウェイターが顧客から注文を受けるレストランのシナリオを想像してみてください。各項目(例:前菜、メインコース、デザート、ドリンク)を個別に書き留める代わりに、ウェイターはすべての項目を1つのドキュメントにまとめる注文用紙を使用します。この注文用紙は、すべての詳細を1か所に集約することにより、ウェイターとキッチンスタッフ間のコミュニケーションを簡素化します。同様に、ソフトウェアでは、収集パラメータパターンは複数のパラメータを単一のオブジェクトに集約し、メソッド呼び出しを合理化し、コードの可読性と保守性を向上させます。
分かりやすく言うと
収集パラメータパターンは、複数のパラメータを単一のオブジェクトにカプセル化することにより、メソッド呼び出しを簡素化します。
Wikipediaによると
収集パラメータのイディオムでは、コレクション(リスト、マップなど)が、項目をコレクションに追加するメソッドにパラメータとして繰り返し渡されます。
Javaにおける収集パラメータパターンのプログラム例
大企業のビル内には、現在保留中のすべての印刷ジョブのコレクションであるグローバルプリンターキューが存在します。さまざまな階には、それぞれ異なる印刷ポリシーを持つ異なるモデルのプリンターがあります。収集パラメータと呼ばれるコレクションに適切な印刷ジョブを継続的に追加できるプログラムを作成する必要があります。
以下のビジネスルールが実装されています
- A4用紙がカラーの場合は、片面印刷にする必要があります。その他の非カラー用紙はすべて受け入れられます
- A3用紙は非カラーで片面印刷である必要があります
- A2用紙は、単一ページ、片面印刷、非カラーである必要があります
最初に実装を見て、後で説明します。
public class App {
static PrinterQueue printerQueue = PrinterQueue.getInstance();
public static void main(String[] args) {
printerQueue.addPrinterItem(new PrinterItem(PaperSizes.A4, 5, false, false));
printerQueue.addPrinterItem(new PrinterItem(PaperSizes.A3, 2, false, false));
printerQueue.addPrinterItem(new PrinterItem(PaperSizes.A2, 5, false, false));
var result = new LinkedList<PrinterItem>();
addValidA4Papers(result);
addValidA3Papers(result);
addValidA2Papers(result);
}
public static void addValidA4Papers(Queue<PrinterItem> printerItemsCollection) {
for (PrinterItem nextItem : printerQueue.getPrinterQueue()) {
if (nextItem.paperSize.equals(PaperSizes.A4)) {
var isColouredAndSingleSided = nextItem.isColour && !nextItem.isDoubleSided;
if (isColouredAndSingleSided || !nextItem.isColour) {
printerItemsCollection.add(nextItem);
}
}
}
}
public static void addValidA3Papers(Queue<PrinterItem> printerItemsCollection) {
for (PrinterItem nextItem : printerQueue.getPrinterQueue()) {
if (nextItem.paperSize.equals(PaperSizes.A3)) {
var isNotColouredAndSingleSided = !nextItem.isColour && !nextItem.isDoubleSided;
if (isNotColouredAndSingleSided) {
printerItemsCollection.add(nextItem);
}
}
}
}
public static void addValidA2Papers(Queue<PrinterItem> printerItemsCollection) {
for (PrinterItem nextItem : printerQueue.getPrinterQueue()) {
if (nextItem.paperSize.equals(PaperSizes.A2)) {
var isNotColouredSingleSidedAndOnePage = nextItem.pageCount == 1 && !nextItem.isDoubleSided
&& !nextItem.isColour;
if (isNotColouredSingleSidedAndOnePage) {
printerItemsCollection.add(nextItem);
}
}
}
}
}
この`App`クラスは、アプリケーションのメインエントリポイントです。収集パラメータデザインパターンを使用して、特定のポリシーに基づいて印刷ジョブをフィルタリングします。
**初期化**:`printerQueue`は、異なる用紙サイズ(A4、A3、A2)の3つの印刷ジョブで初期化されます。
**収集パラメータの作成**:ポリシー要件を満たす印刷ジョブを格納するために、`result`という名前の`LinkedList`が作成されます。
**収集パラメータへの有効なジョブの追加**:`addValidA4Papers`、`addValidA3Papers`、および`addValidA2Papers`メソッドが呼び出されます。これらのメソッドは、`printerQueue`を反復処理し、ポリシー要件を満たす印刷ジョブを`result`リストに追加します。
収集パラメータである`result`リストは、メソッドからメソッドに渡されるため、有効な印刷ジョブを累積します。これが収集パラメータデザインパターンの本質です。
Javaデザインパターンで収集パラメータパターンを利用すると、メソッド呼び出しがより効率的になり、コード構造全体が改善されます.
Javaで収集パラメータパターンを使用する場合
このパターンは、Javaコーディングプラクティスでパラメータを管理し、効率的なコードリファクタリングと可読性の向上を確保するのに役立ちます。
- メソッドが多数のパラメータを受け入れる必要がある場合、メソッドシグネチャが扱いにくくなる場合に使用します。
- 同じパラメータグループが複数のメソッドに渡される場合、冗長性と潜在的なエラーを減らすために使用します。
- コードの可読性と保守性を向上させるために使用します。
収集パラメータパターン Javaチュートリアル
Javaにおける収集パラメータパターンの実際のアプリケーション
- メソッドが多数のパラメータを受け入れる必要がある場合、メソッドシグネチャが扱いにくくなる場合に使用します。
- 同じパラメータグループが複数のメソッドに渡される場合、冗長性と潜在的なエラーを減らすために使用します。
- コードの可読性と保守性を向上させるために使用します。
収集パラメータパターンの利点とトレードオフ
利点
- メソッドシグネチャのパラメータ数を減らすことにより、コードの可読性が向上します。
- 異なるメソッド間でパラメータセットの再利用を促進します。
- パラメータ構造を一元化することにより、保守性を向上させます。
トレードオフ
- 追加のクラスが導入されるため、適切に管理しないと複雑さが増す可能性があります。
- パラメータオブジェクトが大きすぎるか扱いにくい場合、過度の一般化につながる可能性があります。
関連するJavaデザインパターン
- コマンド:コマンドは、コマンドオブジェクトによって実行される複数の操作からの結果を集約するために、収集パラメータを利用する場合があります。
- コンポジット:階層構造を扱う場合に収集パラメータと組み合わせて使用でき、コンポジット構造全体で結果を収集できます。
- ビジター:ビジターが構造のトラバーサルと操作を処理し、収集パラメータが結果を累積する場合に、しばしば一緒に使用されます。