Angenommen, wir haben eine Methode foo(String bar)
, die nur Zeichenfolgen verarbeitet, die bestimmte Kriterien erfüllen. Es muss beispielsweise klein geschrieben sein, darf nicht leer sein oder nur Leerzeichen enthalten und muss mit dem Muster übereinstimmen [a-z0-9-_./@]+
. In der Dokumentation der Methode sind diese Kriterien aufgeführt.
Sollte die Methode alle Abweichungen von diesem Kriterium ablehnen, oder sollte die Methode einige Kriterien eher verzeihen? Zum Beispiel, wenn die anfängliche Methode ist
public void foo(String bar) {
if (bar == null) {
throw new IllegalArgumentException("bar must not be null");
}
if (!bar.matches(BAR_PATTERN_STRING)) {
throw new IllegalArgumentException("bar must match pattern: " + BAR_PATTERN_STRING);
}
this.bar = bar;
}
Und die zweite Vergebungsmethode ist
public void foo(String bar) {
if (bar == null) {
throw new IllegalArgumentException("bar must not be null");
}
if (!bar.matches(BAR_PATTERN_STRING)) {
bar = bar.toLowerCase().trim().replaceAll(" ", "_");
if (!bar.matches(BAR_PATTERN_STRING) {
throw new IllegalArgumentException("bar must match pattern: " + BAR_PATTERN_STRING);
}
}
this.bar = bar;
}
Sollte die Dokumentation dahingehend geändert werden, dass sie transformiert und wenn möglich auf den transformierten Wert gesetzt wird, oder sollte die Methode so einfach wie möglich gehalten werden und alle Abweichungen verworfen werden? In diesem Fall bar
könnte vom Benutzer eine Anwendung eingestellt werden.
Der primäre Anwendungsfall hierfür wären Benutzer, die über eine bestimmte Zeichenfolgen-ID von einem Repository aus auf Objekte zugreifen. Jedes Objekt im Repository sollte eine eindeutige Zeichenfolge haben, um es zu identifizieren. In diesen Repositorys konnten die Objekte auf verschiedene Arten gespeichert werden (SQL Server, JSON, XML, Binary usw.). Daher habe ich versucht, den kleinsten gemeinsamen Nenner zu identifizieren, der den meisten Namenskonventionen entspricht.
foo
Funktion haben sollten, die genau festlegt, welche Argumente akzeptiert werden, und eine zweite Hilfsfunktion, die versuchen kann, ein Argument zu "bereinigen", mit dem es verwendet werden soll foo
. Auf diese Weise hat jede Methode für sich weniger zu tun und kann sauberer verwaltet und integriert werden. Wenn Sie diesen Weg gehen, wäre es wahrscheinlich auch hilfreich, sich von einem außergewöhnlichen Design zu entfernen. Sie können Optional
stattdessen so etwas wie verwenden und dann die Funktionen verwenden, die foo
bei Bedarf Ausnahmen auslösen.