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

Multiple related values, using value object or not?

我正在构建一个评级系统,其中一个对象根据不同的参数进行评级,每个参数的等级范围为 1-5。

这是一个业余项目,所以我正在尝试使用该项目来训练其他与代码相关的技能,尤其是 TDD 和可能的 DDD,但我有点迷失了这样做的意义架构。

基本结构由一个 User(我们都喜欢这些人)组成,我有一个 Thing(我们的东西)重新评级)。我用户可以评价多个事物,一个事物可以被多个评价]Users,所以我们和 ThingRating 处理与 User 和 [=26= 的多对多关系]东西.

ThingRating 应该由 4 个不同参数的评级组成,这 4 个参数我不太确定放在哪里。

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

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

另一种可能性是有一个只有 1 个参数的值对象。但后来我想我需要一个 属性 来知道值对象持有哪个参数的评级,这意味着要么是带有参数名称的字符串,要么是另一个值对象。

我真的很困惑该走哪条路,或者我是否走错了方向,或者只是过度设计。这是我第一次进入 DDD,这意味着我也很可能只是混淆了术语和概念,所以对于我的概念研究应该关注的地方和内容的指示,与与我的问题直接相关的指示一样受到赞赏。

据我了解,ThingRating 将是一个包含 judgeId、thingId 和 param1-4(仔细命名)的聚合根。 param 属性将是 RatingValue 类型,它将是一个强制执行 1-5 评级的值对象。数据库唯一约束将用于防止同一用户多次评级。另外,"but having functionality in value objects makes them not value objects (as far as I've understood)" 不是真的。 VO 是不可变的,但仍然可以有行为。

"Ok, so you suggest keeping the 4 parameters on the ThingRating and and use the RatingValue for constraining the input." - JarIskov

完全正确!