遊星ゲームズ
FrontPage | RSS


強化版TemplateMethod
 プログラム

 昨日書いたこととか考えてるうちに、ふと思いついてやってみた。ていうか人を馬鹿にしたソースなので信じないように。
 いわゆるテンプレートメソッドなんだけど、これはさらに強力です。SolidTemplateなら、子クラスに勝手なメソッドを定義させません!
 堅牢なアーキテクチャの実現のためにどうだろう。

class HogeSolidTemplate {

    protected static $methods = array(
        'getHoge' ,
        'getPiyo' ,
    );
    protected final function __construct($hoge , $piyo) {
        $this->hoge = $hoge;
        $this->piyo = $piyo;
        }
    public static function getInstance($class , $hoge , $piyo) {
        $instance = new $class($hoge , $piyo);
        return new Alias($self::methods , $instance);
    }
}

↑このHogeSolidTemplateが親クラス。
 これを継承したらnew禁止なのでgetInstanceでインスタンス生成する。生成時にクラス名を渡すというかっこ悪さだけど、ここではがまん。
 けど、これが返すのは実は↓のインスタンス。

class Alias {
    private $class;
    private $methods = array();    
    public function __construct($methods , &$instance) {
        $this->methods = $methods;
        $this->class = &$instance;
    }
    public function __call($method , $args) {
        if(in_array($method , $this->methods)) {
            return call_user_func_array(array($this->class , $method) , $args);
        } else {
            die('許可されていないメソッドです');
        }
    }
}

 宣言した以外のメソッドを呼ぶと、突然dieする(笑)。もうソースを荒らさせません!

 わたしなら、こんなの使うといわれたら全力で反対するがなー。


強化版TemplateMethodを