2011-07-14 15 views
7

Me pregunto, ¿cuál es la mejor práctica para la validación de objetos? ¿Hay algún argumento adicional contra el caso uno o el caso dos? ¿Hay otra manera?Validación de objeto simple en Java

No busco ninguna biblioteca de validación, solo quiero hacer una validación simple.

Caso Uno

class A { 
    public void doSomething(MyObject o) { 
     try { 
     validate(o); 
     doSomethingUseful(o); 
     } catch (ValidationException e) { 
     Logger.getLogger().warn(e); 
     } 
    } 

    private void validate(MyObject o) throws ValidationException 
    { 
     if (o.getXYZ() == null) 
     throw new ValidationException("Field XYZ cannot be null"); 
    } 

    private void doSomethingUseful(MyObject o) { //some funny stuff } 
} 

caso de que dos

class A { 
    public void doSomething(MyObject o) { 
     if (validate(o)) { 
     doSomethingUseful(o); 
     } else 
     Logger.getLogger().warn("Object is invalid"); 
     } 
    } 

    private boolean validate(MyObject o) 
    { 
     if (o.getXYZ() == null) return false; 
     return true; 
    } 

    private void doSomethingUseful(MyObject o) { //some funny stuff } 
} 
+1

No hay una preferencia fuerte aquí. Más significativo, tal vez, es lo que hace para poder capturar múltiples defectos de validación en el mismo objeto, para que el usuario no tenga que seguir intentándolo una y otra vez para ver cuál es el próximo defecto. –

+1

¿Por qué la validación en el caso dos tiene un 'throws ValidationException' si está trabajando con booleanos? –

+1

@Damokles probablemente copie pegar – RMT

Respuesta

7

Si solo está tragando la excepción y si el método de validación es solo privado, entonces prefiera case two ya que no debe usar excepciones para la lógica normal.

Si desea dejar que el cliente maneje la excepción, lo que debe hacer, utilice case one pero deje que se lance en lugar de tragar.

+3

+1 para 'no debería usar excepciones para lógica normal' – prasopes

+0

+1 Las excepciones son para casos excepcionales – alexcoco

1

bien en el segundo caso, el método validate nunca va a lanzar el ValidationException, por lo que si desea administrar más de una excepción (nulo, formato incorrecto, ...), le sugiero que use el primero para que pueda devolver un mensaje de error claro y útil.

1

Si realmente solo hace 1 validación de campo, entonces el caso 2 es mejor, porque está claro lo que está mal con el objeto.

Si necesita más información sobre el error de validación o si necesita pasar múltiples errores de validación, puede usar el objeto de excepción como contenedor para pasar esa información adicional.

+0

+1 Escribía exactamente la misma respuesta :) – MarcoS

+0

me gusta ... realmente? ... – talnicolas

2

Here es un gran artículo de Joel Spolsky para considerar leer. Personalmente, prefiero el segundo caso. Manejar excepciones puede volverse desordenado.

+0

+1 por respuesta + referencia – RMT

0

Otra forma en la que creo que puede diseñar este código es mediante el uso de la Programación Orientada a Aspectos. El código de validación que ha agregado es una especie de preocupación que está dañando su código comercial. Si usa aspecto, puede evitar contaminar su código con código de validación. Puede consultar este artículo http://www.developer.com/java/5-reasons-java-developers-should-learn-and-use-aspectj.html que muestra un caso de uso de hacer validación utilizando Aspectos.