読者です 読者をやめる 読者になる 読者になる

はむはむエンジニアぶろぐ

このブログのコンセプトは"ハッキングの為なら愛する家族を傷つけることをいとわない" 自分にとってエンジニアリングは "手段ではなく生きる目的" である

PHPでValueObjectを実装してみる

ValueObject デザインパターン PHP

f:id:secret_hamuhamu:20150816222337j:plain
ValueObjectは、getterしかないオブジェクトです。
getterしか無いって何が嬉しいの?って感じかもしれませんが、特定の概念を説明する集合体として表現できます。
ようは、コードに概念の集合を語らせることが出来ます。

簡単なパターンなので、覚えることも少ないです。
ですが、Valueobjectを覚えることで表現力を向上することが出来ると思います。
今回、PHPで実装してみました。

ValueObjectとは?

コンストラクタで、オブジェクトの生成時のみ値をセットできるオブジェクトです。
オブジェクトの生成時のみというのがミソで、それ以降は値を変更することは出来ません。
つまり、イミュータブルであることを担保できる。

例えば、連想配列とかだといつでもどこでも中身を書き換えられる。
それは、デバッグする時に困難になる。
その連想配列のライフサイクルを全てチェックせねばならない。
それに対し、Valueobjectはオブジェクト生成時に意図している値がセットされるか気にするだけでよい。

次に連想配列より優れている点として、特定の集合がどういう集合なのか理解しやすい。
連想配列は、パっと見、何が入っているのか分からない。
それに対し、Valueobjectはクラスの定義を見ればどういう概念の集合なのか分かる。
表現力が高い。

PHPで実装

<?php

abstract class ValueObject
{
    public function __construct(array $params)
    {
        foreach($params as $propertyName => $value) {
            $this->$propertyName = $value;
        }
    }

    public function __get($propertyName)
    {
        if (!property_exists(get_class($this), $propertyName)) {
            throw new Exception(sprintf('undefined property %s', $propertyName));
        }

        return $this->$propertyName;
    }
}

class Human extends ValueObject
{
    protected $height;
    protected $weight;
}

$human = new Human(['height' => 100, 'weight' => 60,]);
// 出力:100
echo $human->height;
// 出力:Exception: undefined property hoge
echo $human->hoge;

汎用的に使えるようにabstractで ValueObject クラスを作った。
それを継承した Human クラスは、人に関する値をまとめるValueobjectである。

こんなシンプルなものがValueobjectです。

まとめ

やっつけで作ったけど、Valueobjectはよく使うパターンなのでライブラリにして公開しようかな。
Packagistに公開を頑張ってみようかなと思います。

Githubにあげているので、Pull Requestお待ちしております!!
hamuhamu/ValueObject

オススメの本

パーフェクトPHP

パーフェクトPHP

オブジェクト指向でなぜつくるのか 第2版

オブジェクト指向でなぜつくるのか 第2版

オブジェクト指向入門 第2版 原則・コンセプト (IT Architect’Archive クラシックモダン・コンピューティング)

オブジェクト指向入門 第2版 原則・コンセプト (IT Architect’Archive クラシックモダン・コンピューティング)

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)