DaoとVo
初めに参考にしたページの影響で、DBのデータはvalue objectで保持している。
でも共通クラスに渡すための引数が someFunction($valueObjectA, $daoA, $valueObjectB, $daoB, ...) みたいになってしまう。
いっそのことvalue objectからdaoを参照できるようにしてしまおうかなぁ・・。構造的には良くないような気がするけど素早く簡単にのPHPなら向いているのかもわからんね。
そもそも value object パターン を真面目に調べたことがなかった。どこかの簡単な記事を読んだだけだ。
http://hamasyou.com/archives/Engineer-Soul/daooraoooiiadata_access_objectoraooeieco.php
ここの本でも読んだら載ってるのかな。
PHPっぽくは無いよなぁ・・。
書きながら、前は $vo->save(); とやっていたのを思い出した。役割をちゃんと分けようと思って、$dao->save($vo) に変更したんだった。
でもやっぱり $vo->save() が手軽でいいのかも。乱雑になるんだろうか・・。
<?php ... $vo = $dao->get($id); // または$dao->create(); $calc->exec($vo); // 何らかの操作 $dao->save($vo);
というように、voを取得するメソッドが責任を持ってvoを保存することを徹底すれば今のままでいいのか。むしろそうすべきか。
なんか今まで書いてたのがかなりダメコードに思えてきた。。書き直そう。
アクションクラスがもっさりするのは解決できないが、それは
<?php class HogeUtil { ... public function changeHogeVo($hogeId){ $vo = $this->dao->get($hogeId); $this->calc->($vo); $this->dao->save($vo); } }
<?php class HogeAction { public $hogeId; public function execute(HogeUtil $hogeUtil){ $hogeUtil->changeHogeVo($this->hogeId); } }
とすればいいのか。
うーん。結構色々修正しないとダメだな。
しかもちょっとめんどくさい。何度も使う処理の部分から変更してみようか。
# 追記
# やってみようとしたけど、自動インクリメントのidを使って別のデータを登録する関数のテストをする時に困ったことになるっぽい
# そういう場合はやっぱりdaoごと渡さないとダメか
## 真面目にやるなら、メソッドを分けてアクションクラスから別々に呼び出すようにする