https://qiita.com/ndxbn/items/4997d1e9400c03f6ea59 を編集しようと思ったのだけれど、422 になって更新できなかったので、新しく投稿し直すことにした。
発端
(過去の自分が書いた)神クラス化したUtilityクラスとか見てイラっ☆としたので、ベタープラクティス的なやつをまとめようかなって気持ちになった。
名前空間を切って普通に関数作れば良いので、ユーティリティクラスはアンチパターン。
static なメソッドを使うパターン
そのクラスの「特定のインスタンス」が欲しいとき(Factory パターン系)
実装例
こんな感じのDBから、IDが欲しい。
ただし、1期間に同時開催されるのは1つまで。
INSERTするときに重複チェックをしている。
CREATE TABLE event_master(
id INT NOT NULL AUTO INCREMENT PRIMARY KEY,
start DATE,
end DATE
);
アプリケーション側では、こう使う。
この時の、php public static function current()
が、staticなメソッドの使いどきの例。
<?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を特定する処理を書く
// 大抵、DBとかから検索するよな。
$dbh = (new DatabaseHandler)->get();
$now = $date('Y-m-d h:i:s');
$rows = $dbh->select(
'SELECT * FROM evemnt_master
WHERE start < ? AND ? < end
',
[$now, $now]
);
return new self($rows[0]['id']);
}
}