I'm building a rating system in which an object are rated on different parameters, each in a scale ranging from 1-5.
It's for a side project, so I'm trying to use the project to train other code-related skills, especially TDD and possibly DDD, but I'm a bit lost on how it will make sense to do the architecture.
The base structure consists of a User (we all like those guys), and I have an Thing (the thing we're rating). I User can rate multiple Things, and a Thing can be rated by multiple Users, so we and a ThingRating handling with a many-to-many relationship to User and Thing.
The ThingRating should consist of ratings of 4 different parameters, and it's the 4 parameters I'm not really sure where to put.
The easy option seems to add them as 4 properties on the ThingRating object, param1-4. Since the rating is a value ranging from 1-5, this is fine, but I'd have to validate the input in ThingRating since I can't typehint on int (or float, depending on the granularity I decide on), so I'm considering using a value object for the rating.
That means I'd either need a value object holding the rating of 1 parameter, or a value object consisting of all 4 parameters. Having the object hold all 4 parameters seems like it would basically be a mirror of the ThingRating, and it seems like it'd take out most of the functionality out of ThingRating (getSum, getAverage etc.), but having functionality in value objects makes them not value objects (as far as I've understood), which would mean I have 2 different business objects both containing part of the rating functionality, this seems like bad engineering.
Another possibility is having a value object with the rating of just 1 parameter. But then I think I'll need a property to know which parameter a value object holds the rating for, which would then mean either a string with the parameter name, or another value object.
I'm really confused which way to go, or if I'm going off in the wrong direction, or simply just overengineering. It's my first journey into DDD, which means that it's also very likely that I'm just mixing up the terms and concepts, so pointers for where and what to focus my conceptual research on, is as appreciated as pointers directly related to my problem.