域对象和值对象——它们是相等的吗?



通过查看Zend快速入门教程中的域对象示例,以及考虑DAO/VO模式的其他示例,它们似乎都非常相似。

我们可以推断说"值对象"和说"领域对象"是一样的吗?

如果没有,请说明它们之间的区别。

一个函数是什么,另一个函数又是什么?

我问这个是因为,它们都是由getter和setter组成的,仅此而已。看来,它们的作用是一样的……

更新:

所以,Zend框架快速教程文档称之为域对象:

 // 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();它们也在处理领域逻辑,对吧?它们也可以被认为是领域对象吗?

Thanks to lot

典型的值对象封装了一些有值的东西:货币、日期、温度等。它们可以包含值和单位,但不是复数。

域对象可能更复杂(除非它是一个贫血域对象,它是一堆假装成域对象的getter和setter),因为它包含域逻辑。

例如,您可能有一个包含许多发票行(每个发票项对应一行)的Invoice域对象,并且每个Invoice行可能有一个Net Amount、一个Tax Amount和一个Invoice Item。金额和可能的发票项通常是值对象,并且相当简单。

发票本身可能会因为延迟付款的利率、对审批流程的支持或对会计系统的支持而变得复杂。

Value Object足够简单,可以跨不同的域重用。领域对象为您的实际领域建模,并且通常被编写为建模您的特定业务或领域,包括您的业务逻辑。

你经常发现它们之间差别不大的原因是,许多开发人员将使用事务脚本/数据传输对象设计,但称之为领域模型。他们将getter和setter集合标记为"域对象"。

根据前面的回答,我认为它们不是:

  1. 域对象可以包含业务逻辑。它们表示问题空间中的实体,它们的属性值可以更改,并由唯一ID标识。
  2. 根据四人帮,值对象是不可变的。这样的对象不通过任何ID来标识,而是通过它们的值来标识。

它们可以是同一件事。在很多情况下确实如此。然而:

  • 域对象可以执行业务逻辑(至少根据域驱动设计),值对象不能
  • 域对象拥有全部信息,而值对象只拥有与其消费者相关的部分信息。

例如,在Invoice域对象的情况下,它将与值对象相同,然后您可以对两者使用相同的类-它将具有发票号码,订购的商品,总价。

另一方面,User域对象将具有密码字段和电子邮件字段,您希望能够在您的系统中处理这些字段,但您不应该将其发送到其他系统。因此,您需要一个新的值对象,它缺少这两个字段。

相关内容

  • 没有找到相关文章

最新更新