Metodo per convalidare un oggetto - dovrei avere un metodo che incapsula tutta la logica di validazione

2

Ho una classe, cliente che ha alcune proprietà di base su di essa come firstname, surname, email, dateofbirth . Ho scritto un'altra classe chiamata CustomerValidation che attualmente ha un metodo pubblico e tre metodi privati. Il metodo pubblico è:

public bool ValidateCustomer(Customer customer)

Questo metodo chiama tre metodi privati che convalidano il nome, l'indirizzo email e la data di nascita del cliente inoltrato, restituendo true solo se tutti questi metodi restituiscono true.

Tuttavia, anche se per me ha senso convalidare un cliente in una chiamata, un'altra parte di me sta pensando, se collaudo questa unità, potrei passare in un cliente con più campi non validi e in realtà non sapere se ogni privato il metodo funziona correttamente, poiché solo uno di questi metodi che restituisce false potrebbe darmi un potenziale falso positivo.

Non ha senso per me scrivere test per l'API pubblica che mirano ai dettagli dell'implementazione. Quindi mi chiedo se dovrei rendere pubblici tutti i metodi, che comunque non si sentono giusti o rifattorizzare i metodi nelle loro classi e rielaborare la mia logica di validazione.

    
posta BenM 19.04.2016 - 14:23
fonte

2 risposte

3

Invece di bool potresti restituire qualche codice di errore intero o anche un messaggio di validazione nella stringa. Questo ti fornirebbe una conoscenza di ciò che ha fallito la convalida. La soluzione per le stringhe ha anche un vantaggio particolare perché hai già composto un messaggio per informare l'utente sui risultati della convalida.

    
risposta data 19.04.2016 - 15:55
fonte
2

In Ruby on Rails, che inserisce la logica di convalida nel modello piuttosto che nel controller o in altro modo più vicino al front-end, il pattern utilizzato è quello di fornire sia un Boolean che un dizionario degli errori. Dopo che un oggetto è stato convalidato , puoi accedere a errors dictionary che ha nomi di proprietà come chiavi e un insieme di stringhe di descrizione degli errori come valore. Quindi i metodi di convalida personalizzati devono aggiungere una stringa di errore per la chiave di proprietà corretta e il metodo is_valid restituisce true se il dizionario degli errori è vuoto. (Nota: i collegamenti sono alla documentazione delle rotaie per darti maggiori dettagli sul modello usato lì).

Questo approccio offre la semplicità di un singolo metodo di convalida booleana, ma la verbosità di ogni messaggio di errore di proprietà.

Il modo in cui è comunemente collegato alla vista è questo:

// in the controller:
// update someModel based on query parameters
if(someModel.IsValid()) {
  // go to the success page
} else {
  // render the same edit form, but use the errors dictionary to display the error string above each invalid input 
  renderEditPage(someModel.Errors);
}

Modifica: confronto con la risposta di @ Kaa

Il mio è per lo più lo stesso, con le seguenti eccezioni:

  1. dizionario degli errori invece della stringa di errore
  2. dizionario degli errori come proprietà separata piuttosto che un valore di ritorno
  3. alcuni collegamenti alla documentazione RoR.
risposta data 20.04.2016 - 08:10
fonte

Leggi altre domande sui tag