In dem angezeigten Code kommunizieren die Validierungsprobleme nicht mit dem Code, der diese Objektinstanz erstellt. Das ist wahrscheinlich keine gute Sache.
Variante 1:
Wenn Sie die Ausnahme in der Methode/Baumeister fangen, sollten Sie etwas zurück an den Aufrufer übergeben. Sie könnten ein Feld isValid
setzen, das auf "True" gesetzt wird, wenn alles funktioniert. Das würde wie folgt aussehen:
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:
Oder man könnte die Ausnahme oder eine andere Ausnahme propagiert den Anrufer lassen. Ich habe es als nicht-geprüfte Ausnahme gezeigt, aber tun, was funktioniert nach Ihrer Ausnahme Religion Handhabung:
public FileDataValidator(String[] lineData){
this.lineData = lineData;
removeLeadingAndTrailingQuotes();
try
{
validateName();
validateAge();
validateTown();
}
catch(InvalidFormatException e)
{
throw new com.myco.myapp.errors.InvalidDataException(e.getMessage());
}
}
Variation 3:
Die dritte Methode, die ich so hat Code erwähnen möchte. Im aufrufenden Code müssen Sie den Konstruktor aufrufen und dann die build()
Funktion aufrufen, die entweder funktioniert oder nicht.
String[] lineData = readLineData();
FileDataValidator onePerson = new FileDataValidator();
try {
onePerson.build(lineData);
} catch (InvalidDataException e) {
// What to do it its bad?
}
Hier ist der Klassencode:
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());
}
}
Natürlich ist die build()
Funktion eine isValid()
Methode, die Sie aufrufen verwenden könnte, um zu sehen, wenn sein Recht, sondern eine Ausnahme von mir den richtigen Weg scheint für die Build-Funktion.
Variation 4:
Die vierte Methode, die ich erwähnen möchte, ist, was ich am besten gefällt. Es hat Code wie diesen. Im aufrufenden Code müssen Sie den Konstruktor aufrufen und dann die build()
Funktion aufrufen, die entweder funktioniert oder nicht.
Diese Art von folgt die Art und Weise, wie JaxB und JaxRS arbeiten, die eine ähnliche Situation ist, was Sie haben.
- Eine externe Datenquelle - Sie haben eine Datei, sie haben eine eingehende Nachricht im XML- oder JSON-Format.
- Code zum Erstellen der Objekte - Sie haben Ihren Code, sie haben ihre Bibliotheken Code entsprechend den Spezifikationen in den verschiedenen JSRs arbeiten.
- Die Validierung ist nicht an das Erstellen der Objekte gebunden.
Der Aufrufcode:
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?
}
Hier ist die Klasse Code, wo die Daten leben:
public class Person {
private Name name;
private Age age;
private Town town;
... lots more stuff here ...
}
Und das Dienstprogramm Code zu erstellen und zu validieren:
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());
}
}
Mehr über was Sie mit 'e' im Falle einer API tun würden,' printStackTrace' riecht lustig. Sicherlich sollten Sie die Benutzer des Codes die Ausnahme auftreten lassen, damit sie etwas dagegen tun können? Dafür gibt es Ausnahmen. –
Warum ändern Sie nicht die 'validateXXX'-Operationen, um boolesche Werte zurückzugeben, und legen Sie dann eine Variable mit dem Namen' valid' fest, wenn alle drei 'validateXXX'-Aufrufe gültig sind. Dann exponieren Sie diese Variable mit einer Methode 'isValid' – cmbaxter
Etwas zu tun mit dem [Befehlsmuster] (http://en.wikipedia.org/wiki/Command_pattern) kann hier helfen; Das bedeutet, dass Sie eine Methode instanziieren, die Sie mehrmals aufrufen, indem Sie die zu überprüfenden Daten übergeben und diese Methode die Ausnahme auslösen lassen. –