Frage

Indem Sie auf das Beispiel eines Domain -Objekts in Zend QuickStart Tutorial und anderer Beispiele untersucht, die ein DAO/VO -Muster betrachten, scheinen sie beide sehr ähnlich zu sein.

Können wir schließen, dass das "Wertobjekt" dieselbe ist wie "Domain -Objekt" zu sagen?

Wenn nicht, können Sie bitte die Unterschiede zwischen diesen klären?

Was ist die Funktion von einem und was ist, wenn die Funktion eines anderen?

Ich frage das, weil beide von Gettern und Setter komponiert werden und nichts weiter als das. Es scheint, dass sie die gleiche Funktion machen ...

Aktualisieren:

Zend Framework Quick Tutorial Dokumentation nannte dies ein Domänenobjekt:

 // 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) Streng genommen sind wir im Gesicht eines "anämischen Domänenobjekts"?

2) Wird es als "Domänenobjekt" bezeichnet nur Weil es Domänenlogik enthält?

3) Wenn dies der Fall ist, dann enthalten diese Mapper, die Methoden wie FindbookByAuthor () enthalten; Sie beschäftigen sich auch mit Domain -Logik, oder? Könnten sie auch als Domänenobjekte angesehen werden?

Danke vielmals

War es hilfreich?

Lösung

Normalerweise fasst ein Wertobjekt etwas zusammen, das einen Wert hat: Währung, Daten, Temperaturen usw. Sie können einen Wert und Einheiten enthalten, aber nicht komplex.

Ein Domänenobjekt ist wahrscheinlich komplexer (es sei denn, es handelt sich um ein anämisches Domänenobjekt, bei dem es sich um eine Reihe von Gettern und Settern handelt, die vorgeben, ein Domänenobjekt zu sein), da es Domänenlogik enthält.

Zum Beispiel haben Sie möglicherweise ein Rechnungsdomänenobjekt, das viele Rechnungslinien enthält (eine Zeile für jedes Rechnungselement), und jede Rechnungslinie kann einen Nettobetrag, einen Steuerbetrag und ein Rechnungsgegenstand haben. Die Beträge und möglicherweise das Rechnungsgegenstand wären normalerweise Wertobjekte und sind einigermaßen einfach.

Die Rechnung selbst kann mit Zinssätzen für verspätete Zahlungen, Unterstützung für einen Genehmigungsprozess oder Unterstützung für Ihr Buchhaltungssystem kompliziert sein.

Das Wertobjekt ist einfach genug, um über verschiedene Domänen hinweg wiederverwendbar zu sein. Die Domänenobjekte modellieren Ihre tatsächliche Domäne und werden normalerweise geschrieben, um Ihr spezifisches Geschäft oder Ihre Domäne einschließlich Ihrer Geschäftslogik zu modellieren.

Der Grund, warum Sie häufig einen geringen Unterschied zwischen ihnen sehen, ist, dass viele Entwickler ein Transaktionskript/Datenübertragungsobjektdesign verwenden, es jedoch ein Domänenmodell nennen. Sie kennzeichnen ihre Sammlungen von Getters und Setter "Domain -Objekten".

Andere Tipps

Sie kann sei das gleiche. Und in vielen Fällen sind sie. Jedoch:

  • Domänenobjekte können die Geschäftslogik ausführen (mindestens gemäß dem Domänengesteuerungsdesign), können Wertobjekte nicht können
  • Domänenobjekte haben die gesamten Informationen, während Wertobjekte nur einen Teil der für den Verbraucher relevanten Informationen haben.

Zum Beispiel bei einem Invoice Domänenobjekt, es ist das gleiche wie das Wertobjekt, und dann können Sie dieselbe Klasse für beide verwenden - es verfügt über eine Rechnungsnummer, bestellte Artikel und den Gesamtpreis.

Andererseits a User Das Domain -Objekt verfügt über ein Kennwortfeld und ein E -Mail -Feld, das Sie in Ihrem System verarbeiten möchten. Sie sollten jedoch niemals an andere Systeme senden. Daher benötigen Sie ein neues Wertobjekt, dem diese beiden Felder fehlen.

Aufbauend auf den vorherigen Antworten bin ich der Meinung, dass sie es sind nicht das Gleiche:

  1. Domänenobjekte können Geschäftslogik enthalten. Sie repräsentieren Entitäten im Problemraum, ihre Eigenschaftswerte können geändert werden und werden durch eine eindeutige ID identifiziert.
  2. Gemäß der Bande von vier Vierzügen, Wertobjekte sind unveränderlich. Solche Objekte werden nicht durch eine ID identifiziert, sondern durch ihren Wert.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top