【发布时间】:2015-11-24 17:20:15
【问题描述】:
我正在构建一个评级系统,其中一个对象根据不同的参数进行评级,每个参数的范围从 1 到 5。
这是一个副项目,所以我试图使用该项目来训练其他与代码相关的技能,尤其是 TDD 和可能的 DDD,但我有点迷失了如何去做这个架构。
基础结构包含一个用户(我们都喜欢这些人),我有一个事物(我们正在评价的事物)。我的用户可以评价多个事物,而一个事物可以被多个用户评价,所以我们和ThingRating 处理与 User 和 Thing 的多对多关系。
ThingRating 应该包含 4 个不同参数的评级,而这 4 个参数我不太确定放在哪里。
简单的选项似乎将它们作为 4 个属性添加到 ThingRating 对象 param1-4。由于评级是一个介于 1-5 之间的值,这很好,但我必须验证 ThingRating 中的输入,因为我无法在 int (或浮点数,具体取决于粒度)上输入提示我决定了),所以我正在考虑使用一个值对象来进行评分。
这意味着我要么需要一个包含 1 个参数等级的值对象,要么需要一个包含所有 4 个参数的值对象。让对象包含所有 4 个参数似乎基本上是 ThingRating 的镜像,并且似乎会从 ThingRating 中取出大部分功能( getSum、getAverage 等),但在值对象中具有功能使它们不是值对象(据我所知),这意味着我有 2 个不同的业务对象都包含部分评级功能,这似乎是糟糕的工程.
另一种可能性是有一个只有 1 个参数的值对象。但是我想我需要一个属性来知道值对象持有哪个参数的评级,这意味着要么是带有参数名称的字符串,要么是另一个值对象。
我真的很困惑该走哪条路,或者我是否走错了方向,或者只是过度设计。这是我第一次进入 DDD 之旅,这意味着我也很可能只是混淆了术语和概念,因此对于我的概念研究重点在哪里和什么方面的指针,与与我的问题直接相关的指针一样受到赞赏。
【问题讨论】:
-
据我了解,
ThingRating将是judgeId、thingId和 param1-4(仔细命名)的聚合根。参数属性将是RatingValue类型,这将是一个强制执行 1-5 评级的值对象。将使用数据库唯一约束来防止同一用户多次评分。此外,“但在值对象中具有功能使它们不是值对象(据我所知)”是不正确的。 VO 是不可变的,但仍然可以有行为。 -
好的,所以您建议保留 ThingRating 上的 4 个参数,并使用 RatingValue 来约束输入。这听起来是一种聪明且相对简单的方法,谢谢。
标签: php architecture domain-driven-design