PHPでTemplate Method パターン
DBへの接続オブジェクトを継承した各テーブル毎のクラスでinsert() / update() 実装を想定
- ハリウッドの法則
- 親クラスが子クラスのメソッドを必要なタイミングで呼ぶ
- 今回でいくと、regist(親クラス)から子クラスで実装したinsert / update をcallする
- 同じ処理を集約し、抽象クラス、抽象メソッドとしてインターフェースを用意する
<?php // DBへの接続、validateを行うようなDB処理のスーパークラスを想定 abstract class DBObject { private $target_object; public function __construct($obj) { $this->target_object = $obj; } public abstract function insert(); public abstract function update(); public function regist() { if ($this->target_object->id) { $this->update(); } else { $this->insert(); } } } // 各テーブルへの実装を、具象クラスでテーブル毎に行う想定 class ObjectA extends DBObject { public function insert() { // insert 処理 echo "--insert--" , PHP_EOL; } public function update() { // update 処理 echo "--update--" , PHP_EOL; } } // 実際に利用する場合は、idの有無でinsert / update を判定する事を想定 $sample = new stdClass(); $sample->id = 111; // idがありのため、updateを行う //$sample->id = null; $obj = new ObjectA($sample); $obj->regist(); // cliantからはオブジェクトを生成し、registメソッドをcallするのみ。
雑感
さっと思った事を実装してみたが、Template Methodパターンにマッチする仕様なのか不明な部分が残る
他パターンをサンプル実装していく中で、戻って修正する事もあると思う
何か気になる箇所があったら是非コメント下さい