ドメインオブジェクトと値オブジェクト - それらは等しいですか?
-
28-10-2019 - |
質問
ドメインオブジェクトの例をZend QuickStartチュートリアルやDAO/VOパターンを考慮した他の例に目を向けることにより、どちらも非常に似ているようです。
「バリューオブジェクト」が「ドメインオブジェクト」と言うのと同じであると推測できますか?
そうでない場合は、それらの違いを明確にしてください。
1つの機能は何ですか、そして別の機能の場合はどうなりますか?
どちらもゲッターとセッターによって作曲されており、それ以上のものは何もないので、私はこれを尋ねています。彼らは同じ機能をしているようです...
アップデート:
したがって、Zend Frameworkクイックチュートリアルドキュメント、これはドメインオブジェクトと呼ばれます。
// application/models/Guestbook.php
class Application_Model_Guestbook
{
protected $_comment;
protected $_created;
protected $_email;
protected $_id;
public function __construct(array $options = null)
{
if (is_array($options)) {
$this->setOptions($options);
}
}
public function __set($name, $value)
{
$method = 'set' . $name;
if (('mapper' == $name) || !method_exists($this, $method)) {
throw new Exception('Invalid guestbook property');
}
$this->$method($value);
}
public function __get($name)
{
$method = 'get' . $name;
if (('mapper' == $name) || !method_exists($this, $method)) {
throw new Exception('Invalid guestbook property');
}
return $this->$method();
}
public function setOptions(array $options)
{
$methods = get_class_methods($this);
foreach ($options as $key => $value) {
$method = 'set' . ucfirst($key);
if (in_array($method, $methods)) {
$this->$method($value);
}
}
return $this;
}
public function setComment($text)
{
$this->_comment = (string) $text;
return $this;
}
public function getComment()
{
return $this->_comment;
}
public function setEmail($email)
{
$this->_email = (string) $email;
return $this;
}
public function getEmail()
{
return $this->_email;
}
public function setCreated($ts)
{
$this->_created = $ts;
return $this;
}
public function getCreated()
{
return $this->_created;
}
public function setId($id)
{
$this->_id = (int) $id;
return $this;
}
public function getId()
{
return $this->_id;
}
}
1) 厳密に言えば、私たちは「貧血ドメインオブジェクト」に直面していますか?
2) 「ドメインオブジェクト」と呼ばれていますか ただ ドメインロジックが含まれているからですか?
3) この場合、findbookbyauthor()のような方法を含むマッパー。彼らはまた、ドメインロジックを扱っていますよね?ドメインオブジェクトも見なすことができますか?
どうもありがとう
解決
通常、値オブジェクトは、値を持つもの、通貨、日付、温度などをカプセル化します。値と単位が含まれている場合がありますが、複雑ではありません。
ドメインオブジェクトは、ドメインロジックが含まれているため、より複雑になる可能性があります(ドメインオブジェクトのふりをするゲッターとセッターの束である貧血オブジェクトでない限り)。
たとえば、多くの請求書ライン(各請求書アイテムの行)を含む請求書ドメインオブジェクトがある場合があり、各請求書行には純額、税額、請求書アイテムがある場合があります。金額と請求書のアイテムは通常、価値のあるオブジェクトであり、合理的に単純です。
請求書自体は、支払いが遅れたため、承認プロセスのサポート、または会計システムのサポートのための金利と複雑になる可能性があります。
Valueオブジェクトは、異なるドメインで再利用可能になるほどシンプルです。ドメインオブジェクトは実際のドメインをモデル化し、通常、ビジネスロジックを含む特定のビジネスまたはドメインをモデル化するために書かれています。
それらの間にほとんど違いがほとんどないことがよくあるのは、多くの開発者がトランザクションスクリプト/データ転送オブジェクト設計を使用するが、ドメインモデルと呼ばれるからです。彼らは、ゲッターとセッターのコレクション「ドメインオブジェクト」にラベルを付けます。
他のヒント
彼ら できる 同じことになりなさい。そして多くの場合、彼らはそうです。でも:
- ドメインオブジェクトはビジネスロジックを実行できます(少なくともドメイン駆動型のデザインによると)、バリューオブジェクトはできません
- ドメインオブジェクトには情報全体がありますが、値オブジェクトは消費者に関連する情報の一部のみを保持します。
たとえば、anの場合 Invoice
ドメインオブジェクトは、値オブジェクトと同じになり、両方に同じクラスを使用できます。請求書番号、注文されたアイテム、合計価格があります。
一方、a User
ドメインオブジェクトには、システム内で処理できるようにするパスワードフィールドと電子メールフィールドがありますが、他のシステムに送信しないでください。したがって、これらの2つのフィールドがない新しいバリューオブジェクトが必要です。
以前の回答に基づいて、私は彼らが いいえ 同じ:
- ドメインオブジェクトには、ビジネスロジックを含めることができます。それらは問題空間のエンティティを表し、そのプロパティ値は変更され、一意のIDによって識別されます。
- Fourのギャングによると、Value Objects 不変です. 。そのようなオブジェクトは、IDではなく、その価値によって識別されます。