2012-02-17 12 views
8

Tipo de título largo, pero esa es generalmente la pregunta.¿Es una buena idea usar aspectos como un método para eliminar verificaciones defensivas de la lógica de la aplicación?

Quiero saber si crees que es una buena idea hacer lo siguiente.

En lugar de:

public void buyItem(int itemId, int buyerId) { 
    if (itemId <= 0) { 

     throw new IlleglArgumentException("itemId must be positive"); 
    } 
    if (buyerId <= 0) { 

     throw new IlleglArgumentException("buyerId must be positive"); 
    } 
    // buy logic 
} 

quiero tener algo como:

@Defensive("isPositive(#itemId, #buyerId)") 
public void buyItem(int itemId, int buyerId) { 
    // buy logic 
} 

¿Cree que esto es bueno/horrible/demasiado elegante/demasiado lento? Si realmente piensa que es bueno, estaba pensando en usar SpEL para implementarlo, ¿alguien tiene algo mejor/más ligero/más rápido en mente?

Gracias,

Respuesta

3

no es necesariamente una mala cosa sin embargo, su simple caso pueden también ser resueltos con excepción declaraciones (rather than assertions que en un principio he mencionado).

Parece que está presentando su propio conjunto de anotaciones que otros desarrolladores en su proyecto deben aceptar y adaptarse. Sin embargo, una vez que haya introducido las anotaciones, parece que un enfoque normal Proxy sería un mejor candidato para resolver el problema.

Resumiendo: El problema que describió puede resolverse fácilmente utilizando alternativas estándar de Java, aunque en un caso más complejo podría justificarse (por ejemplo, @Secured en seguridad de primavera), especialmente si está desarrollando su propio marco.

+0

e introduce otro idioma dentro de las anotaciones . –

+0

En realidad, esta pregunta se me metió en la cabeza exactamente como un efecto secundario del uso de '@ Secured'. Pero como ya usamos '@ Secured' para la seguridad de nivel de método, sería confuso usarlo para defender IMO, por eso estoy pidiendo ideas sobre cómo hacerlo y desde' @ Secured' y '@ PreAuthorize' utilizo SpEL I pensé que esa era la elección obvia. – Simeon

+0

¿Por qué el voto a favor? – Simeon

2

creo que es

  • manipulación excesiva
  • romper la encapsulación, apoyándose en un aspecto externo (que podría o no podría estar allí) para mantener los invariantes del objeto
  • confundir
  • no
  • eficiente
  • sin agregar ningún valor

Me gusta usar la clase Guava's Preconditions para tales comprobaciones. Además, tales controles son parte de la lógica comercial, en mi humilde opinión.

+0

Si es lógica de negocios o no es subjetivo (probablemente ... no estoy seguro de si hay una definición decisiva), pero aún está dentro del método :) y dentro del método me siento mejor (quizás así soy yo) si No leo 10/20 líneas de cheques, lo cual es normal si estás tratando de estar 100% seguro. – Simeon

+1

Las condiciones previas de la guayaba reducirían el número de líneas, ya que evita los bloques if. Si estos controles son tan grandes que son molestos, póngalos en un método privado y llame a este método privado. Eso reduce los controles a solo una línea. Y si desea estar al 100% seguro, no use aserciones (que se pueden deshabilitar, y están deshabilitadas por defecto IIRC), y no use un aspecto, que se puede deshabilitar o instalar incorrectamente. –

+1

@downvoter: puede estar en desacuerdo con mi respuesta, pero eso no la hace no útil. ¿Por qué downvote? –

0

Preferiría el enfoque Java assertion.

  1. es un enfoque estándar por lo que todos (¿la mayoría?) Los programadores de Java lo entenderán. Las herramientas automatizadas, etc. también podrán analizarlo.
  2. no tiene que desarrollar nada usted mismo. Sé que parece trivial, pero estas cosas tienen la costumbre de escalar.

A menos que pueda demostrar que su enfoque es manifiestamente mejor o hacer algo diferente, usaría las herramientas y las API que Java proporciona como estándar.

+0

Esto está bien siempre que esté seguro de que está [activado] (http://docs.oracle.com/javase/1.4.2/docs/guide/lang/assert.html#enable-disable) cuando lo necesite es ser. – McDowell

1

Parece validación.FYI, ya existen varios marcos, echa un vistazo a this question y OVal por ejemplo.

No sé acerca de las prestaciones, pero para mí no es sobreinnovación: solo conserva el código lógico. Me encanta trabajar con eso

2

Creo que significó anotaciones, no aspectos. Los aspectos son normalmente externos al código que aconsejan. En cualquier caso, puede realizar el tipo de validaciones que destacó en su publicación con JSR 303. El caso en cuestión:

public void buyItem(@Min(value = 1) int itemId, @Min(value = 1) int buyerId) { 
    // buy logic 
} 

Actualmente hay dos implementaciones conocidas de JSR 303:

+0

Me refiero a aspectos. Estoy abierto a sugerencias de aproximaciones que no sean anotaciones. – Simeon

Cuestiones relacionadas