POSA 本でアーキテクチャパターンを勉強しよう(2) - アーキテクチャパターン「混沌から構造へ」より「Layers(レイヤパターン)」
- パターンとは何か?
- アーキテクチャパターン「混沌から構造へ」より「Layers(レイヤパターン)」
- アーキテクチャパターン「混沌から構造へ」より「Pipes and Filters」
- アーキテクチャパターン「混沌から構造へ」より「Blackboard」
バリエーション
POSA 本では「リラックスレイヤシステム」と「継承によるレイヤ化」というバリエーションパターンが紹介されています。
レイヤパターンの弱点としては、いくつか下の階層にあるレイヤの機能を直接利用することができないことと、レイヤによってラッピングされるのでパフォーマンスに悪影響が出るおそれがあるということが挙げられます。「リラックスレイヤシステム」では、レイヤパターンのルールを一部弱めて、たとえば上位全てのレイヤにサービスを公開するレイヤを導入できるようにします。つまり、上位レイヤからいくつか下の階層のレイヤを直接呼び出せるようにしてしまうのです。
メリットは、パフォーマンスと柔軟性が向上することです。デメリットは、保守性が低下することです。たとえば、前述の3層構造でプレゼンテーションレイヤがサービスレイヤとドメインレイヤの両方に依存する場合です。このような場合、プレゼンテーションレイヤにサービスレイヤで解決すべき問題が記述されてしまうことがあり得ます。
「継承によるレイヤ化」では、下位レイヤを基底クラスとして、上位レイヤではそのクラスを継承してクラスを作成します。メリットとしては、下位レイヤのサービス(メソッド)をオーバーライドすることで必要に応じてサービスを変更することができることです。デメリットとしては、クラス構造が下位レイヤに引きずられることと、下位レイヤを変更すると上位レイヤ全てに影響すること(たとえば再コンパイルが必要)です。
レイヤパターンはナイーブな運用をしてしまうと、柔軟性/パフォーマンス/短期的な開発コストに悪影響を与えてしまう場合があるため、「リラックスレイヤシステム」と「継承によるレイヤ化」では、いずれもそうした問題を回避するためのアイディアとなっています。ただ、レイヤが持っている保守性を悪化させる可能性があるため、採用は慎重に考える必要があるでしょう。
結論
レイヤパターンには、(1) 変更が局所化されるため保守性が向上する、(2) 抽象度の低い下位レイヤは、さまざまなシステムで再利用できる可能性がある、(3)レイヤ間のやり取りが標準化されている場合、レイヤを交換することが容易になるなどといったメリットがあります。
しかし、(1) レイヤを重ねるためパフォーマンスが低下する、(2) 複数のレイヤで同じような処理を実装されてしまう場合がある、(3) 設計の失敗で下位レイヤにおける変更が局所化できない場合、全ての上位レイヤに変更が発生する場合がある、(4) レイヤを定めることが難しいなどといったデメリットもあります。
レイヤパターンはアーキテクチャ設計の基本でありながら、採用にあたっては(ある程度以上の規模のシステムなら何らかの形で採用するでしょうが)慎重に検討する必要があります。
まとめ
以上、アーキテクチャパターンの Layers(レイヤ)について触れました。レイヤパターンはある程度以上の大きさと複雑さを持つアプリケーションを分割する手段としては非常に基本的な考え方です。
次回は Pipes and Filters を学習します。Pipes and Filters は UNIX のシェルにおけるパイプとフィルタ(そのままですが)のようなデータストリームとその処理によく使われるパターンです。それでは!
このサイトについて
TrackBack URL :
