如何为这个域建模? DDD

时间:2017-10-02 21:13:36

标签: oop domain-driven-design

在我尝试建模的域中,有两个类:ClothingType和TreatmentType

public class ClothingType : Entity<Guid>
{
    public string Name { get; protected set; }

    public ClothingType(Guid id, string name)
        : base (id)
    {
        Name = name;
    }
}

public class TreatmentType : Entity<Guid>
{
    public string Name { get; protected set; }

    public TreatmentType(Guid id, string name)
        : base(id)
    {
        Name = name;
    }
}

服装类型(T恤,裤子等)支持多种TreatmentType(洗涤,熨烫等)。许多ClothingType都可以支持一种TreatmentType。但是,指定TreatmentType的价格根据服装类型而有所不同。

想象一下两种治疗方法:洗脸和熨烫。在T恤上,洗衣费20美元,裤子费35美元,依此类推。如何建模?

提前致谢。

2 个答案:

答案 0 :(得分:1)

服装类型和实体类型可能是值,而不是实体。

可能有一个产品目录或类似的产品目录,其查询方法将服装类型和实体类型作为输入,并提供定价估算作为输出。如果您需要在域逻辑中进行定价估算,那么您可能会通过域服务实现这一目标,该域服务允许模型访问产品目录的最新副本以查找定价。

答案 1 :(得分:0)

查看Alberto Brandolini的Event Storming方法,以便您可以发现您正在处理的域名。结算是您核心有限背景的一部分吗?

如果它只是一个有价格的常见电子商务产品,那么您应该首先将ClothingTypeTreatmentType定义为值对象。我不是Java专家,但在PHP中它看起来像这样:

class Cloth {

   /** @var ClothingType */
   private $type;

   /** @var TreatmentType[]|array */
   private $treatments;

   ...
}

同时检查Money模式,因为它在创建ValueObjects时可能会派上用场。

我建议不要潜入DDD(特别是在战术阶段)而不要轻易理解它的原则。至少尝试阅读Vaughn的DDD Distilled。

编辑:再考虑一下我会设计或多或少的设计:

class Treatment {
    /** @var TreatmentId */
    private $treatmentId;        

    /** @var TreatmentType */
    private $type;

    /** @var Money */
    private $price;

    //constructor, getters, etc.

    public function modifyPrice(int $amount)
    {
        $this->price = new Money($amount);
    }
}

class Cloth {
     /** @var ClothType */
     private $type;

     /** @var Treatment[]|array */
     private $treatments;

     public function addTreatment(Treatment $aTreatment)
     {
         array_push($this->treatments, $aTreatment);
     }
}