[入門編]一般的なソフトウェアアーキテクチャ一覧

2021年11月7日日曜日

Architecture

本記事では、Model-view-controllerなどに代表されるアーキテクチャを9個紹介します。

アイキャッチ

はじめに

ソフトウェア開発において、既存の設計を知っておくことはとても重要です。
なかなか開発をしていて、ゼロからいきなり素晴らしい設計を思いつくことはありません。

このため、事前に基本となる設計を知っておき、これらを日々の開発に生かすことで保守性の高いシステムを作り上げることができます。

本記事では設計指針となる歴史あるソフトウェアアーキテクチャをご紹介します。
そして、ソフトウェア開発において何を考え、どのように関心事を分離するかの一助になれば幸いです。
また本記事で紹介するアーキテクチャを以下の書籍で詳細に解説されています。
興味がある型はご一読ください。

レイヤードアーキテクチャ

レイヤードアーキテクチャ概念図

レイヤードアーキテクチャ最も基本的なアーキテクチャと言えます。

設計指針は関心事の分離依存方向の制御となります。
それぞれの階層にコードをまとめ、依存関係を管理することで循環参照など変更容易性を低下させる要因を排除しようという意図があります。

クライアントサーバーモデル

クライアントサーバー概念図

Webを実現するアーキテクチャであるクライアントサーバーモデルです。
集中的に特定の役割を担当しているサーバーと、サーバーに要求する1つ以上のクライアントで構成されます。

クライアントはサーバーに要求(リクエスト)し、サーバーはクライアントに応答(レスポンス)することで処理が進んでいきます。
特徴として、サーバーとクライアントは一対多の関係にある点です。

マスタースレーブ

マスタースレーブ概念図

さきほどのクライアントサーバーと矢印の向きが逆になっていることにご注意ください。
マスタースレーブは、マスターが常にスレーブを制御し処理を分散します。

クライアントサーバーとは起点が逆向きとなり、マスターが常に処理の起点となりスレーブに処理を命令します。

代表例としてはコンピュータシステムです。コンピュータシステムにおいては、CPUがマスターとなり、周辺機器がスレーブとなります。

パイプ&フィルター

パイプフィルター概念図

パイプ&フィルター(Pipes and Filter)パターンはデータをストリームとして扱うシステムのためのアーキテクチャパターンです。

Linuxを使う方にとってはなじみの深いアーキテクチャかと思います。

それぞれの処理ステップをフィルターにカプセル化し、フィルター間はパイプを介して引き渡します。
フィルターにカプセル化した処理は他の処理に入れ替える・並べ替えることができます。

この柔軟性により、類似する一連のシステムを構成します。

ブローカーパターン

ブローカーパターン概念図

分散ソフトウェアシステムのためのアーキテクチャパターンです。
互いに依存性を持たないコンポーネント群が、リモートサービス呼び出しによって相互に連携します。
ブローカーは、コンポーネント間の相互連携の調整を行います。

サーバーはブローカーにサービスを公開し、クライアントはブローカーを介してサーバーのサービスを要求します。

ピアツーピア

ピアツーピア概念図

近年ビットコインなどで目にすることが増えたアーキテクチャですね。

ピアツーピアは、ピアと呼ばれるコンポーネントが、
他のピアにサービスを要求するクライアントとしても、他のピアにサービスを提供するサーバーとしても機能します。
各ピアがクライアント、サーバーの役割を動的に変更する点が特徴です。

イベントバスパターン

イベントバス概念図

イベントバスはイベント駆動のアーキテクチャパターンです。
ソースはイベントバスの特定のチャンネルにメッセージを公開します。リスナーは特定チャンネルをサブスクライブします。

Androidのアプリケーション間の連携などに活用されています。

モデルビューコントローラ

ModelViewController概念図

Webアプリケーションで用いられることの多いモデルビューコントローラー(MVC)モデルは、 この中で最も有名なアーキテクチャパターンかもしれません。
表示を責務とするView入力を伝達するControllerドメインロジックのModelを分離し保守性を向上させる狙いがあります。

多くのアーキテクチャに共通する設計指針ですが、Viewの分離は多くのアーキテクチャに用いられる概念ですね。
それほどViewの変更は多く、且つ、Viewの変更を他のモジュールに影響させたくないということですね。

ブラックボードパターン

ブラックボードパターン概念図

ブラックボードパターンは、明確な解決戦略が知られていないシステムに適用されることが多いアーキテクチャです。

技術が成熟していない問題に対して、近似的あるいは、妥当な解を求めるアーキテクチャあり、
BlackboardはKnowleadgeSourceに対して、インターフェースを提供しControllerに対して構造化されたオブジェクトを提供します。
KnowleadgeSourceには、問題解決のための様々な手法が独立して存在しています。独立したサブモジュールはそれぞれが連携を取ることはなくBlackboardを介してのみやり取りします。
ControllerはBlackboardを変化に応じて、次のアクションを決定します。
一番イメージの付きにくいアーキテクチャかもしれません。

大雑把なイメージとしてはKnowleadgeSourceは、専門家の集合体です。
そして専門家は技術の進歩に伴い定期的に入れ替わる可能性があります。このため専門家たちは離れがたくなることを避け、それぞれは直接コミュニケーションを取りません。
そして指揮官であるControllerの指揮の元Blackboardに記載された問題の解決を図ります。
この時呼び出される専門家は問題の全てを解決するわけではなく途中まで解決する場合もあります。
その際はBlackboardに書き残された途中までの解を見てまた、別の専門家が続きから解決に努めます。

このようにブラックボードパターンは、明確な解のない問題に対して様々な手法を組み合わせ解決を図るシステム構築に用いられます。

まとめ

本記事では、様々なアーキテクチャを計9個紹介させて頂きました。
ソフトウェア設計において、言葉だけでも知っていることは非常に重要です。

自分自身が開発に携わるとき、これらの言葉を知っており、深く調べることができ応用することができれば、非常に開発を楽にしてくれるかもしれません。逆に言葉も概念も知らないことは調べることさえもできません。

また、これらのアーキテクチャはメリットがある反面デメリットも存在します。
このため、様々な開発現場に置いて、これらのアーキテクチャに完全に沿って開発することが正解ではない場合もあります。
その際には様々な応用を試みることをお勧めします。
MVCモデルのデメリットを解消するためにMVVMモデルが提唱されたように新たなアーキテクチャパターンの発見につながるかもしれません。

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology