Ich stoße oft auf dieses Problem, besonders in Java, auch wenn ich denke, dass es sich um ein allgemeines OOP-Problem handelt. Das heißt: Das Auslösen einer Ausnahme zeigt ein Konstruktionsproblem auf.
Angenommen, ich habe eine Klasse mit einem String name
Feld und einem String surname
Feld.
In diesen Feldern wird dann der vollständige Name einer Person angegeben, um ihn auf einem Dokument, beispielsweise einer Rechnung, anzuzeigen.
public void String name;
public void String surname;
public String getCompleteName() {return name + " " + surname;}
public void displayCompleteNameOnInvoice() {
String completeName = getCompleteName();
//do something with it....
}
Jetzt möchte ich das Verhalten meiner Klasse stärken, indem ich einen Fehler auslöse, wenn der displayCompleteNameOnInvoice
aufgerufen wird, bevor der Name vergeben wurde. Es scheint eine gute Idee zu sein, nicht wahr?
Ich kann der getCompleteName
Methode einen Code hinzufügen, der Ausnahmen auslöst . Auf diese Weise verstoße ich jedoch gegen einen "impliziten" Vertrag mit dem Klassenbenutzer. Im Allgemeinen dürfen Getter keine Ausnahmen auslösen, wenn ihre Werte nicht festgelegt sind. Ok, dies ist kein Standard-Getter, da kein einzelnes Feld zurückgegeben wird, aber aus Sicht des Benutzers ist die Unterscheidung möglicherweise zu subtil, um darüber nachzudenken.
Oder ich kann die Ausnahme von innen werfen displayCompleteNameOnInvoice
. Aber dazu sollte ich direkt testen name
oder surname
Felder und damit würde ich die durch dargestellte Abstraktion verletzen getCompleteName
. Es liegt in der Verantwortung dieser Methode, den vollständigen Namen zu überprüfen und zu erstellen. Es könnte sogar auf der Grundlage anderer Daten entscheiden, dass es in einigen Fällen ausreicht, die surname
.
So die einzige Möglichkeit scheint die semantischen des Verfahrens zu ändern , getCompleteName
zu composeCompleteName
, dass ein ‚aktives‘ legt nahe , Verhalten und damit auch die Fähigkeit , eine Ausnahme zu werfen.
Ist das die bessere Designlösung? Ich bin immer auf der Suche nach der besten Balance zwischen Einfachheit und Korrektheit. Gibt es eine Designreferenz für dieses Problem?
displayCompleteNameOnInvoice
können Sie einfach eine Ausnahme auslösen, wenn sie getCompleteName
zurückgegeben wird null
, nicht wahr ?