ログ日記

作業ログと日記とメモ

PHPでもVOを使う

短いエントリに反応。
私も同じように思ってて、今は段々変わってきた。

PHPで何か作るとき、ValueObjectとかDTOとか基本的にいらないと思う。データ構造だけを持ってるオブジェクトなんて意味がない。ふるまいまで自分でわかってる子なら意味があるけど。ただのデータ構造なら、連想配列で十分だよねとか思ってしまう。

PHPでVOとかDTOとかいらない - kotori@notes

最近はできるだけ配列よりオブジェクトを使った方がいいと思い始めてきた。ただしPHP5を使うことが前提。


自分が利用しているVOクラスの特徴。

  • VOクラスは自動生成
  • クラス名はVOによって変える
  • クラス名からフィールドが確定する

要するに、O/RマッパーでDBの表名・列名からVOクラスを自動生成する。それを元に

<?php

class CalcSalary
{
    static public function getIncomeTax(Vo_Salary $salary)
    {
        return $salary->incomeTax;
    }

    /* もし配列なら 
    static function getIncomeTax($salary)
    {
        if (isset($salary['incomeTax']))
            return $salary->incomeTax;
        else
            return false; // or Exception
    }
    */
}

のようになる。
自分自身のふるまいは分かっていないが、他のクラスが見たときに扱うデータが分かる。
コーディング規約を特に定めているわけではないが、他人の書いたコードでも保持している値が分かるし何の処理を行っているかが分かり易い。


ただVOクラスを使えばいいというものでもない。

  • VOクラスをその都度自分で作成する
  • StdClassを使う

というのでは、確かに手間の割にはメリットがほとんど無い。



最近は複数のデータを返す関数でも配列を使わずにJavaっぽく(?)

<?php
class OrderData
{
    public $orderMaster;
    public $orderDetails;
    public $sumPrice = 0;
    public $sumTax = 0;

    public function __construct(Vo_OrderMaster $orderMaster, Array $orderDetails, $options = array())
    {
        $this->orderMaster = $orderMaster;
        $this->orderDetails = $orderDetails;

        if (isset($options['sumPrice']))
            $this->sumPrice = $options['sumPrice'];
        if (isset($options['sumTax']))
            $this->sumTax   = $options['sumTax'];
    }
}

class OrderOperator
{
    public function getOrderData($orderId)
    {
        ....

        return new OrderData($orderMasterVo, $orderDetailVos, $optionData);
    }
}

みたいにやっている。
これも規模とか今後の修正の割合によるのかも。
作って納品して終わりっていう開発なら配列でいいかもしれないが、自分とこのサービスで今後もバージョンアップし続けるものなら手間よりメリットの方が大きいと感じた。