2014年09月07日

ファサード

Facade

語源はフランス語で、玄関という意味。
今でも比較的良く使われるパターンの一つ。
とあるライブラリや機能などに対して、プログラム中の各所から利用する場合に、直接それを使わずにFacadeを介してのみ利用する。
つまり、裏窓とか勝手口とかなどを使わないで出入りはすべて玄関のみとする。
こうすることにより、ライブラリの特殊な使い方を隠蔽したり、ライブラリのAPIが変更されたり、別のライブラリに代替する場合などに影響範囲を限定することが期待できる。

例えば、以下のようなライブラリ(機能)があるとする。
これは、メソッドを特定の順に呼び出す必要があるらしいが、次版リリース時には仕様が変るかもしれない。
namespace Incredible
{
    public class Temporary
    {
        public void DoFirst() { }
        public void DoNext() { }
        public void DoLast() { }
    }
}
上クラスを自身のプロジェクト内のコード各所から参照すると、特定の順序に添ってコールしているかの確認だとか、次版にAPIが変更された場合に、自プロジェクト側の修正箇所が多くなるなどの問題が潜在化している。
このような場合に、これらを隠蔽するためのFacadeクラスを用意する。
    public static class Facade
    {
        public static void DoSomething()
        {
            var temp = new Incredible.Temporary();

            temp.DoFirst();
            temp.DoNext();
            temp.DoLast();
        }
    }
使う側のコード
    class Tester
    {
        static void Main(string[] args)
        {
            Facade.DoSomething();
        }
    }
上例のように、自身側のコードからはFacadeを介してのみ使うことに限定すれば、Temporaryが替わった場合の影響範囲はこのFacadeのみに留まる可能性を期待できる。(必ずそうなるものでもないのは仕方ない)
他のライブラリだけでなく、例えばWin32やWMIに関する機能などを使う場合には、そのまま直接仕様せずに別アセンブリに定義して、それをFacadeを介して使うようにすると、後の変更時に影響範囲を限定させることができるかもしれない。
posted by RR at 01:34 | Comment(0) | デザインパターン | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。