Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 域对象和值对象-它们相等吗?_Oop_Zend Framework_Design Patterns_Value Objects_Domain Object - Fatal编程技术网

Oop 域对象和值对象-它们相等吗?

Oop 域对象和值对象-它们相等吗?,oop,zend-framework,design-patterns,value-objects,domain-object,Oop,Zend Framework,Design Patterns,Value Objects,Domain Object,通过查看Zend Quickstart教程中的域对象示例,以及考虑DAO/VO模式的其他示例,它们看起来非常相似 我们能推断说“值对象”和说“域对象”是一样的吗 如果没有,你能澄清一下它们之间的区别吗 一个的功能是什么,如果另一个的功能是什么 我这样问是因为,两者都是由接受者和接受者组成的。看起来,它们的功能是一样的 更新: Zend Framework快速教程文档称之为域对象: // application/models/Guestbook.php class Applicatio

通过查看Zend Quickstart教程中的域对象示例,以及考虑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)严格来说,我们面临的是“贫血域对象”吗

2)它之所以被称为“域对象”仅仅是因为它包含域逻辑吗

3)如果是这种情况,那么,那些包含findbookbyauther()等方法的映射器;他们也在处理域逻辑,对吗?它们也可以被视为域对象吗

非常感谢

它们可以是一样的东西。在许多情况下,他们是。然而:

  • 域对象可以执行业务逻辑(至少根据域驱动设计),而值对象不能
  • 域对象拥有全部信息,而值对象只持有与其使用者相关的部分信息
例如,对于
发票
域对象,它将与value对象相同,然后您可以对这两个对象使用相同的类-它将具有发票号、订购项目、总价


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

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

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

例如,您可能有一个包含多个发票行(每个发票项对应一行)的发票域对象,并且每个发票行可能有一个净额、一个税额和一个发票项。金额和发票项目通常是价值对象,并且相当简单

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

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


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

基于前面的回答,我认为它们不一样:

  • 域对象可以包含业务逻辑。它们代表问题空间中的实体,其属性值可能会更改,并由唯一ID标识
  • 根据四人帮的说法,价值对象。这些对象不是由任何ID标识的,而是由它们的值标识的
    当然,我说的是一般设计模式。YMMV如果您所在的社区对这些术语使用了不同的定义。我们是否可以说用“域模型”来称呼“事务脚本/数据传输对象设计”是错误的,除非这样说域模型只意味着MVC的“模型”,与给定域相关?我想我们需要区分“域模型”,这是一种特定的设计模式,而“域模型”或“模型”是一个更一般的术语。您可以在不使用域模型的情况下对域进行建模。MVC中的M可以是一个域模型,也可以只是一个域模型(或对象模型,等等)