通过查看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集合标记为"域对象"。
根据前面的回答,我认为它们不是:
- 域对象可以包含业务逻辑。它们表示问题空间中的实体,它们的属性值可以更改,并由唯一ID标识。
- 根据四人帮,值对象是不可变的。这样的对象不通过任何ID来标识,而是通过它们的值来标识。
它们可以是同一件事。在很多情况下确实如此。然而:
- 域对象可以执行业务逻辑(至少根据域驱动设计),值对象不能
- 域对象拥有全部信息,而值对象只拥有与其消费者相关的部分信息。
例如,在Invoice
域对象的情况下,它将与值对象相同,然后您可以对两者使用相同的类-它将具有发票号码,订购的商品,总价。
另一方面,User
域对象将具有密码字段和电子邮件字段,您希望能够在您的系统中处理这些字段,但您不应该将其发送到其他系统。因此,您需要一个新的值对象,它缺少这两个字段。