Molto spesso ho bisogno di chiamare un metodo di servizio da un controller e in base al risultato, se c'è un errore mostra un messaggio di errore appropriato a seconda dell'errore (o qualche altra azione, mostrare il messaggio è solo un esempio), altrimenti procedere.
Un modo molto semplice che sto usando è di restituire un oggetto risultato da tali chiamate di metodo. Qualcosa del genere:
public interface Outcome {
boolean success();
String error;
}
public class Success implements Outcome {
public boolean success() {
return true;
}
public String error() {
return "";
}
}
public class Failure implements Outcome {
String error; //or call it reason
public Failure(String error) {
this.error = error;
}
public boolean success() {
return false;
}
public String error() {
return error;
}
}
E nel controller, verificando result.success () e procedendo in base al risultato.
C'è un modo più elegante / oop di farlo? Forse è come passare il successo e i callback falliti ai metodi di servizio come parametri, o in qualche modo migliore.
lascia che ti fornisca un esempio di codice concreto per chiarire:
Un nuovo utente, sceglie un nome utente per se stesso scrivendolo in un campo di testo, quindi preme il pulsante OK.
- SUCCESSO: l'utente è registrato
- FAIL: se c'è già un utente con lo stesso nome, all'utente viene richiesto di scegliere un nome diverso
- FAIL: qualche altro problema, supponiamo che il sistema non accetti nuove registrazioni al momento
- FAIL: username è una parola contrassegnata come offensiva
come vedi ci sono diversi risultati per una chiamata al metodo, e per ogni risultato deve essere intrapresa un'azione diversa.
public class UserService {
public Outcome register(String username)...
}
public class RegistrationController {
...
//somewhere inside controller, there is a handler for OK button's click event
onclick...
Outcome outcome = userService.register(username);
if(outcome.success())
...
else {
if(outcome.error() == "OFFENSIVE_USERNAME"
//... other outcomes
}
...
}