Nel codice visualizzato, i problemi di convalida non comunicano nuovamente al codice che sta creando questa istanza dell'oggetto. Probabilmente non è una COSA BUONA.
Variante 1:
Se si cattura l'eccezione all'interno del metodo/costruttore, essere sicuri di passare qualcosa al chiamante. È possibile inserire un campo isValid
impostato su true se tutto funziona. Che sarebbe simile a questa:
private boolean isValid = false;
public FileDataValidator(String[] lineData){
this.lineData = lineData;
removeLeadingAndTrailingQuotes();
try
{
validateName();
validateAge();
validateTown();
isValid = true;
}
catch(InvalidFormatException e)
{
isValid = false;
}
}
public boolean isValid() {
return isValid;
}
Variante 2:
o si può lasciare che l'eccezione o qualche altra eccezione si propagano al chiamante. Ho mostrato come eccezioni non controllato, ma fare quello che funziona secondo la vostra gestione religione eccezione:
public FileDataValidator(String[] lineData){
this.lineData = lineData;
removeLeadingAndTrailingQuotes();
try
{
validateName();
validateAge();
validateTown();
}
catch(InvalidFormatException e)
{
throw new com.myco.myapp.errors.InvalidDataException(e.getMessage());
}
}
Variante 3:
Il terzo metodo che voglio citare è il codice come questo. Nel codice chiamante devi chiamare il costruttore e quindi chiamare la funzione build()
che funzionerà o meno.
String[] lineData = readLineData();
FileDataValidator onePerson = new FileDataValidator();
try {
onePerson.build(lineData);
} catch (InvalidDataException e) {
// What to do it its bad?
}
Ecco il codice della classe:
public FileDataValidator() {
// maybe you need some code in here, maybe not
}
public void build(String[] lineData){
this.lineData = lineData;
removeLeadingAndTrailingQuotes();
try
{
validateName();
validateAge();
validateTown();
}
catch(InvalidFormatException e)
{
throw new com.myco.myapp.errors.InvalidDataException(e.getMessage());
}
}
Naturalmente, la funzione build()
potrebbe utilizzare un metodo isValid()
che si chiama per vedere se il suo diritto, ma un'eccezione sembra il modo giusto per me per la costruire la funzione.
Variation 4:
Il quarto metodo che voglio citare è quello che mi piace di più. Ha un codice come questo. Nel codice chiamante devi chiamare il costruttore e quindi chiamare la funzione build()
che funzionerà o meno.
Questo tipo segue il modo in cui funzionano JaxB e JaxRS, una situazione simile a quella che si ha.
- Una fonte esterna di dati: si dispone di un file, hanno un messaggio in arrivo in formato XML o JSON.
- Codice per creare gli oggetti: si dispone del codice, hanno le loro librerie di codice che funzionano secondo le specifiche delle varie JSR.
- La convalida non è legata alla costruzione degli oggetti.
Il codice chiamante:
String[] lineData = readLineData();
Person onePerson = new Person();
FileDataUtilities util = new FileDataUtilities();
try {
util.build(onePerson, lineData);
util.validate(onePerson);
} catch (InvalidDataException e) {
// What to do it its bad?
}
Ecco il codice della classe in cui i dati vive:
public class Person {
private Name name;
private Age age;
private Town town;
... lots more stuff here ...
}
E il codice di utilità per costruire e validare:
public FileDataValidator() {
// maybe you need some code in here, maybe not
}
public void build(Person person, String[] lineData){
this.lineData = lineData;
removeLeadingAndTrailingQuotes();
setNameFromData(person);
setAgeFromData(person);
setTownFromData(person);
}
public boolean validate(Person person) {
try
{
validateName(person);
validateAge(person);
validateTown(person);
return true;
}
catch(InvalidFormatException e)
{
throw new com.myco.myapp.errors.InvalidDataException(e.getMessage());
}
}
Più informazioni è cosa si farebbe con 'e' nel caso di un'API,' printStackTrace' ha un odore divertente. Sicuramente dovresti lasciare che gli utenti del codice incontrino l'eccezione in modo che possano fare qualcosa al riguardo? Ecco a cosa servono le eccezioni. –
Perché non modificare le operazioni 'validateXXX' per restituire i booleani e quindi impostare una variabile chiamata' valid' da essere se tutte e tre le chiamate 'validateXXX' sono valide. Esporre quindi var con un metodo 'isValid' – cmbaxter
Fare qualcosa con il [Command Pattern] (http://en.wikipedia.org/wiki/Command_pattern) può aiutare qui; cioè, creare un'istanza di un metodo che chiamerai più volte, passare i dati per convalidare e lasciare che il metodo faccia il lancio dell'eccezione. –