パターンの分類

前回の投稿では、独創的な本「デザイン パターン:再利用可能なオブジェクト指向ソフトウェアの要素」に基づくデザイン パターンの分類を紹介しました。今日、私は、2 番目の重要な書籍「パターン指向ソフトウェア アーキテクチャ、第 1 巻」に基づいた、より一般的なパターンの分類を紹介します。

あなたはすでにそれに気づいているかもしれません。前回の記事「デザインパターンの分類」ではデザインパターンについての分類でしたが、今回の記事「パターンの分類」ではパターンについてです。 「パターン指向ソフトウェア アーキテクチャ、第 1 巻」(略して POSA 1) の分類は、「デザイン パターン:再利用可能なオブジェクト指向ソフトウェアの要素」の分類よりも一般的であるため、これは意図的なものです。簡単に言うと、今日の分類には最後の分類が含まれています。

パターン指向ソフトウェア アーキテクチャ、ボリューム 1

これは、POSA 1 で提示されたパターンの全体像です。

POSA 1 は、2 つの分類方法を使用します。構造カテゴリと問題カテゴリに基づいてパターンを分類します。 2 つの分類に入る前に、表のパターンについて、太字でいくつか説明します。

太字で書かれているすべてのパターンについて書きます。デザイン パターン プロキシ、パブリッシュ サブスクライバー、およびカウント ポインターは特殊です。 Proxy は既に本「Design Patterns:Elements of Reusable Object-Oriented Software」の一部であり、publish-subscriber は既に言及された本の一部でもあるオブザーバー パターンに非常に似ています。さらに、カウンター ポインターのイディオムを既に知っており、使用している必要があります。 C++11 では、std::shared_ptr と呼びます。 .

構造カテゴリ

構造的分類は、その規模と抽象化による分類です:

  • アーキテクチャ パターン ソフトウェアシステム全体の基本構造を説明します。多くの場合、設計パターンに基づいています。
  • 設計パターン コンポーネントの相互作用を定義し、サブシステムに焦点を当てる
  • イディオム 具体的なプログラミング言語でのアーキテクチャまたは設計パターンの実装です。 C++ で人気のあるイディオムは R です リソース A 買収 s 初期化 (RAII)。コンテナー、スマート ポインター、およびロックがそれらをモデル化します。

アーキテクチャ パターン、デザイン パターン、イディオムについての私の考えを要点を述べさせてください。

  • 構造カテゴリは、抽象的なものから具体的なものまであります。イディオムは最も具体的なものです。
  • マクロ レベル (アーキテクチャ パターン)、ミクロ レベル (設計パターン)、プログラミング言語 (イディオム) に作用しています。
  • アーキテクチャ パターンには、システム、デザイン パターンのサブシステム、プログラミング言語のイディオムが含まれます。

さまざまな問題のカテゴリに注目しましょう。

問題のカテゴリ

「パターン指向のソフトウェア アーキテクチャ、第 1 巻」には、10 の異なる問題カテゴリがあります。それらとそのパターンをコンパクトに提示してから、それらのいくつかの今後の投稿に深く掘り下げます.

泥から構造物へ

