Supponiamo di avere un metodo foo(String bar)
che funziona solo su stringhe che soddisfano determinati criteri; ad esempio, deve essere in minuscolo, non deve essere vuoto o avere solo spazi bianchi e deve corrispondere al modello [a-z0-9-_./@]+
. La documentazione per il metodo indica questi criteri.
Il metodo dovrebbe rifiutare qualsiasi e tutte le deviazioni da questo criterio, o se il metodo fosse più indulgente su alcuni criteri? Ad esempio, se il metodo iniziale è
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;
}
E il secondo metodo permissivo è
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;
}
La documentazione deve essere cambiata per dichiarare che sarà trasformata e impostata sul valore trasformato, se possibile, o se il metodo dovrebbe essere il più semplice possibile e rifiutare tutte le deviazioni? In questo caso, bar
potrebbe essere impostato dall'utente di un'applicazione.
Il caso d'uso principale per questo sarebbe l'accesso agli oggetti da un repository da parte di uno specifico identificatore di stringa. Ogni oggetto nel repository dovrebbe avere una stringa univoca per identificarlo. Questi repository potevano archiviare gli oggetti in vari modi (sql server, json, xml, binary, ecc.) E così ho cercato di identificare il minimo comune denominatore che corrispondesse alla maggior parte delle convenzioni di denominazione.