Software-architecture-design-hierarchical-architecture
階層アーキテクチャ
階層アーキテクチャは、システム全体を階層構造と見なします。階層構造では、ソフトウェアシステムは階層のさまざまなレベルで論理モジュールまたはサブシステムに分解されます。 このアプローチは通常、ネットワークプロトコルやオペレーティングシステムなどのシステムソフトウェアの設計に使用されます。
システムソフトウェア階層設計では、低レベルのサブシステムは、隣接する上位レベルのサブシステムにサービスを提供し、下位レベルのメソッドを呼び出します。 下位層は、I/Oサービス、トランザクション、スケジューリング、セキュリティサービスなど、より具体的な機能を提供します。 中間層は、ビジネスロジックやコア処理サービスなど、よりドメインに依存する機能を提供します。 また、上位層は、GUI、シェルプログラミング機能などのユーザーインターフェイスの形式で、より抽象的な機能を提供します。
また、名前空間階層の.NETクラスライブラリなどのクラスライブラリの編成にも使用されます。 すべての設計タイプがこの階層アーキテクチャを実装でき、多くの場合、他のアーキテクチャスタイルと組み合わせます。
階層的な建築スタイルは次のように分かれています-
- メインサブルーチン
- マスタースレーブ
- 仮想マシン
メインサブルーチン
このスタイルの目的は、モジュールを再利用し、個々のモジュールまたはサブルーチンを自由に開発することです。 このスタイルでは、ソフトウェアシステムは、システムの必要な機能に応じてトップダウンの改良を使用してサブルーチンに分割されます。
これらの改良は、分解されたモジュールがその排他的な独立した責任を持つほど単純になるまで、垂直につながります。 機能は再利用され、上位層の複数の呼び出し元によって共有されます。
データがサブルーチンにパラメータとして渡される2つの方法があります、すなわち-
- 値渡し-サブルーチンは過去のデータのみを使用しますが、変更することはできません。
- 参照渡し-サブルーチンは、パラメーターによって参照されるデータの値を使用し、変更します。
利点
- 階層の洗練に基づいてシステムを簡単に分解できます。
- オブジェクト指向設計のサブシステムで使用できます。
デメリット
- グローバルに共有されたデータが含まれているため、脆弱です。
- 密結合により、変更のリップル効果が大きくなる場合があります。
マスタースレーブ
このアプローチは、「分割統治」の原則を適用し、障害計算と計算精度をサポートします。 システムの信頼性とフォールトトレランスを提供するメインサブルーチンアーキテクチャの修正版です。
このアーキテクチャでは、スレーブはマスターに複製サービスを提供し、マスターは特定の選択戦略によってスレーブから特定の結果を選択します。 スレーブは、異なるアルゴリズムと方法またはまったく異なる機能によって同じ機能タスクを実行できます。 これには、すべてのスレーブを並行して実行できる並列コンピューティングが含まれます。
マスター-スレーブパターンの実装は、5つのステップに従います-
- タスクの計算を同等のサブタスクのセットに分割する方法を指定し、サブタスクの処理に必要なサブサービスを特定します。
- 個々のサブタスクの処理から取得した結果を使用して、サービス全体の最終結果を計算する方法を指定します。
- 手順1で特定したサブサービスのインターフェイスを定義します。 スレーブによって実装され、個々のサブタスクの処理を委任するためにマスターによって使用されます。
- 前の手順で開発した仕様に従って、スレーブコンポーネントを実装します。
- 手順1〜3で開発した仕様に従ってマスターを実装します。
アプリケーション
- ソフトウェアの信頼性が重要な問題であるアプリケーションに適しています。
- 並列および分散コンピューティングの分野で広く適用されています。
利点
- より高速な計算と簡単なスケーラビリティ。
- スレーブを複製できるため、堅牢性を提供します。
- スレーブを異なる方法で実装して、セマンティックエラーを最小限に抑えることができます。
デメリット
- 通信のオーバーヘッド。
- すべての問題を分割できるわけではありません。
- 実装が難しく、移植性の問題。
仮想マシンのアーキテクチャ
仮想マシンアーキテクチャは、機能が実装されているハードウェアやソフトウェアに固有ではない機能を装います。 仮想マシンは既存のシステム上に構築され、仮想抽象化、一連の属性、および操作を提供します。
仮想マシンアーキテクチャでは、マスターはスレーブの「同じ」サブサービスを使用し、作業の分割、スレーブの呼び出し、結果の結合などの機能を実行します。 開発者は、まだ構築されていないプラットフォームをシミュレートおよびテストでき、実際のシステムでテストするには複雑すぎる、コストがかかる、または危険な「災害」モードをシミュレートできます。
ほとんどの場合、仮想マシンは実行プラットフォームからプログラミング言語またはアプリケーション環境を分離します。 主な目的は、*移植性*を提供することです。 仮想マシンを介した特定のモジュールの解釈は、次のように認識されます-
- 解釈エンジンは、解釈されるモジュールから命令を選択します。
- 指示に基づいて、エンジンは仮想マシンの内部状態を更新し、上記のプロセスが繰り返されます。
次の図は、単一の物理マシン上の標準VMインフラストラクチャのアーキテクチャを示しています。
- ハイパーバイザー*は*仮想マシンモニター*とも呼ばれ、ホストOS上で実行され、一致したリソースを各ゲストOSに割り当てます。 ゲストがシステムコールを行うと、ハイパーバイザーはそれをインターセプトし、ホストOSがサポートする対応するシステムコールに変換します。 ハイパーバイザーは、各仮想マシンのCPU、メモリ、永続ストレージ、I/Oデバイス、およびネットワークへのアクセスを制御します。
アプリケーション
仮想マシンのアーキテクチャは、次のドメインに適しています-
- 直接的な解決策がない場合、シミュレーションまたは翻訳によって問題を解決するのに適しています。
- サンプルアプリケーションには、マイクロプログラミング、XML処理、スクリプトコマンド言語の実行、ルールベースのシステム実行、SmalltalkおよびJavaインタープリター型プログラミング言語のインタープリターが含まれます。
- 仮想マシンの一般的な例は、インタープリター、ルールベースのシステム、構文シェル、コマンド言語プロセッサーです。
利点
- 移植性とマシンプラットフォームの独立性。
- ソフトウェア開発のシンプルさ。
- プログラムを中断および照会する機能により柔軟性を提供します。
- 災害作業モデルのシミュレーション。
- 実行時に変更を導入します。
デメリット
- インタープリターの性質により、インタープリターの実行が遅い。
- 実行に追加の計算が含まれるため、パフォーマンスコストが発生します。
レイヤードスタイル
このアプローチでは、システムは階層内の多数の上位層と下位層に分解され、各層はシステム内で独自の責任を負います。
- 各層は、パッケージ、デプロイされたコンポーネント、またはメソッドライブラリまたはヘッダーファイルの形式のサブルーチンのグループとしてカプセル化された関連クラスのグループで構成されます。
- 各レイヤーは、その上のレイヤーにサービスを提供し、下のレイヤーのクライアントとして機能します。 レイヤーi +1への要求は、レイヤーiのインターフェースを介してレイヤーiによって提供されるサービスを呼び出します。 タスクが完了すると、応答はレイヤーi +1に戻る場合があります。それ以外の場合、レイヤーiは、下のレイヤーi -1から継続的にサービスを呼び出します。
アプリケーション
レイヤードスタイルは、次の分野に適しています-
- 階層的に編成できるサービスの異なるクラスを含むアプリケーション。
- アプリケーション固有の部分とプラットフォーム固有の部分に分解できるアプリケーション。
- コアサービス、重要なサービス、ユーザーインターフェイスサービスなどの間に明確な区分があるアプリケーション。
利点
- 段階的な抽象化レベルに基づいた設計。
- 1つのレイヤーの機能の変更が最大で他の2つのレイヤーに影響するため、拡張の独立性を提供します。
- 標準インターフェースとその実装の分離。
- システムが新しいコンポーネントのプラグアンドプレイをはるかに容易にするコンポーネントベースのテクノロジを使用して実装されます。
- 各層は、移植性をサポートする独立して配置された抽象マシンにすることができます。
- トップダウンの洗練された方法でタスクの定義に基づいてシステムを簡単に分解する
- 同じレイヤーの異なる実装(同一のインターフェース)を交換可能に使用できます
デメリット
- 多くのアプリケーションまたはシステムは、階層構造で簡単に構成できません。
- クライアントの要求またはクライアントへの応答が潜在的にいくつかの層を通過する必要があるため、実行時のパフォーマンスが低下します。
- また、各レイヤーによるデータのマーシャリングとバッファリングのオーバーヘッドに関するパフォーマンス上の懸念もあります。
- 層間通信を開くとデッドロックが発生し、「ブリッジング」により密結合が発生する場合があります。
- 階層化アーキテクチャでは、例外とエラー処理が問題になります。これは、1つの層の障害がすべての呼び出し層に広がる必要があるためです。