Facadeパターン

デザインパターン【C#】:Facade 01_Facadeパターンの定義

今回はデザインパターンの一つであるFacade(ファサード)パターンについて解説します。Facadeとは「建物の正面」を意味する言葉で、そこから転じて「窓口」のような意味合いで捉えると理解しやすい言葉です。

図1 タイトルスライド「Facadeパターン」

パターンの定義

Facadeパターンの定義は、次のように整理されます。

図2 Facadeパターンの定義

サブシステム内に存在する複数のインタフェースに1つの統一インタフェースを与える。 Facadeパターンはサブシステムの利用を容易にするための高レベルインタフェースを定義する。

この定義文には「サブシステム」「インタフェース」「統一インタフェース」「高レベルインタフェース」といった専門用語が含まれています。それぞれの言葉が指している意味を、順番に見ていきます。

サブシステムとは

ここでいう「サブシステム」とは、C#でいえば1つのプロジェクト(アセンブリ、DLL)に相当します。システム開発、特に規模の大きいシステムでは、受注・発注・在庫といった機能単位でプロジェクトを分割し、担当者を分けて設計・実装することがあります。1つのシステムを複数のサブシステムに分割して構築することは、システムの複雑さを軽減するのに役立ちます。

図3 サブシステムの分割イメージ(Main/受注/発注/在庫/データ連携)

図4 受注・発注・在庫のように機能単位でサブシステムを分割する例

受注・発注・在庫のような業務単位のほかにも、何らかの装置に対する通信をまとめた1つのプロジェクトをサブシステムとして切り出すケースや、Amazonのシステムや外部クラウドサービスとのデータ連携だけを担当する専用のサブシステムを作るケースもあります。

図5 外部サービスとのデータ連携専用のサブシステムを作る例

インタフェースとは

定義の中に出てくる「インタフェース」は、C#のキーワードとしてのinterfaceではなく、APIという意味で使われています。単純に言えば「メソッドの集まり」であり、そのシステムが外部に公開している、入出力とメソッド名だけが分かっている呼び出し可能なメソッド群のことを指します。

図6 定義文中の「インタフェース」に注目する

「複数のインタフェースに1つの統一インタフェースを与える」というのは、複数のメソッド群に対して、別の1つのメソッド群を新たに与えるという意味になります。

高レベルインタフェースを定義する

図7 定義文の前半部分(複数インタフェースへの統一インタフェースの付与)

図8 定義文の後半部分(サブシステム利用を容易にする高レベルインタフェース)

つまりFacadeパターンとは、クライアント(サブシステムを利用する側)から見たときに、サブシステムを簡単に使えるように簡略化されたメソッド群を持つオブジェクトを1つ用意しましょう、という考え方のパターンです。

参考コード:Facadeパターンのイメージ

このレクチャーの動画には実コードは登場しませんが、ここまでの定義をC#のコードに落とし込むと、次のようなイメージになります。受注・発注・在庫という3つのサブシステムのクラスをそれぞれ直接呼び出すのではなく、それらをまとめて呼び出す高レベルなFacadeクラスを用意します。

// 各サブシステム(受注・発注・在庫)のクラス
public class 受注システム
{
  public void 受注登録(string 商品コード, int 数量)
  {
    // 受注に関する複雑な処理
  }
}


public class 発注システム
{
  public void 発注登録(string 商品コード, int 数量)
  {
    // 発注に関する複雑な処理
  }
}


public class 在庫システム
{
  public void 在庫確認(string 商品コード)
  {
    // 在庫確認に関する複雑な処理
  }


  public void 在庫更新(string 商品コード, int 数量)
  {
    // 在庫更新に関する複雑な処理
  }
}

 

// サブシステムの利用を容易にする高レベルインタフェース(Facade)
public class 受発注Facade
{
private readonly 受注システム _juchu = new();
private readonly 発注システム _hacchu = new();
private readonly 在庫システム _zaiko = new();


// クライアントはこのメソッド1つを呼ぶだけでよい
public void 商品を注文する(string 商品コード, int 数量)
{
_zaiko.在庫確認(商品コード);
_juchu.受注登録(商品コード, 数量);
_hacchu.発注登録(商品コード, 数量);
_zaiko.在庫更新(商品コード, 数量);
}
}


// クライアント側のコード
var facade = new 受発注Facade();
facade.商品を注文する("A-001", 10);

クライアント側は、受注・発注・在庫という3つのサブシステムの詳細な呼び出し順序を知らなくても、受発注Facadeクラスの商品を注文するメソッドを1つ呼び出すだけで済みます。これが「サブシステムの利用を容易にするための高レベルインタフェースを定義する」というFacadeパターンの定義そのものです。

まとめ

Facadeパターンは、複数のサブシステム(複数のインタフェース=メソッド群)に対して、それらをまとめて簡単に使えるようにする統一インタフェース(高レベルインタフェース)を1つ提供するパターンです。次回以降のレクチャーでは、このFacadeパターンを実際のC#コードで実装していきます。

C#

■非公開コース「C#14新機能」プレゼント:
非公開コース「C#14新機能」(80分)をご覧になりたい方は
こちらからURLとパスワードを発行していますので、ご覧になってみてください。
非公開コース「C#14新機能」を観る

参考にした書籍

実戦で役立つ C#プログラミングのイディオム/定石&パターン
プログラミングC# 第8版

オブジェクト指向
ジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技
  すばらしい本です。オブジェクト指向が詰まっています。

オブジェクト脳のつくり方―Java・UML・EJBをマスターするための究極の基礎講座
  サンプルコードはjavaですが,最初にオブジェクト指向に目覚めるのに最適な本です。

Head Firstオブジェクト指向分析設計 ―頭とからだで覚えるオブジェクト指向の基本
  マンガみたいな感じで読めて,オブジェクト指向について学べます。  

Clean Code アジャイルソフトウェア達人の技
Clean Architecture 達人に学ぶソフトウェアの構造と設計
Adaptive Code ~ C#実践開発手法
.NETのエンタープライズアプリケーションアーキテクチャ
実装パターン
  廃盤のため異常に高くなりすぎなので,様子を見た方がいい気がします。一万円のボリュームがあるかどうかは微妙です。

オブジェクト指向でなぜつくるのか
レガシーコード改善ガイド
リファクタリング 既存のコードを安全に改善する

デザインパターン
オブジェクト指向における再利用のためのデザインパターン
オブジェクト指向のこころ
Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本

ドメイン駆動開発
エリック・エヴァンスのドメイン駆動設計
実践ドメイン駆動設計
ドメイン駆動
現場で役立つシステム設計の原則
エンタープライズアプリケーションアーキテクチャパターン