ValueObjectに迷った時に自分が考えている事

May 25, 2016,
tags: ddd ValueObject


このエントリーをはてなブックマークに追加

今日は「DDD Alliance! ドメインオブジェクトの見つけ方・作り方・育て方」に参加してきました。
今回もいろいろと考えるきっかけを与えてもらえてすごく勉強になりました。

ValueObjectの話がいろいろと出てきたので、自分の中でいろいろと思ったことを整理したいと思います。

ValueObjectに迷う

どこまでValueObjectとて表現するのか、迷う場合があります。
具体的にどういう時って言われるとパッと具体例が思い付かないので申し訳ないのですが・・・。

まあ教科書的に言えばすべてをValueObjectにという事で解決なんですけどね。
それでも迷うんですよ。

極端な例として例えば「氏名」というValueObjectを用意する場合。

氏名というValueObjectには何が必要なのか? パッと思いつくところを上げてみると以下の4つになると最初僕は思いました。

  • 姓(カナ)
  • 名(カナ)

しかしこれで本当にいいのだろうか?
なんとなく違和感を感じるんですよね。

どこに違和感を感じるのか?

違和感を感じる最大のポイントは「情報を持ちすぎている」というところです。
姓・名だけ持てばいいんじゃないかなぁと。

なぜ姓・名だけでいいのか?

様々なオブジェクトを最小限に小さく作ろう運動をしている僕が、ValueObjectの良し悪しの指針の一つとして考えたのは 「Stringにキャストした時に一番よい形で表現できる」って事が実は結構重要なのかなぁーって思いました。

例えば、PHPのコードで例えます。

<?php

class Name {
  private $firstName;

  private $lastName;

  private $firstNameKana;

  private $lastNameKana;

  public function __construct($firstName, $lastName, $firstNameKana, $lastNameKana)
  {
    $this->firstName = $firstName;
    $this->lastName = $lastName;
  }

  public function __toString()
  {
    return $this->fistName . " " . $this->lastName . "\n"
     . $this->firstNameKana . " " . $this->lastNameKana;
  }
}

これだとなんか名前だけを表現したいのに、名前(カナ)まで表示されてしまいます。
このような状況でメソッドを幾つか作るとか、そういうゲスいことを考えるんじゃなくて、普通に情報が多すぎると判断するべきだと思います。

<?php

class Name {
  private $firstName;

  private $lastName;

  public function __construct($firstName, $lastName)
  {
    $this->firstName = $firstName;
    $this->lastName = $lastName;
  }

  public function __toString()
  {
    return $this->fistName . " " . $this->lastName;
  }
}

これだとしっくり来ませんか? これにかな表現まで入れると微妙になる気がするんですよね。

まとめ

雑な感じですが、要は 「Stringにキャストした時に一番よい形で表現できる」 って視点を持つとValueObjectに悩んだ時に、考えるヒントになるんじゃないかなぁーって思いました。

ちげーよボケって方は、ぜひぜひコメントに意見をしてください!

comments powered by Disqus