最近,我一直在努力理解DDD和模型层的概念。阅读了大量的文章、示例、问答,花费了很多时间。但我仍然不确定是否掌握了某些原则。
其中一个问题的答案是:领域对象中应该存在多少业务逻辑?有些资料说领域对象应该附带整个业务逻辑,另一方面,我也看到过一些文章认为它应该尽可能小,只表示其值。这让我感到很困惑。
在我的理解中,领域对象是代表领域中实体的类。
例如,我们来看看发票实体。每张发票都包含其项目。为了计算发票值,我们必须对所有项目的值进行求和(这是非常简单的例子,在实际世界中会出现添加税、计算已付金额等情况)。
class Invoice
{
public $id;
public $items = [];
public $status;
const STATUS_PAID = 'paid';
const STATUS_NOT_PAID = 'not_paid';
public function isPaid()
{
return $this->status == self::STATUS_PAID;
}
public function getInvoiceValue()
{
$sum = 0;
foreach($this->items as $item) {
$sum += $item->value;
}
return $sum;
}
}
我理解,isPaid() 方法是在正确的位置。它引用自己的数据。但是我对 getInvoiceValue() 不确定。这里我们操作的是其他领域对象。
也许我们应该仅使用领域对象来表示数据,但使用一些修饰器来执行更高级的任务?
提前感谢。