Non so se ci sono nomi accettati per questi pattern (o anti-pattern), ma mi piace chiamarli come li chiamo qui. In realtà, sarebbe Domanda 1: quali sono i nomi accettati per questi pattern, se ce ne sono?
Supponiamo che esista un metodo che accetta una serie di parametri e che devi verificare l'input non valido prima di eseguire il codice effettivo del metodo:
public static void myMethod (String param1, String param2, String param3)
Stile di ostacolo
Lo chiamo così perché è come un ostacolo che un corridore di pista deve saltare per arrivare al traguardo. Puoi anche considerarli come barriere condizionali.
{
if (param1 == null || param1.equals("")) {
// some logging if necessary
return; // or throw some Exception or change to a default value
}
if (param2 == null || param2.equals("")) {
// I'll leave the comments out
return;
}
if (param3 == null || param3.equals("")) {
return;
}
// actual method code goes here.
}
Quando i controlli sono per una certa piccola sezione in un metodo più grande (e la sezione non può essere spostata su un metodo privato più piccolo), è possibile utilizzare i blocchi etichettati con le istruzioni break
:
{
// method code before block
myLabel:
{
if (param1 ... // I'll leave out the rest for brevity
break myLabel;
if (param2 ...
break myLabel;
...
// code working on valid input goes here
} // 'break myLabel' will exit here
// method code after block
}
Stile recinzione
Ciò circonda il codice con una fence che ha un gate condizionale che deve essere aperto prima di poter accedere al codice. Recinzioni annidate significherebbe più porte per raggiungere il codice (come una bambola russa).
{
if (param1 != null && !param1.equals("")) {
if (param2 != null && !param2.equals("")) {
if (param3 != null && !param3.equals("")) {
// actual method code goes here.
} else {
// some logging here
}
} else {
// some logging here
}
} else {
// some logging here
}
}
Potrebbe anche essere riscritto come segue. Le istruzioni di registrazione sono accanto ai controlli, anziché essere dopo il codice del metodo effettivo.
{
if (param1 == null || param1.equals("")) {
// some logging here
} else if (param2 == null || param2.equals("")) {
// some logging here
} else if (param3 == null || param3.equals("")) {
// some logging here
} else {
// actual method code goes here.
}
}
Domanda 2: quale stile è migliore e perché?
Domanda 3: ci sono altri stili?
I personally prefer hurdle style because it looks easier on the eyes and does not keep indenting the code to the right every time there's a new parameter. It allows intermittent code between checks, and it's neat, but it's also a little difficult to maintain (several exit points).
The first version of fence style quickly gets really ugly when adding parameters, but I suppose it's also easier to understand. While the second version is better, it can be broken accidentally by a future coder, and does not allow intermittent code between conditional checks.