それらは、システム タスク全体を協調サブシステムに制御された形で分解します。

  • レイヤー :タスクをレイヤーに分割します。各層には特定の責任があり、上位層にサービスを提供します。
  • パイプとフィルター :複雑な処理を実行するタスクを、再利用可能な一連の個別の要素に分解します。これにより、処理を実行するタスク要素を個別にデプロイおよびスケーリングできるようになるため、パフォーマンス、スケーラビリティ、および再利用性が向上します。 (https://docs.microsoft.com/en-us/azure/architecture/patterns/pipes-and-filters)
  • 黒板: いくつかの特殊なサブシステムが知識を集めて、可能な部分的なソリューションを構築します。これは、決定論的な解が不明な問題に使用されます。

分散システム

コンポーネントが異なるプロセスまたはアドレス空間にあるシステムを構築します。

  • ブローカー: リモート サービス呼び出しと対話する分散ソフトウェア システムを構築します。コミュニケーション、その結果、および例外を調整する責任があります。

インタラクティブ システム

人間とコンピューターの相互作用を備えたシステムを構築します。

  • モデル ビュー コントローラー (MVC) :ユーザー インターフェイスのプログラム ロジックをモデル、ビュー、およびコントローラーの個別のコンポーネントに分割します。モデルは、アプリケーションのデータとルールを管理します。ビューはデータを表し、コントローラーはユーザーと対話します。
  • プレゼンテーション抽象化コントローラー (PAC) :MVC に似ています。 MVC とは対照的に、PAC にはエージェントの階層構造があり、各エージェントはプレゼンテーション、抽象化、および制御部分で構成されています。

適応可能なシステム

アプリケーションを拡張可能にし、新しい要件に適応できるようにします。

  • マイクロカーネル :最小限の機能コアを拡張機能から分離します。
  • リフレクション :システムをメタ レベルとベース レベルの 2 つの部分に分割します。メタ レベルはシステム プロパティをサポートし、それを自己認識させます。ベース レベルにはアプリケーション ロジックが含まれます。

構造分解

システムをサブシステムに分解し、複雑なコンポーネントを適切に連携するコンポーネントに分解します。

  • 全体 :コンポーネントの集合体を構築して、その部分から全体を提供します。パーツに共通のインターフェースを提供します。このデザイン パターンは、本「デザイン パターン:再利用可能なオブジェクト指向ソフトウェアの要素」の複合パターンに似ています。

作業組織

複数のコンポーネントを連携させて複雑なサービスを提供します。

  • マスタースレーブ :マスターは自分の作業をスレーブに分配し、スレーブから結果を収集します。

アクセス制御

サービスとコンポーネントへのアクセスを保護および制御します:

  • プロキシ :クライアントが実際のオブジェクトにアクセスするために呼び出すラッパーです。プロキシは通常、キャッシング、セキュリティ、暗号化などのロジックを追加します。この追加のロジックは、クライアントから隠されています。

管理

オブジェクト、サービス、およびコンポーネントの同種のセット全体を処理します。

  • コマンド プロセッサ :コマンドの実行をスケジュール、保存、または後で元に戻すことができるように、コマンドをオブジェクトに組み込みます。
  • ビュー ハンドラ :... ソフトウェア システムが提供するすべてのビューを管理するのに役立ちます。ビュー ハンドラー コンポーネントを使用すると、クライアントはビューを開き、操作し、破棄できます。また、
    ビュー間の依存関係を調整し、それらの更新を整理します。
    (パターン指向のソフトウェア アーキテクチャ、第 1 巻)

コミュニケーション

コンポーネント間の通信を整理します。

  • フォワーダー/レシーバー :ピア ツー ピアの対話モデルを使用して、ソフトウェア システムに透過的なプロセス間通信を提供します。フォワーダーとレシーバーを導入して、基礎となる通信メカニズムからピアを切り離します。 (パターン指向のソフトウェア アーキテクチャ、第 1 巻)
  • クライアント - ディスパッチャー - サーバー :クライアントとサーバー間のレイヤーとしてディスパッチャを導入します。ディスパッチャーは、クライアントとサーバー間の透過性を提供します。
  • パブリッシュ サブスクライバー :パブリッシャーがすべてのサブスクライバーに自動的に通知できるようにします。このデザイン パターンは、本「デザイン パターン:再利用可能なオブジェクト指向ソフトウェアの要素」のオブザーバー パターンに似ています。

リソース管理

共有コンポーネントとオブジェクトの管理を支援します。

  • カウント ポインター :動的に割り当てられた共有オブジェクトの参照カウンターが導入されました。 std::shared_ptr は C++ の顕著な例です。

次は?

この投稿で、パターンの紹介を終了します。次回の投稿では、「デザイン パターン:再利用可能なオブジェクト指向ソフトウェアの要素」に基づくパターン構造を紹介します。