Supongamos que tenemos un método foo(String bar)
que solo opera en cadenas que cumplen ciertos criterios; por ejemplo, debe estar en minúsculas, no debe estar vacío o tener solo espacios en blanco, y debe coincidir con el patrón [a-z0-9-_./@]+
. La documentación del método establece estos criterios.
¿Debería el método rechazar todas y cada una de las desviaciones de este criterio, o debería ser más indulgente con algunos criterios? Por ejemplo, si el método inicial es
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;
}
Y el segundo método de perdón es
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;
}
¿Debería cambiarse la documentación para indicar que se transformará y establecerá el valor transformado si es posible, o debería mantenerse el método lo más simple posible y rechazar todas y cada una de las desviaciones? En este caso, bar
podría ser configurado por el usuario de una aplicación.
El caso de uso principal para esto sería que los usuarios accedan a objetos desde un repositorio mediante un identificador de cadena específico. Cada objeto en el repositorio debe tener una cadena única para identificarlo. Estos repositorios podrían almacenar los objetos de varias maneras (servidor sql, json, xml, binario, etc.) y por eso traté de identificar el mínimo común denominador que coincidiría con la mayoría de las convenciones de nombres.
foo
función estricta que sea rigurosa en los argumentos que acepta, y tener una segunda función auxiliar que puede tratar de "limpiar" un argumento para ser utilizado foo
. De esta manera, cada método tiene menos que hacer por sí mismo y se pueden administrar e integrar de manera más limpia. Si va por esa ruta, probablemente también sería útil alejarse de un diseño pesado de excepción; puede usar algo como en su Optional
lugar, y luego tener las funciones que consumen foo
excepciones de lanzamiento si es necesario.