C++ を使用したデザイン パターンとアーキテクチャ パターン:最初の概要

前回の調査に基づいて、「次にどのメンタリング プログラムを実装する必要がありますか?」 「C++ を使用したデザイン パターンとアーキテクチャ パターン」について書くことへの需要が大きいことを認識しました。今日は、今後の投稿の計画を紹介したいと思います。

この紹介記事を「C++ を使用したデザイン パターンとアーキテクチャ パターン」と呼んでいますが、この記事シリーズの焦点はもっと広いものです。また、基本的な用語、イディオム、同時実行パターンについても書いています。この画像には 2 つの目的があります。

  • それは私の計画の最初のアイデアをあなたに与えます.これは、何が期待できるかを知っていることを意味します。
  • 私の概要でトピックの 1 つを見逃しているかもしれません。結果として、私に電子メールを書くか、ゲスト投稿を書いてください.

計画を練りながら進めていきます。これが私の最初の洗練です。

用語

デザイン パターン

デザイン パターンという用語は、建築と都市計画について書いたクリストフ アレクサンダーにまでさかのぼります。 ." Eric Gamma、Richard Helm、Ralph Johnson、および John Vlissides による古典的な "Design Patterns:Elements of Reusable Object-Oriented Software" (略して GOF) は、ソフトウェア開発に対してこの用語を作り出しました。

大まかに言うと、パターンには、アーキテクチャ パターン、デザイン パターン、イディオムの 3 種類があります。

パターンの種類

アーキテクチャ パターンは、ソフトウェア システムの基本的な構造を記述し、多くの場合、設計パターンに基づいています。イディオムは、具体的なプログラミング言語でのアーキテクチャまたは設計パターンの実装です。このパターンの分類は、必読の 2 番目の古典である「パターン指向のソフトウェア アーキテクチャ:パターンのシステム」に遡ります。Frank Buschmann、Regine Meunier、Hans Rohnert、Peter Sommerlad、Michael Stal (略して POSA)。 /P>

アンチパターン

パターンとアンチパターンがあります。アンチパターンは、自分自身を苦しめることが証明されている方法です。

これらは、私が書く用語の主要な部分にすぎません。また、長所と短所、歴史、構造など、パターンのその他の側面についても書きます。

デザイン パターン

短くします。影響力のある本「デザイン パターン:再利用可能なオブジェクト指向ソフトウェアの要素」には 23 のパターンがあります。それらは 2 つの方法で分類されます:

  • 創造的、構造的、行動的
  • クラス パターンとオブジェクト パターン

クラス パターンとオブジェクト パターンの分類は、基本的に、既存の抽象化から抽象化を構築する手段としての継承と合成の分類です。 23 のパターンのすべてが現在、関連性が高いわけではありません。したがって、太字で記述された次のパターンについて、簡潔な概要と最新の C++ でのコード例を示します。

さて、古典的な GOF (1994 年) と POSA (1996 年) はどちらも少し時代遅れです。これは最新の C++ にとって何を意味するのでしょうか?これはまさに、次の一連の投稿で私が取り組む問題です。

イディオム

イディオムは、具体的なプログラミング言語でのアーキテクチャまたは設計パターンの実装です。 C++ には、

などのイディオムがたくさんあります。
  • コピーして入れ替え
  • ゼロ、フィックス、または 6 のルール
  • 隠れた友達
  • リソースの取得は初期化 (RAII) です
  • 動的ポリモーフィズムと静的ポリモーフィズム
  • テンプレート (奇妙な反復テンプレート パターン (CRTP)、表現テンプレート、ポリシーと特性、タグ ディスパッチ、型消去など)

これはおそらく、あなたのコメントから最も恩恵を受けることができるパターンを巡る私のツアーの一部です.他に知っている C++ のイディオムは?

建築パターン

アーキテクチャ パターンは、ソフトウェア システムの基本的な構造を記述し、多くの場合、設計パターンに基づいています。少なくとも次のものを紹介します。

  • パイプとフィルター :複雑なタスクを、構成可能な一連の基本的なタスクに分解します
  • レイヤー :ソフトウェア システムをレイヤーに分割します。各レイヤーは特定の役割を担い、上位レイヤーにサービスを提供します。
  • モデル ビュー コントローラー (MVC) :(ユーザー) インターフェイスをモデル、ビュー、コントローラーの 3 つのコンポーネントに分解します
    • モデル:ビューとコントロールを登録するアプリケーションのコア。ビューとコントローラを更新します
    • 表示:ユーザーに情報を表示します。モデルからデータを取得する
    • コントローラー:ユーザーと対話し、データを更新します
  • リアクター :複数のクライアント リクエストを同時に受け入れ、異なるサービス プロバイダに配信できるイベント ドリブン アプリケーション。

同時実行パターン

データ競合に必要な要件は、可変状態を共有することです。結果として、同期パターンは両方の問題に対処します。書きたい同期パターンは次のとおりです。

  • 共有
    • コピーされた値 :コピーされたデータがデータ競合の犠牲になることはありません。
    • スレッド固有のストレージ :スレッド内でグローバル状態を有効にします。
    • 先物 :promise によって設定された値の変更不可能なプレースホルダー。
  • 突然変異
    • 範囲指定ロック :ロックに適用される RAII。
    • 戦略的ロック :さまざまなロック方法を使用してください。
    • スレッドセーフなインターフェース :クリティカル セクションをオブジェクトに拡張します。
    • 保護された一時停止 :取得するロックと、操作を実行する前に満たす必要のある前提条件を組み合わせます。

さらに、並行アーキテクチャについて考える必要があります。

  • アクティブ オブジェクト :メソッドの実行をメソッドの呼び出しから分離します。
  • 監視オブジェクト :オブジェクトへのアクセスを同期して、いつでも 1 つのメンバー関数のみを実行できるようにします。

次は?

次の投稿では、「C++ を使用したデザイン パターンとアーキテクチャ パターン」の旅を始めます。まず、デザインパターンの成り立ちと歴史について書いていきます。