多个相关值,是否使用值对象?

时间:2015-08-30 15:40:01

标签: php architecture domain-driven-design

我建立了一个评级系统,在该系统中,对象按不同参数进行评级,每个参数的范围为1-5。

这是一个辅助项目,因此我尝试使用该项目来培训其他与代码相关的技能,特别是TDD和可能的DDD,但我对它的表现有点失落做这个架构是有意义的。

基础结构由用户(我们都喜欢那些人)组成,我有一个 Thing (我们评价的东西)。我用户可以对多个用户进行评分,并且用户可以对用户进行评分,因此我们和 ThingRating 处理与用户用户的多对多关系。

ThingRating 应包含4个不同参数的等级,而且我不确定放在哪里的4个参数。

easy选项似乎将它们添加为 ThingRating 对象param1-4的4个属性。由于评级是1-5之间的值,这很好,但是我必须在 ThingRating 中验证输入,因为我无法在int(或者float,取决于我决定的粒度),所以我考虑使用值对象进行评级。

这意味着我要么需要一个持有1个参数等级的值对象,要么需要一个由所有4个参数组成的值对象。让对象保存所有4个参数似乎基本上是 ThingRating 的镜像,并且它似乎从 ThingRating (getSum,getAverage等),但在值对象中具有功能使它们不是值对象(据我所知),这意味着我有2个不同的业务对象都包含部分评级功能,这好像是糟糕的工程。

另一种可能性是使用一个只有1个参数的值对象。但后来我认为我需要一个属性来知道值对象保持评级的参数,这意味着带有参数名称的字符串或其他值对象。

我真的很困惑要走哪条路,或者我是朝着错误的方向走,还是只是过度工程。这是我第一次进入DDD之旅,这意味着我很可能只是混淆了术语和概念,因此指出我的概念研究的重点在哪里和什么,是与我的问题直接相关的指针一样受欢迎。

1 个答案:

答案 0 :(得分:1)

根据我的理解,ThingRating将是一个带有judgeId,thingId和param1-4(仔细命名)的聚合根。 param属性的类型为RatingValue,它将是强制1-5等级的值对象。数据库唯一约束将用于防止同一用户多次评级。此外,“但在价值对象中具有功能使它们不是价值对象(据我所知)”并非如此。 VO是不可改变的,但仍然可以有行为。

  

“好的,所以你建议在ThingRating上保留4个参数   并使用RatingValue来约束输入。“ - JarIskov

完全!