BeanとDaoをちょっと改良

昨日作ったBean+Daoは、ActionがBeanを取得するためにnewを2回使わないといけないというあたりがかっこ悪かったので変更してみた。
今まではActionがどのBeanとどのDaoを結びつけて使うかを管理してたけど、今度はBeanが自分の相棒にどのDaoを使うかを管理しておく形にした。
BeanはDaoをコンストラクタに受け取っていたけど、今度はEthna_DB_ADOdbを受け取る形にする。

abstract class Bean
{
    public function __construct($db)
    {
        $daoName = $this->getDaoName();
        require_once($daoName . '.php');
        $this->dao = new $daoName($db);
    }

	abstruct protected getDaoName();
}

Beanの実装は自分の相棒であるDaoの名前をあらかじめ知っている形にする。

class User extends Bean
{
	protected function getDaoName()
	{
		return 'UsersDao';
	}
}

これで、ActionからのBeanの呼び出しがちょっと簡潔になった。

	// こうしてたのが
	// $user = new User(new UsersDao($this->backend->getDB()));
	// こうするようになった
	$user = new User($this->backend->getDB());

結果的にrequire_onceを書く回数も減ったし、コーディングの手間は減ったように思う。設計的にはどうだろうか。今回の変更は、

  • ○クライアントが知っておかないといけないことが減った(カプセル化が進んだ)
  • ×BeanとDaoの結びつきが固定化し、強くなってしまった

というものだったけど、もともとBeanとDaoの結びつきは強いものだし、リターンとの兼ね合いからするとこれでいいんじゃないかと思う。