Facadeパターンとはどういうものか
Facadeとは建物の正面という意味です。
このパターンは異なるサブシステムを単純な操作だけを持ったFacadeクラスで結び、サブシステム間の独立性を高める事を目的としています。(wikipediaより)
クラスやメソッドが多い際、どれを使えばよいか迷ったり、呼び出し順に注意する必要が生じます。
その際にFacadeパターンを用いることで、使用する側はその詳細を知る必要が無くなるので、シンプルな形で利用することができます。
[参考サイト]
https://ja.wikipedia.org/wiki/Facade_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3
https://qiita.com/i-tanaka730/items/911604bcd4136684ff1c
https://www.techscore.com/tech/DesignPattern/Facade.html/
Facadeパターンを用いるメリット
・処理の窓口を少なくすることで、複雑なものを単純に見せることができる
・外部との結合が疎であるため、パッケージを部品として再利用しやすくなる
サンプルコード
仕様
・所持していないモンスターの情報を取得したい
・全モンスターを取得するクラスと、現在自分が持っているモンスターを比較することで上記の情報を取得する。
所持していないモンスター情報を取得するクラス(Facadeクラス)
class SearchNotHaveMonsters {
private $playerId = 0;
public function __construct($playerId)
{
$this->playerId = $playerId;
}
// 所持していないモンスター一覧を取得
public function searchNotHaveMonsters()
{
$monsters = new Monsters();
$allMonstersData = $monsters->getAllMonsterData();
$haveMonsters = new HaveMonsters($this->playerId);
$haveMonstersData = $haveMonsters->getHaveMonstersData();
return array_diff($allMonstersData, $haveMonstersData);
}
}
モンスター情報を管理するクラス(DBの管理クラスのイメージ)
class Monsters {
// 本来はデータベース
private $monstersData = array(
'スライム',
'ゾンビ',
'オオカミ',
'トロール',
'カラス',
'オオガマ',
'ドラゴン',
'ふしちょう',
'よろい',
'まおう'
);
// モンスター一覧を取得
public function getAllMonsterData()
{
return $this->monstersData;
}
}
自分が所持しているモンスターを管理するクラス
class HaveMonsters {
private $playerId = 0;
// 本来はデータベースから取得
private $haveMonstersData = array(
'1' => array(
'スライム',
'ドラゴン',
'ふしちょう',
'まおう'
),
'2' => array(
'オオカミ',
'トロール',
'オオガマ',
'カラス'
),
);
public function __construct($playerId)
{
$this->playerId = $playerId;
}
// 所持しているモンスター一覧を取得
public function getHaveMonstersData()
{
return $this->haveMonstersData[$this->playerId];
}
}
使ってみる
// playerIdが適当ですが・・・^^:
$playerIdOne = 1;
$playerIdTwo = 2;
$searchNotHaveMonsters = new SearchNotHaveMonsters($playerIdOne);
print_r($searchNotHaveMonsters->searchNotHaveMonsters());
$searchNotHaveMonsters = new SearchNotHaveMonsters($playerIdTwo);
print_r($searchNotHaveMonsters->searchNotHaveMonsters());
/* 結果
Array
(
[1] => ゾンビ
[2] => オオカミ
[3] => トロール
[4] => カラス
[5] => オオガマ
[8] => よろい
)
Array
(
[0] => スライム
[1] => ゾンビ
[6] => ドラゴン
[7] => ふしちょう
[8] => よろい
[9] => まおう
)
*/
まとめ
・サンプルは割とコンパクトだが、あらゆるところへ影響してくる処理の際にこのパターンを用いると途中で状態を整理しやすくなり運用面でも効果がありそうと感じた。
・ラッパークラスにやや似ているような感じがしたが、結構近いのかもしれない。