在我尝试建模的域中,有两个类: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美元,依此类推。如何建模?
提前致谢。
答案 0 :(得分:1)
服装类型和实体类型可能是值,而不是实体。
可能有一个产品目录或类似的产品目录,其查询方法将服装类型和实体类型作为输入,并提供定价估算作为输出。如果您需要在域逻辑中进行定价估算,那么您可能会通过域服务实现这一目标,该域服务允许模型访问产品目录的最新副本以查找定价。
答案 1 :(得分:0)
查看Alberto Brandolini的Event Storming方法,以便您可以发现您正在处理的域名。结算是您核心有限背景的一部分吗?
如果它只是一个有价格的常见电子商务产品,那么您应该首先将ClothingType
和TreatmentType
定义为值对象。我不是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);
}
}