Paradigm Shift Design

ISHITOYA Kentaro's blog.

Ficus_Bean

FicusではFicus_Beanという抽象クラスを良く使います.
Java Beansほどwitにとんだネーミングではなく,単にマネです.パクリです.



Razzyに何でもやろうとしてちょっと肥大化しちゃったBeanクラス.
Contents of /trunk/src/php/ficus/beans/Bean.php - ficus - SourceForge.JP

PHPには,__callというものすごく便利な関数があって,

<?php
class A{
    public function __call($name, $arguments){
        echo $name . "\n";
    }
}
$a = new A();
$a->hello();
$a->bye();
?>

を実行すると,

hello
bye

と表示される.
で,Ficus_Beanの定義を見ると,

<?php
const METHOD_SIGNATURE = 
  '/^(set|get|addAll|appendAll|pushAll|add|
      append|delete|shift|push|pop|insert|
      numOf|count|clear|has|isEmpty|isNot|
      is|enable|disable)([a-zA-Z][a-zA-Z0-9_]*)/';
const METHOD_SIGNATURE_SUFFIX = '/^([a-zA-Z][a-zA-Z0-9_]*?)(EqualsTo)/';
?>

という定義がしてあって・・・
要するに,

<?php
class Test extends Ficus_Bean{
    protected $data;
}
?>

とBeanが定義されていれば,

  • setData
  • data(getDataと同義)
  • getData
  • addAllData(Array)
  • pushAllData(Array)
  • addData
  • appendData
  • deleteData
  • shiftData
  • pushData
  • popData
  • insertData
  • numOfData
  • countData
  • clearData
  • hasData
  • isEmptyData
  • isNotData
  • isData
  • enableData
  • disableData
  • dataEqualsTo

というメソッドが,最初から使えるようになっています.それぞれのメソッドは,なんとなく意図したとおりに動くはず.

また,

  • Array
  • JSON
  • RDF
  • String
  • SOAPValue

へのserializer/deserializerを備えています.

<?php
$json = $bean->serialize("JSON");
$json = $bean->serialize(new Ficus_JSONBeanSerializer());
$bean->deserialize($json, "JSON");
$bean->deserialize($json, new Ficus_JSONBeanDeserializer());
?>

とかで目的の形式に変換できます.


あとは,

<?php
$bean->beanProperties();
$bean->annotationAccessor();
$bean->propertyAnnotationAccessor();
?>

とかでプロパティを列挙したり,アノテーションを取得したりできます.


pagesでは,Ficus_PageがFicus_Beanをextendsしているので,getter/setterはもちろんのことプロパティに対するたいていの操作は定義なしで利用することができます.


確かにちょっとやりすぎ感はあるけれど,これのおかげで楽しています.
ただし,S2Container.php5と相性が悪いのでDIできない・・・という問題も無きにしも非ず.
まぁpropertyディレクティブが使えないだけで,initMethod使えばいいのですが.
あと,__callのメソッドはAOPできない・・・だけ!.


getter/setterを定義する行為って本当に何の意味もないと思う.最近Teedaを使ってプログラムを書いているけれど,いくらEclipseにGeneratorがついていても,

<?php
class Hoge extends Ficus_Bean{
    protected $data;
}
?>

public class Hoge{
    private String data;

    public Hoge(){
    }

    /**
     * @param data String the data
     */
    public void setData(String data){
        this.data = data;
    }

    /**
     * returns the data.
     * @return String data
     */
    public String getData(){
        return this.data;
    }
}

のどちらが,いいかは一目瞭然だと思う.
なぜPOJOはgetter/setterを定義しなくてはいけないのかな.
まぁ型のあるなしなのかもしれないけど.
必要ならば,定義するということでいいと思うんだけどなぁ.


てなわけで,Ficus_Beanでした.