2009-07-02 18 views
45

Hace unos años, hice una encuesta de paquetes de DbC para Java, y no estaba del todo satisfecho con ninguno de ellos. Desafortunadamente no guardé buenas notas sobre mis hallazgos, y asumo que las cosas han cambiado. ¿Alguien se preocuparía por comparar y contrastar diferentes paquetes de DbC para Java?¿Una buena biblioteca de diseño por contrato para Java?

Respuesta

22

Hay una buena visión general en WikiPedia about Design by Contract, al final hay una sección con respecto a languages with third party support libraries, que incluye una bonita serie de bibliotecas de Java. La mayoría de estas bibliotecas de Java se basan en Java Assertions.

En el caso de que solo necesite Precondition Checking, también hay una solución liviana Validate Method Arguments, en SourceForge bajo Java Argument Validation (implementación Java simple).

Dependiendo de su problema, tal vez el marco OVal, para la validación de Restricciones de campo/propiedad es una buena opción. Este marco le permite colocar las Restricciones en todo tipo de formas diferentes (Anotaciones, POJO, XML). Cree restricciones de clientes a través de POJO o lenguajes de scripting (JavaScript, Groovy, BeanShell, OGNL, MVEL). Y también parte implementa Programming by Contract.

+0

OVal se ve impresionante. Me atrevería a decir que es tan bueno como puede obtener DbC en Java. –

+8

