【问题标题】:Domain Objects and Value Objects - are they equal?域对象和值对象——它们相等吗?
【发布时间】:2011-08-17 05:26:32
【问题描述】:

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

我们可以推断说“值对象”与说“域对象”是一样的吗?

如果不是,您能澄清一下它们之间的区别吗?

一个的功能是什么,如果另一个的功能呢?

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

更新:

所以,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(); 之类的方法;他们也在处理域逻辑,对吗?它们也可以被视为领域对象吗?

非常感谢

【问题讨论】:

    标签: oop zend-framework design-patterns value-objects domain-object


    【解决方案1】:

    通常,值对象封装了具有值的事物:货币、日期、温度等。它们可能包含值和单位,但并不复杂。

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

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

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

    值对象非常简单,可以跨不同域重用。域对象为您的实际域建模,通常用于为您的特定业务或域建模,包括您的业务逻辑。

    您经常看到它们之间几乎没有区别的原因是许多开发人员将使用事务脚本/数据传输对象设计,但称其为领域模型。他们将自己的 getter 和 setter 集合标记为“域对象”。

    【讨论】:

    • 当然,我说的是通用设计模式的意义。如果您所在的社区对这些术语使用不同的定义,则 YMMV。
    • 我们能不能说通过“域模型”调用“事务脚本/数据传输对象设计”是错误的,除非以域模型的方式说话,仅表示 MVC 的“模型”,与给定域相关?
    • 我认为我们需要区分“域模型”,这是一种特定的设计模式,以及“域模型”或“模型”,这是一个更笼统的术语。您可以在不使用域模型的情况下为您的域建模。 MVC 中的 M 可以是领域模型,也可能只是领域模型(或对象模型等)
    【解决方案2】:

    根据之前的回复,我认为它们相同:

    1. 域对象可以包含业务逻辑。它们代表问题空间中的实体,它们的属性值可能会更改并由唯一 ID 标识。
    2. 根据四人帮的说法,值对象are immutable。此类对象不是由任何 ID 标识的,而是由它们的值标识的。

    【讨论】:

      【解决方案3】:

      它们可以是同一个东西。在许多情况下,它们是。然而:

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-09-22
        • 2021-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多