BEARで始めるWebアプリケーション開発 その10「アスペクト指向プログラミングしてみる」

今回は、BEARの特徴の内の一つである"アスペクト指向"について学びます。概要の説明は例によって本家Wikiに譲ります。

Google Code Archive - Long-term storage for Google Code Project Hosting.

アスペクト指向してみる

BEARの場合AOPは、phpdoc形式のコメントに記述する、アノテーションにより実現されていますね。

例えば、DBアクセスのあるリソースでトランザクションがかかるようにしたい場合、該当のメソッドで以下のようにコメントに書いておくだけという、何ともお手軽な感じですね。

<?php
class App_Ro_Entry extends App_Ro
{
    /**
     * リソース作成
     *
     * @aspect around App_Aspect_Transaction
     */
    public function onCreate($values)
    {
        $values['created_at'] = _BEAR_DATETIME; //現在時刻
        $result = $this->_query->insert($values);
        if ($this->_query->isError($result)) {
            throw $this->_exception('投稿できませんでした');
        }
    }
}
?>

Transactionアドバイスに関してはinit-appした時に自動的に作成されるので、わざわざ自分でアドバイスを作成する必要もなく、トランザクション処理を簡単に行う事ができます。

AOPはうまく利用すると、コードを書く量を劇的に減らす事ができますね。

アドバイスの実行順序

アドバイスは一つのメソッドに複数指定した場合、before→around→afterの順で実行され、beforeやafterが複数ある場合は、before・after毎に指定した順で実行されるようです。

<?php
/**
  * @aspect after App_Aspect_After1
  * @aspect before App_Aspect_Before2
  * @aspect after App_Aspect_After2
  * @aspect around App_Aspect_Around1
  * @aspect before App_Aspect_Before1
  * @aspect around App_Aspect_Around2
  */
?>

こんな書き方をすると、"Before2→Before1→Around1→After1→After2"という順で実行されます。

aroundに関しては複数記述した場合は、最初に記述したものだけが実行される仕様のようです。(上記例の場合、Around2は実行されない。)

アノテーション

コメント部分に書く事ができるアノテーションは、今のところAOPの@aspectと、メソッドの必須項目を定義できる@requiredが使えます。

とりあえずは@requiredだけあれば困らなさそうですが、リソースに対する入力値の事前チェックなんかをやりたいと思ったら、@aspectでチェック用のアドバイスを作っちゃえば良さそうですね。

という訳で、AOPに関してはさらっと見てみただけですが、実際には周到に最初から準備するというよりは、リソースをいくつも作っていく内に、よく出てくる処理をアドバイスとして切り出す…というような形で使っていくのが良さそうな感じがしました。

また、アノテーション機構は、実際のコードの近くに定義が来るので、コードの見通しが良くなってよいですね。DocTestも併用すれば、テストもコメント部分に書けて、そのメソッドに関する情報が一箇所に集まる感じで非常に素晴らしいですね。

次回は?

次回は、BEARでのRESTfulWebサービスの提供の方法について、またはその前段としてDIに関して書こうかなと思っています。