DDD,PHP.域对象和业务逻辑

hop*_*sey 7 php domain-driven-design model domain-object

我最近一直忙于尝试理解ddd和Model层的概念.阅读大量的文章,例子,Q和A,花了很多时间.而且我仍然不确定我是否有正确的原则.

其中之一就是问题的答案:Domain Objects中应该存在多少业务逻辑?有些消息来源说Domain Objects应该附带整个业务逻辑,另一方面,我遇到了一些文章,我认为它应该尽可能小,只代表它的价值.这让我很困惑.

在我的理解中,域对象是表示域中实体的类.

因此,举例来说,请使用Invoice实体.每张发票都包含其项目.要计算发票金额,我们必须对所有项目值进行求和(这是非常简单的示例,在现实世界中会出现添加税,计算付费价值等情况)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的理解中,方法isPaid()是在正确的位置.它指的是自己的数据.但我不确定getInvoiceValue().我们在这里运行其他域对象.

也许我们应该只使用域对象来表示数据,但是使用一些装饰器来执行更高级的任务?

提前致谢.

Mar*_*idt 4

域对象中应该存在多少业务逻辑?[...] 我看到一些文章,我认为它应该尽可能小并且只代表它的值。

请注意贫血领域模型,它几乎完全由数据组成,缺乏行为。DDD 旨在创建行为丰富的领域模型。因此,将逻辑添加到域类中就可以了。

DDD 强调良好的面向对象设计,将方法和数据放在一起,从而促进高度内聚的系统