Validation is a highly important process in our Domain Model. It checks not only for the correctness of attributes, but also for that of entire objects and the composition of those objects. Different levels of validation are required in order to keep this Model in a valid state. Just because an object consists of valid attributes (on a per basis) doesn't necessarily mean the object (as a whole) is valid. And the opposite is true: valid objects don't necessarily equal valid compositions.
Some people understand validation as the process whereby a service validates the state of a given object. In this case, the validation conforms to a Design-by-contract approach, which consists of preconditions, postconditions, and invariants. One such way to protect a single attribute is by using Chapter 3, Value Objects. In order to make our design more flexible for change, we focus only on asserting Domain preconditions that must be met. Here, we'll be using guards as an easy...