I would like to validate some objects. The validation has two parts:
- validation whether the user has right to access the object (the specific rights are already calculated and stored in boolean values, there are maximum 4 roles)
- checking if the object is in a certain state (from a set of states)
I have a lot of rules (actually around 25 in total ) like the ones below that need to be validated:
- isOwner && (status == 11 || status == 13 || status == 14)
- !(isOwner && isReceiver && status == 12)
- …..
I have these rules spread out in several methods, 4 or 5 rules in a method.
If a rule fails then the other rules do not get checked.
I need to construct a validator (or set up an already constructed one) in every method that uses this validation.
I am looking for a design pattern that would make it easier to build a structure to validate objects. My goal is to be able to provide specific error messages. For instance if the validation failed because the user doesn’t have rights then I want to let him/her know this. If it failed because the object’s state then I want to display that
.
First I though of the decorator pattern. I have an error message handler object that could be decorated with the specific error messages. One decorator would check for user rights and another one for states. But the order in which I am constructing my validator objects does not matter so the power of decorator pattern is not used. (AFAIK this is one big advantage of using decorator – mixing the decorations). I think a chain might be better for this case…?!?! What design alternative would you recommend for this scenario?
Instead of thinking about what pattern to use, think about what objects make sense, and what their behaviors should be.
In this case, what you want to do is pass an object to a series of rules. If it fails one of the rules, that will trigger a message, and the rest of the rules don’t get checked (is that correct)?
If so, you’ll notice that what we’re not talking about a scenario where the data is passed to all of the rules in the chain… which is indicative of a chain of command pattern, rather than a decorator.
On the other hand, if you want to pass it to all of the rules, it sounds to me almost more like a visitor pattern.
Think of the ideal solution, and then identify the pattern. Don’t start by trying to find a pattern to apply.