概要
(過去の自分が書いた)神クラス化したUtilityクラスとか見てイラっ☆とした。
個人的には、PHPでユーティリティクラスを作るくらいなら、普通に関数作れって感じする。 関数名の衝突が怖いのなら、名前空間を使えば良いでしょう。ユーティリティクラスが必要になるのは、完全にオブジェクト指向だけで関数宣言ができない言語くらいだと思います。
例で使うテーブル構造
どのようなときに使うかの例を示すのに、PHPでコードを書く。その時に使うテーブル構造を、先に示しておきます。
- イベントの開催期間のマスタデータを保存する。
- 1期間に同時開催されるのは1つまで。
- INSERTするときに重複チェックをしている。(当然、同一トランザクションで。)
まぁ、実務だと先々仕様変更するかもしれないから、テーブルはこんなもんでしょう。
CREATE TABLE event_master(
id INT NOT NULL AUTO INCREMENT PRIMARY KEY,
start DATE,
end DATE
);
特定の状態で初期化された、そのクラス自身の「インスタンス」が欲しいとき
インスタンスを作りたい時に、前提となる情報を特定できない場合とかありますよね。
例えば、上記のDBから、"現在開催中の"「イベントID」のインスタンスがほしい場合とか。そういうときに使うといいんじゃないかと思います。
event_idのクラス
<?php
/**
* イベントは、同時に1つまで開催可能。
* DBにINSERTするときに、期間で重複がないかをチェックされる。
*
*/
class EventId
{
/**
* @var int id
*/
private $id;
public function __construct(int $id)
{
$this->id = $id;
}
/**
* 現在実施中のイベントのIDを取得する
* @return EventId
*/
public static function current()
{
// 現在のゲームIDを特定する処理を書く
$dbh = DatabaseHandlerFactory->getInstance()->getHandler();
$now = $date('Y-m-d h:i:s');
$rows = $dbh->select(
'SELECT * FROM event_master
WHERE start < ? AND ? < end
',
[$now, $now]
);
return new self($rows[0]['id']);
}
}
ちなみに、(Abstract Factoryパターンな)EventIdManagerがいれば、そっちに問い合わせてもいいやつです。
Singletonのget_instanceメソッド
言うまでもないですね。
Singletonを乱用されても困るので、Singletonパターンはどのようなときに使うのか?を見てほしいです。
他なんかあったら、追記します。