Come dovrei segnalare più errori come risultato della convalida?

4

Dire, ho una funzione, RegisterUser() che contiene i dettagli di registrazione di un utente come il loro nome utente, nome e password e li registra se non ci sono dati non validi. Per tali funzioni, è importante segnalare tutti gli errori contemporaneamente, invece di fermarsi al primo test in cui la convalida fallisce.

Un'eccezione è probabilmente fuori questione qui, poiché la pratica generale è quella di gettarli immediatamente una volta che si è verificato un errore. L'unico modo che potrei pensare di fare questo è usare un campo intero in cui vengono restituiti e restituiti vari valori di errore; tuttavia, non ho davvero visto questo essere usato ovunque; per non parlare del codice molto complicato e confuso che la gestione richiederebbe:

rv = RegisterUser(...)
err_msg = []

if (rv != 0) {
  err_msg_lookup_table = ["The username was invalid.", "That username is already taken up.", ...]

  for (i = 1; i < MAX_INT_VAL; i *= 2) {
    if (rv & i == i) {
      err_msg.push(err_msg_lookup_table[log(i, 2)])
    }
  }

  ShowMessage(err_msg)
}

C'è un modo migliore per farlo?

Questo è un duplicato ma non ha risposte.

    
posta user2064000 05.10.2016 - 13:27
fonte

4 risposte

4

Perché non legare i messaggi di errore in una raccolta in un'eccezione personalizzata e lanciare quell'eccezione al completamento? Il codice ricevente può quindi rilevare l'eccezione e iterare la raccolta per segnalare gli errori. Registrerei gli errori separatamente invece di concatenarli (sembra un problema di presentazione)

Un'alternativa è usare qualcosa come Scala O struttura , che è possibile restituire dal metodo. La tua implementazione di Either (come suggerisce il nome) restituirà i risultati positivi di quel metodo o una raccolta di errori.

    
risposta data 05.10.2016 - 14:58
fonte
2

Costruire un oggetto "risultato di convalida" è una buona via di mezzo, se le eccezioni diventano troppo disordinate.

public class ValidationResult
{
    public ValidationResult()
    {
        errorMessages = new List<string>();
    }

    public bool IsValid { get; private set; }

    private List<string> errorMessages;

    public IEnumerable<string> ErrorMessages
    {
        get { return errorMessages; }
    }

    public void AddErrorMessage(string errorMessage)
    {
        IsValid = false;
        errorMessages.Add(errorMessage);
    }
}

Quindi puoi creare il tuo risultato di convalida quando convalidi diversi campi o proprietà:

ValidationResult result = new ValidationResult();

if (name == null)
    result.AddErrorMessage("The 'Name' field is required");

if (age < 18)
    result.AddErrorMessage("The 'Age' field must be greater than or equal to 18");

return result;

Quindi puoi elaborare quei risultati:

ValidationResult result = x.Validate();

if (result.IsValid)
{
    // Save to database
}
else
{
    // Show result.ErrorMessages to the user
}

Nota: il mio codice è in C #, poiché non hai specificato in quale lingua sono stati scritti gli esempi di codice.

    
risposta data 05.10.2016 - 16:15
fonte
0

Come hai detto, la gestione è "molto complicata e confusa".

Il mio suggerimento è di aggiungere un public String[] getErrorMessage() alla classe responsabile della registrazione dell'utente.

Prendi in considerazione però che alcuni errori non permetteranno di intraprendere ulteriori passi in modo che l'elenco degli errori sia incompleto in quanto non sarebbero stati tentati passi che avrebbero anche fallito.

Un'altra opzione consiste nel creare un'eccezione personalizzata, contenente tutti i messaggi di errore e lanciarla all'ultimo momento. In questo modo, il codice di chiamata farebbe e.getErrorMessages() .

    
risposta data 05.10.2016 - 14:09
fonte
0

Hai intenzione di fare qualcosa con gli errori diversi da visualizzarli all'utente? In caso contrario, quello che faccio di solito è semplicemente costruire una stringa contenente il testo di tutti gli errori. Come:

StringBuilder errors=new StringBuilder();
if (find_name(new_user_name)) {
  errors.append("User name already in use<br/>";
}
if (password.length==0) {
  errors.append("Password required<br/>");
}
if (prettiness(favorite_color)<20) {
  errors.append("Favorite color is not pretty enough<br/>");
}
... whatever other tests ...
if (errors.length>0) {
  showError(errors);
} else {
  processRegistration();
}

(Ho messo br's dopo ogni errore qui sull'idea che li mostreremo su una pagina web.)

Ho avuto alcuni casi in cui ho creato una raccolta di qualche tipo e aggiunto i messaggi di errore alla raccolta, ma in retrospettiva non guadagna nulla. Devo ancora aggiungere le stringhe insieme per la visualizzazione.

Se si restituiscono errori da una funzione e il chiamante può provare a fare qualcosa sugli errori piuttosto che visualizzarli, è tutta un'altra storia. Ho difficoltà a pensare a un momento in cui ho dovuto farlo, ma penso che avrei creato una raccolta di codici di errore e ho definito i codici di errore come enum.

    
risposta data 05.10.2016 - 16:00
fonte

Leggi altre domande sui tag