2010-10-21 17 views
10

Recuerdo de mis días Perl la declaración "use strict" que hace que el tiempo de ejecución haga validaciones adicionales. ¿Hay un equivalente para Groovy?¿Existe un "uso estricto" para Groovy?

No me gusta ser mordido durante el tiempo de ejecución por lo que se puede detectar en la compilación, como pasar muy pocos argumentos a un constructor.

Respuesta

17

Groovy 2.0 ahora tiene control de tipo estático opcional. Si coloca una anotación @groovy.transform.TypeChecked en una clase o método, Groovy utilizará estrictas reglas de tipado estático tipo Java.

Además, hay otra anotación @groovy.transform.CompileStatic que es similar, excepto que va un paso más allá y realmente la compila sin tipado dinámico. El código de bytes generado para estas clases o métodos será muy similar al de Java directo.

Estas anotaciones se pueden aplicar a una clase individual o método:

import groovy.transform.TypeChecked 

@TypeChecked 
class MyClass { 
     ... 
} 

También puede aplicar globalmente a todo un proyecto sin añadir anotaciones a los archivos de origen con una secuencia de comandos de configuración del compilador.La secuencia de comandos de configuración debería ser algo como esto:

withConfig(configuration) { 
    ast(groovy.transform.TypeChecked) 
} 

Run groovy o groovyc con la opción de línea -configscript comando:

groovyc -configscript config.groovy MyClass.groovy 

Hay más información en el manual de Groovy:

3

¿Hay un equivalente para Groovy?

No es que yo sepa.

No me gusta ser mordido durante tiempo de ejecución por lo que puede ser detectado en compilación, como pasar muy pocos argumentos a un constructor.

Entonces Groovy es probablemente el idioma equivocado para ti y deberías usar algo como Java o C# en su lugar. Alternativamente, hay una versión de Groovy, conocida como Groovy ++ que tiene una comprobación de tipo mucho más fuerte, pero no la considero suficientemente madura para el uso en producción.

IntelliJ (y posiblemente otros IDEs) proporciona muchas advertencias sobre el código dudoso de Groovy. Aunque estas advertencias no impiden la compilación, casi le dan lo mejor de ambos mundos, es decir, la seguridad de un lenguaje estático y la flexibilidad de un lenguaje dinámico

+0

Lo que dices puede ser cierto, pero no tiene que ser así. Se podría implementar un indicador de este tipo que mejore la robustez de los usuarios que lo necesiten, manteniendo la naturaleza dinámica para aquellos que no lo necesitan. – ripper234

+1

@ ripper234: tipologías estáticas vs dinámicas + metaprogramación son enfoques radicalmente diferentes para el diseño del lenguaje. Respaldar ambos al mismo tiempo requeriría mucho esfuerzo y tadeoffs, y probablemente terminarías agravando a ambos grupos de usuarios. Pero otra vez: usar Java es básicamente lo mismo que tu hipotética bandera "estricta" para Groovy. –

0

No, no existe tal cosa, y no puede ser. El "uso estricto" de Perl solo previene el uso de variables no declaradas (y algunas cosas muy específicas de Perl que no creo que tengan equivalentes en Groovy).

En lenguajes dinámicos como Groovy, "pasar muy pocos argumentos a un constructor" no es algo que el compilador pueda detectar, ya que las definiciones de clase se pueden cambiar en tiempo de ejecución a través de la metaprogramación. Además, generalmente no tiene la información de tipo necesaria para saber qué clase debe observar.

Si desea verificaciones máximas de tiempo de compilación, utilice un lenguaje estáticamente estátizado sin metaprogramación, es decir, Java.

+1

Una alternativa a Java o C# sería Scala, que le permite ser más expresivo al mismo tiempo que obtiene los cheques en tiempo de compilación y demás. – xlson

Cuestiones relacionadas