8

ドメイン オブジェクトから Zend へのクイックスタート チュートリアルの例と、DAO/VO パターンを考慮した他の例を見ると、両者は非常に似ているように見えます。

「値オブジェクト」と言うのは「ドメイン オブジェクト」と同じだと推測できますか?

そうでない場合は、それらの違いを明確にしていただけますか?

あるものの機能は何ですか?

どちらもゲッターとセッターによって構成されており、それ以上のものではないため、私はこれを求めています。どうやら、彼らは同じ機能を果たしているようです...

アップデート:

そのため、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)厳密に言えば、「Anemic Domain Object」に直面しているのでしょうか?

2)ドメインロジックが含まれているという理由だけで「ドメインオブジェクト」と呼ばれていますか?

3)この場合、findBookByAuthor() などのメソッドを含むマッパー。彼らはドメインロジックも扱っていますよね?それらもドメインオブジェクトと見なすことができますか?

どうもありがとう

4

3 に答える 3

13

通常、値オブジェクトは、通貨、日付、気温など、値を持つものをカプセル化します。値と単位が含まれる場合がありますが、複雑ではありません。

ドメイン オブジェクトは、ドメイン ロジックが含まれているため、より複雑になる可能性があります (ドメイン オブジェクトのふりをする getter と setter の集まりである Anemic Domain Object でない限り)。

たとえば、多くの請求明細 (各請求項目の明細) を含む請求ドメイン オブジェクトがあり、各請求明細に正味額、税額、および請求項目があるとします。Amounts とおそらく Invoice Item は、通常、Value オブジェクトであり、かなり単純です。

請求書自体は、遅延支払の金利、承認プロセスのサポート、または会計システムのサポートによって複雑になる可能性があります。

値オブジェクトは、異なるドメイン間で再利用できるほど単純です。ドメイン オブジェクトは実際のドメインをモデル化し、通常、ビジネス ロジックを含む特定のビジネスまたはドメインをモデル化するために作成されます。

それらの間にほとんど違いが見られない理由は、多くの開発者がトランザクション スクリプト/データ転送オブジェクト設計を使用し、それをドメイン モデルと呼んでいるためです。ゲッターとセッターのコレクションに「ドメイン オブジェクト」というラベルを付けます。

于 2011-05-02T20:30:03.003 に答える
3

以前の回答に基づいて、私はそれらが同じではないと考えています。

  1. ドメイン オブジェクトには、ビジネス ロジックを含めることができます。それらは問題空間内のエンティティを表し、それらのプロパティ値は変更される可能性があり、一意の ID によって識別されます。
  2. Gang of Four によると、値オブジェクトは immutableです。このようなオブジェクトは ID ではなく、値によって識別されます。
于 2012-12-19T16:02:32.423 に答える
2

それらは同じものである可能性があります。そして、多くの場合、そうです。でも:

  • ドメイン オブジェクトはビジネス ロジックを実行できますが (少なくともドメイン駆動設計によると)、値オブジェクトは実行できません。
  • ドメイン オブジェクトはすべての情報を保持しますが、値オブジェクトはその消費者に関連する情報の一部のみを保持します。

たとえば、Invoiceドメイン オブジェクトの場合、値オブジェクトと同じになり、同じクラスを両方に使用できます。これには、請求書番号、注文したアイテム、合計金額が含まれます。

一方、Userドメイン オブジェクトには、システム内で処理できるようにしたいパスワード フィールドと電子メール フィールドがありますが、他のシステムには決して送信しないでください。したがって、これら 2 つのフィールドがない新しい値オブジェクトが必要です。

于 2011-05-02T19:42:46.643 に答える