Supponiamo di avere un metodo foo(String bar)
che opera solo su stringhe che soddisfano determinati criteri; ad esempio, deve essere in minuscolo, non deve essere vuoto o contenere solo spazi bianchi e deve corrispondere al modello [a-z0-9-_./@]+
. La documentazione per il metodo indica questi criteri.
Il metodo dovrebbe rifiutare qualsiasi deviazione da questi criteri o dovrebbe essere più indulgente con 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 di perdono è
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 dovrebbe essere modificata per indicare che verrà trasformata e impostata sul valore trasformato, se possibile, o il metodo dovrebbe essere mantenuto il più semplice possibile e rifiutare qualsiasi deviazione? In questo caso, bar
potrebbe essere impostato dall'utente di un'applicazione.
Il caso d'uso principale per questo sarebbe che gli utenti accedessero agli oggetti da un repository da un identificatore di stringa specifico. Ogni oggetto nel repository dovrebbe avere una stringa univoca per identificarlo. Questi repository potrebbero archiviare gli oggetti in vari modi (sql server, json, xml, binary, ecc.) E quindi ho cercato di identificare il minimo comune denominatore che corrispondesse alla maggior parte delle convenzioni di denominazione.
foo
funzione rigorosa che è rigorosa in quali argomenti accetta, e avere una seconda funzione di supporto che può provare a "ripulire" un argomento da utilizzare foo
. In questo modo, ogni metodo ha meno da fare da solo e possono essere gestiti e integrati in modo più pulito. Se percorrendo questa strada, probabilmente sarebbe anche utile allontanarsi da un design particolarmente pesante; puoi usare qualcosa di simile Optional
invece, e quindi avere le funzioni che consumano foo
eccezioni di lancio, se necessario.