Supposons que nous ayons une méthode foo(String bar)
qui ne fonctionne que sur des chaînes qui répondent à certains critères; par exemple, il doit être en minuscules, ne doit pas être vide ou ne comporter que des espaces, et doit correspondre au modèle [a-z0-9-_./@]+
. La documentation de la méthode énonce ces critères.
La méthode devrait-elle rejeter tout écart par rapport à ces critères, ou la méthode devrait-elle être plus indulgente à l'égard de certains critères? Par exemple, si la méthode initiale est
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;
}
Et la deuxième méthode de pardon est
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 documentation doit-elle être modifiée pour indiquer qu'elle sera transformée et définie si possible sur la valeur transformée, ou la méthode doit-elle être aussi simple que possible et rejeter toutes les déviations? Dans ce cas, bar
pourrait être défini par l'utilisateur d'une application.
Le cas d'utilisation principal serait que les utilisateurs accèdent aux objets à partir d'un référentiel par un identificateur de chaîne spécifique. Chaque objet du référentiel doit avoir une chaîne unique pour l'identifier. Ces référentiels pouvaient stocker les objets de différentes manières (serveur sql, json, xml, binaire, etc.) et j'ai donc essayé d'identifier le plus petit dénominateur commun qui correspondrait à la plupart des conventions de dénomination.
foo
fonction stricte qui est rigoureuse dans les arguments qu'il accepte, et avoir une deuxième fonction d'aide qui peut essayer de "nettoyer" un argument à utiliser foo
. De cette façon, chaque méthode a moins à faire seule et peut être gérée et intégrée plus proprement. Si vous vous engagez dans cette voie, il serait probablement également utile de vous éloigner d'une conception exceptionnellement lourde; vous pouvez utiliser quelque chose comme à la Optional
place, puis avoir les fonctions qui consomment foo
des exceptions de levée si nécessaire.