No estoy seguro de que un comentario aquí sea el mejor lugar/forma, pero solo para los próximos que lean: [Contracts for Java - cofoja] (http://code.google.com/p/cofoja/) es un reciente Además, directamente de la investigación de tiempo del 20% de Google. – superjos

0

creo que muchas bibliotecas DBC se surclassed por la orden interna afirman palabra clave, introducido desde Java 1.4:

  • se trata de una orden interna, no se requiere ninguna otra biblioteca
  • funciona con la herencia
  • se puede activar/desactivar el paquete de base
  • fáciles de refactorización (por ejemplo, no hay afirmaciones en los comentarios)
+4

pero SUN escribe "¿No usar afirmaciones para comprobar los parámetros de un método público" en http : //java.sun.com/javase/6/docs/technotes/guides/language/assert.html –

+4

Más al punto, DbC debería facilitar la adición de contratos a su código. Si no es fácil, la mayoría de los desarrolladores no lo harán. Es posible implementar invariantes de clase utilizando aserciones y llamadas a un método invariante de clase, pero es torpe. –

2

Probé contract4J una vez y lo encontré utilizable pero no perfecto. Está creando contratos para llamadas de método para y después e invasores en toda la clase.

El contrato se crea como una afirmación del método. El problema es que el contrato en sí está escrito en una cadena por lo que no tiene soporte IDE para los contratos ni compila el tiempo de compilación si el contrato aún funciona.

Un enlace a la library

2

Ha sido un largo tiempo desde que he mirado en estos, pero encontraron algunos enlaces de edad. Uno fue para JASS.

El otro que había usado (y me gustó) era iContract de Reliable Systems. Tenía una tarea ant que ejecutarías como preprocesador. Sin embargo, parece que no puedo encontrarlo con algunas búsquedas de Google, parece que se ha desvanecido. El sitio original ahora es una granja de enlaces. Consulte this link para conocer algunas formas posibles de llegar a él.

+0

La versión más reciente de JASS es de julio de 2005. No voy a especular sobre qué versiones de JDK admite. JASS tiene un enlace a JML, que parece estar en desarrollo activo. –

1

Le recomiendo que considere el lenguaje de modelado Java (JML).

2

Hay extensiones Groovy que permiten Diseño por Contrato (tm) en código Groovy/Java - GContracts. Utiliza las llamadas anotaciones de cierre para especificar invariantes de clase, pre y postcondiciones. Los ejemplos se pueden encontrar en la wiki github del proyecto.

Mayor ventaja: es solo un único contenedor sin dependencias externas y se puede resolver a través de repositorios compatibles con Maven desde su ubicación en the central Maven repo.

+0

No creo que podamos usar GContracts en un Proyecto Java, ya que GContracts hace un uso intensivo de Groovy Closures – Sudarshan

+0

Así es, es una biblioteca exclusiva de Groovy. –

6

Google tiene una biblioteca de código abierto llamada contracts for java.

Contracts for Java es nuestra nueva herramienta de código abierto. Las condiciones previas, las postcondiciones y las invariantes se agregan como expresiones booleanas de Java dentro de las anotaciones. De manera predeterminada, estos no hacen nada, pero se habilitan a través de un argumento JVM , se verifican en el tiempo de ejecución.

• @Requires, @Ensures, @ThrowEnsures and @Invariant specify contracts as Java boolean expressions 
• Contracts are inherited from both interfaces and classes and can be selectively enabled at runtime 

contracts for java.

0

Personalmente, creo que las librerías DbC disponibles actualmente han dejado mucho que desear, ninguna de las bibliotecas que he visto funcionaba bien con la API Bean Validation.

Las bibliotecas i miraron han sido documentados here

El Bean Validation API tiene una gran cantidad de más de vuelta con los conceptos de DBC. En ciertos casos, Bean Validation API no se puede usar como un POJO simple (código administrado no CDI). IMO una envoltura de pensamiento alrededor de la API de Validación de Bean debería ser suficiente.

Descubrí que las bibliotecas existentes son un poco difíciles de agregar a los proyectos web existentes dado que se implementan a través de instrumentación de código AOP o de código de bytes. Probablemente con el advenimiento de Bean Validation API, este tipo de complejidad para implementar DbC no se justifica.

También he documentado mi queja en este post y la esperanza de construir una pequeña biblioteca, que aprovecha en la API Bean Validation

0

Si quieres un soporte básico simple y sencillo para expresar sus contratos, echar un vistazo a valid4j (encontrado en Maven Central como org.valid4j: valid4j). Te permite expresar tus contratos usando hamcrest-matchers regulares en código simple (sin anotaciones, ni comentarios).

Para condiciones previas y condiciones posteriores (básicamente afirmaciones -> AssertionError tirar):

import static org.valid4j.Assertive.*; 

require(inputList, hasSize(greaterThan(0))); 
... 
ensure(result, lessThan(4.0)); 

Si no está satisfecho con la política global predeterminada (devolver AssertionError), valid4j proporciona un mecanismo de personalización que vamos a ofrecerle su propio implementación de org.valid4j.AssertiveProvider.

Enlaces:

+0

¿Alguien tiene una hoja de cálculo de las comparaciones para esto? Una matriz de características sería genial. –

+0

valid4j se parece más a la biblioteca de afirmaciones (al igual que el popular AssertJ de Java, o la afirmación avanzada de Groovy), no como una herramienta DBC completa (como OVal o Cofoja) – iirekm

1

que sugeriría una combinación de algunas herramientas:

  • de Java assert condition... o es primo maravilloso más avanzada, guayaba de Preconditions.checkXXXX(condition...) y Verify.verify(condition...), o una biblioteca como AssertJ, si todo lo que necesita es sólo para hacer verificaciones sencillas de su código 'principal' o 'prueba'

  • obtendrá más características con una herramienta como OVal; puede verificar tanto los objetos como los argumentos del método y los resultados, también puede activar las comprobaciones manualmente (por ejemplo, para mostrar errores de validación en la interfaz de usuario antes de llamar a un método). Puede comprender anotaciones existentes, por ejemplo, de JPA o javax.validation (como @NotNull, @Pattern, @Column), o puede escribir restricciones en línea como @Pre(expr="x >= 0 && x <= y"). Si la anotación es @Documented, las verificaciones también estarán visibles en Javadocs (no es necesario que las describa también).

  • OVal utiliza la reflexión, lo que puede ocasionar problemas de rendimiento y otros problemas en algunos entornos, como Android; entonces debería considerar la herramienta como Google's Cofoja, que tiene menos funcionalidades, sino que depende de herramienta de procesamiento de anotación en tiempo de compilación en lugar de la reflexión

Cuestiones relacionadas