トップ » 技術記事 » POSA 本でアーキテクチャパターンを勉強しよう(3) - アーキテクチャパターン「混沌から構造へ」より「Pipes and Filters」

POSA 本でアーキテクチャパターンを勉強しよう(3) - アーキテクチャパターン「混沌から構造へ」より「Pipes and Filters」

タグ: POSA アーキテクチャ パターン

どうも、あかさたです。前回はもっとも基本的なアーキテクチャパターンである「Layers」パターンを紹介しました。今回は「Pipes and Filters」を紹介します。POSA本で言うところの、第2章に相当します。

混沌から構造へ - パイプとフィルタ(Pipes and Filters)

UNIXのシェルであれば、「コマンド1 | コマンド2 | コマンド3」というような記述を見かけることがあります。コマンド1の結果をコマンド2の入力として処理させる・・・というような一種のパイプライン処理を記述することが出来ます。

あるいは、Yahoo! Pipesについて考えてみましょう。Yahoo! PipesはRSSなどのフィードをソースとして、文字列の置き換えや単語によるフィルタリングの処理を施し出力することができます。たとえば、私はフィードを興味のある単語でフィルタリングしたり、英語のフィードを翻訳したりすると言うことをたまにやります。Yahoo! PipesはUNIXのパイプとフィルタと非常に近い考え方をウェブに持ち込んだものであると言えるでしょう。

パイプとフィルタは開発するシステムにおいてレイヤほど採用されるものではありませんが、ユーザー側になることは頻繁にあります。

課題

パイプとフィルタを採用する動機とはどのようなものがあるのでしょうか。パイプとフィルタはデータストリームの処理を実現するためのアーキテクチャと言えます。

簡単な処理であれば、一人の開発者が単一のコンポーネントで開発する方が、効率が良いとも考えることができます。少なくとも、「タスクを分割することができる」「一人のエンジニアが担当するには複雑である」「システムの要件が変更されやすい」というシステムに対してでなければ適用する必要はないでしょう。この点においては、パイプとフィルタはレイヤと異なる観点で「システムを分割する」手法と言えます。

パイプとフィルタで重要な点は、フィルタを交換・再利用できること、組み合わせを変更できること、フィルタ内の変更が他のフィルタに及ばないことです。レイヤと比較すると、変更範囲の局所化という点では似ていますが、レイヤはより信頼性に、パイプとフィルタはよりシステムの柔軟性に特化していると考えることができます。

POSA本には、パイプとフィルタを採用するにあたっては「交換可能性」「組み合わせの変更可能性」「小さなフィルタ」「入力と出力の多様性」「中間結果の再利用性」「並列性」などのフォースのバランスを取る必要があると書かれています。

解決策

パイプとフィルタは、システムの処理を複数のシーケンシャルなステップに分割するものです。テキストファイルなどの「データソース」からシステムにデータが入力され、各ステップを実装した「フィルタ」によって数段階の処理を実行してから、画面やファイルなどの「データシンク」に結果が出力されます。「パイプ」はデータソース、データシンク、フィルタを連結し、シーケンシャルに処理を行います。

パイプよって結びつけられたフィルタのシーケンスを、処理のパイプラインと呼びます。

静的側面

パイプとフィルタに登場するコンポーネントは以下の4種類になります。また、これらを総称して「パイプライン要素」と呼びます。

  • フィルタ
  • パイプ
  • データソース
  • データシンク

図「パイプとフィルタの構造」

コンポーネント「フィルタ」は、パイプラインの処理単位です。フィルタは、「入力データの取得」「入力データの変更・洗練・変換」「データの出力」という3つの責務を持っています。

フィルタには「能動フィルタ」と「受動フィルタ」が存在しています。POSAによるとUNIXフィルタは全て能動フィルタとのことですが、能動フィルタは独立したプロセスやスレッドで、処理を自ら進めることができます。受動フィルタには2つ種類があって、パイプライン要素がフィルタから出力を引き出す「プル型」と、入力データを送り出す「プッシュ型」があります。フィルタの動作の詳細は「動的側面」にて紹介します。

コンポーネント「パイプ」は、「データソース」「フィルタ」「データシンク」間の接続を実現します。パイプは「データの伝送」「データの蓄積」「隣接する能動フィルタの同期」という3つの責務を持ちます。

コンポーネント「データソース」は、システムの入力を表現したものです。ファイルなどなどさまざまなものがあります。データソースは「システムへの入力をパイプラインに伝達」する責務を持ちます。データソースの振る舞いは2種類あって、1つはデータをパイプラインに能動的に流し込むもので、もう一つは最初のフィルタがデータの読み出しを行ったときに受動的にデータを提供するものです。

コンポーネント「データシンク」は、システムの出力を表現したものです。印刷や画面などさまざまなものがあります。データシンクは「システムの出力を行う」という責務を持っています。データシンクの振る舞いも2種類あって、能動的にデータを獲得するものと受動的にデータを受け取るものがあります。

Series Navigation«アーキテクチャパターン「混沌から構造へ」より「Layers(レイヤパターン)」アーキテクチャパターン「混沌から構造へ」より「Blackboard」»

1 2

執筆者紹介

あかさた

あかさた

未踏(2006年度下期)でWeb上で動作するモデリング環境 Kodougu の開発をしてました。こちらでもブログを書いています。

TrackBack URL :