La motivazione;
I want to report on all the possible problems at once instead of having to peel the onion of every possible problem over and over. It also makes testing much easier because I can have one test for success and one test that handles any/all failures. Much like you do form validation on the client side before you submit to the back end. But instead the back end is letting clients out of its control know what is wrong in total instead of peeling the onion one validation failure at a time.
Sto provando a creare un pattern per testare le precondizioni multiple che devono essere tutte true
e più di uno può essere false
.
Esempio:
Non essere preso alla lettera come il problema da risolvere, sto solo mostrando come esce la roba di Guava
. Potrebbe essere un gruppo di istruzioni if/elseif/then/else
o un gruppo di Predicates
che sono tutte concatenate insieme a .and()
. Questo è solo un strawman per mostrare come l'oscilloscopio sfugge al controllo.
public boolean process(@Nonnull final String left, @Nonnull final String right)
{
Preconditions.checkArgument(!left.isEmpty());
Preconditions.checkArgument(!right.isEmpty());
Preconditions.checkArgument(/* left meets some regex */)
Preconditions.checkArgument(/* right meets some regex */)
/* more, more, more, etc. */
/* actual logic goes here */
}
Potrei ovviamente completare ogni singolo controllo con un blocco try/catch
creare un test List<IllegalArgumentException>
se !isEmpty()
e poi creare un ChainedException
con tutte le cause principali e lanciarlo, ma questo è un gran numero di codice boilerplate inserire tutti i metodi che hanno più Precondition
requirements.java
Now imagine that I have a lot more preconditions than this, and it is in a
Builder.build()
method. The client side form validation idiom makes good sense in these cases, like in the case of aMicroservice
that takes a payload and validates it before it acts on it. If it has dozens of preconditions it gets ugly fast. You do not want to have to makeN
calls with error codes forN
validation failures, you want to send back all the problems in one error response instead of possibly dozens of back and forth.
public boolean save(@Nonnull final SomeDomainObjectWithLotsOfFields sdowlof)
{ /* lots and lots of boilerplate to handle all the preconditions */ }
So che ci deve essere un qualche tipo di pattern ChainablePreconditions
che non riesco a trovare e volevo assicurarmi che non mi manchi qualcosa prima di re-inventare la ruota e scrivere la mia su ChainOfResponsibliy
di implementazione.
Altrimenti pubblicherò una risposta con un link a GitHub per qualsiasi altra idea che offro.