Доменные объекты и объекты стоимости - равны ли они? - PullRequest
7 голосов
/ 02 мая 2011

Рассматривая пример доменного объекта в учебнике Zend Quickstart и другие примеры, касающиеся шаблонов DAO / VO, они оба кажутся очень похожими.

Можем ли мы сделать вывод, что сказать «Объект значения» - это то же самое, что сказать «Доменный объект»?

Если нет, то не могли бы вы уточнить различия между ними?

Какова функция одного и что, если функция другого?

Я спрашиваю об этом, потому что оба составлены геттерами и сеттерами, и ничего более того. Кажется, они выполняют одну и ту же функцию ...

Обновление:

Итак, в документации по Zend Framework Quick Tutorial это называется доменным объектом:

 // 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 (); они также имеют дело с доменной логикой, верно? Могут ли они также рассматриваться как доменные объекты?

Большое спасибо

Ответы [ 3 ]

11 голосов
/ 03 мая 2011

Обычно объект значения инкапсулирует нечто, имеющее значение: валюта, даты, температура и т. Д. Они могут содержать значение и единицы измерения, но они не являются сложными.

Вероятно, объект доменаболее сложный (если только это не Anemic Domain Object, который представляет собой набор методов получения и установки, притворяющихся объектами домена), поскольку он содержит логику домена.

Например, у вас может быть объект домена Invoice, содержащий многоСтроки счетов-фактур (строка для каждой позиции счета-фактуры), и каждая строка счета-фактуры может иметь чистую сумму, сумму налога и позицию счета-фактуры.Суммы и, возможно, позиция счета-фактуры обычно являются объектами стоимости и являются достаточно простыми.

Сам счет-фактура может быть осложнен процентными ставками за просроченный платеж, поддержкой процесса утверждения или поддержкой вашей системы бухгалтерского учета.

Объект Value достаточно прост, чтобы его можно было повторно использовать в разных доменах.Объекты домена моделируют ваш фактический домен и обычно написаны для моделирования вашего конкретного бизнеса или домена, включая вашу бизнес-логику.

Причина, по которой вы часто будете видеть небольшую разницу между ними, заключается в том, что многие разработчики будут использовать сценарий транзакции./ Передача данных Проектирование объекта, но назовите его Доменная модель.Они маркируют свои коллекции геттеров и сеттеров как «доменные объекты».

2 голосов
/ 19 декабря 2012

Основываясь на предыдущих ответах, я придерживаюсь мнения, что они не одинаковы:

  1. Доменные объекты могут содержать бизнес-логику.Они представляют сущности в проблемном пространстве, значения их свойств могут быть изменены и идентифицируются уникальным идентификатором.
  2. Согласно банде четырех, объекты-значения являются неизменными .Такие объекты не идентифицируются ни по какому идентификатору, а по их значению
2 голосов
/ 02 мая 2011

Они могут быть одним и тем же.И во многих случаях они есть.Однако:

  • объекты домена могут выполнять бизнес-логику (по крайней мере, в соответствии с управляемым доменом дизайном), объекты-значения не могут
  • объекты домена иметь всю информацию, в то время как объекты-значения содержаттолько часть информации, которая имеет отношение к его потребителю.

Например, в случае объекта домена Invoice он будет таким же, как объект значения, и тогда вы можете использовать тот жекласс для обоих - у него будет номер счета, заказанные товары, общая стоимость.

С другой стороны, у предметного объекта User будет поле пароля и поле электронной почты, которое вы хотите иметьпроцесс в вашей системе, но вы никогда не должны отправлять в другие системы.Следовательно, вам нужен новый объект значения, в котором отсутствуют эти два поля.

...