Si el lenguaje de scripting de su elección no tiene algo como el modo strict de Perl, ¿cómo está captando errores tipográficos? ¿Estás haciendo pruebas unitarias de todo? Cada constructor, cada método? ¿Es esta la única manera de hacerlo?Captura de errores en los lenguajes de script
Respuesta
Pruebas de unidad realmente minuciosas son la técnica más importante (sí, siempre intento alcanzar el 100% de cobertura), ya que también detectan muchos otros errores (por ejemplo, donde escribo +
y significa -
), uno a uno problemas, etc. Las pruebas de integración y carga que ejercen cada característica son la segunda línea de defensa contra todo tipo de errores (en su mayoría, más profundos y más difíciles ;-).
Las siguientes son herramientas como pylint y pychecker y editores de color (no uso IDEs reales, pero también me ayudarían de manera similar a como lo hace mi fiel editor de gvim ;-).
Técnicas tales como las revisiones obligatorias de código (por ejemplo, cfr un video de una entrevista mía sobre el tema here), si bien es crucial, deben centrarse en otros problemas - problemas que las herramientas automatizadas simplemente no lo hará captura , tales como integridad y exactitud de comentarios/cadenas de documentación, selección de buenos algoritmos/rápidas, y similares (ver here para un resumen de la charla que di sobre el tema en la misma conferencia como llegué a la entrevista a, y un enlace a el PDF de las diapositivas).
Existen errores que no son "errores tipográficos". Si no prueba algo, saber que algo ha encontrado nombres de variables mal escritos no le asegurará mucho de todos modos.
lo sé. Solo estoy interesado en errores tipográficos. – Geo
Bueno, bien entonces. Algunos problemas como ese vienen con el territorio, sin embargo. – Pointy
@Geo: "Solo me interesan los errores tipográficos" No hay errores? Por favor, explica cuál es la diferencia entre un "error tipográfico" y un "error". Por favor, actualice la pregunta con esta definición. –
Algunos editores (por ejemplo, NetBeans) analizan su código y subrayan las partes "sospechosas", por ejemplo, variables no utilizadas, que pueden ser señal de un error tipográfico. NB también resalta el identificador sobre el cursor en otra parte de la pantalla, lo que también ayuda.
Por supuesto, ningún truco de IDE inteligente puede reemplazar las pruebas adecuadas.
El complemento Groovy actual para Eclipse va un paso más allá e intenta ver qué partes puede verificar estáticamente. Todo lo que * no * puede verificar está subrayado (normal, subrayado directo). ¡Es * increíblemente * útil! –
TDD - primero escriba sus pruebas, luego el código más simple para pasar la prueba. De esta forma, puede estar más seguro de que no tiene ningún código no probado. Esto le ayudará a asegurarse de tener menos errores tipográficos u otros errores en su código.
Revisiones de programación/código de par: dos pares de ojos son mejores que un par.
IDE con intellisense - no es una panacea, pero una gran ayuda para no hacer errores tipográficos. Si usas intellisense, normalmente obtienes errores de sustitución, no errores tipográficos. Esto no debería ser difícil de encontrar con las pruebas.
Para Groovy en particular, Intellij 9 es bastante bueno en la punta intellisense –
Muchas herramientas de prueba de unidades pueden mostrar el porcentaje de líneas que probaron. Cuanto más cerca esté este porcentaje del 100%, menos probable será el error de nombre de la variable.
¿Rcov maneja múltiples ramas en la misma línea? –
Escribo todos mis códigos Python en eclipse IDE. Como ha sugerido Mladen Jablanović, el eclipse subraya las partes sospechosas.
El siguiente paso es ejecutar el código. Ahora hay dos tipos de errores que probablemente enfrentaré.
Los errores que las capturas de intérprete y me da un número de línea para: Por lo general son bastante fáciles de depurar, especialmente si imprime todas las variables en esa línea justo antes de esa línea, para asegurarse de que contienen la valores que esperarías
Comportamiento inesperado: su código es correcto y el intérprete no se queja, pero su código no se comporta de la manera que usted desea. Cuando esto sucede (rara vez, porque generalmente diseño mis módulos bastante bien, un proceso que toma alrededor de 7 minutos, antes de comenzar a codificar) empiezo a buscar módulos/funciones en el orden en el que se llaman y trato de ejecutar el programa en mi cabeza como el intérprete lo vería. Si eso no funciona, entonces voy a explorar el depurador. Por lo general, no se reduce a esto, pero si lo hace, es un error bastante grande y tomaría bastante tiempo arreglarlo. Las pruebas unitarias ayudan, pero francamente, creo que como científico informático, debería poder depurarlo desde la perspectiva del análisis de algoritmos, que generalmente es más rápido que la prueba unitaria (al menos para mí). Además, elegir hacer un análisis de algoritmos sobre pruebas unitarias ejercita mi cerebro para que no cometa esos errores en el futuro, en comparación con las pruebas unitarias que me ayudan a solucionar el problema ahora, pero no ayuda mucho en términos de ayudar evito cometer el mismo error/similar en el futuro.
Esperanza esto ayuda
En Ruby, una variable local mal escrito haría que el programa para morir horriblemente, lo cual está bien.
Una variable de instancia mal escrita no hace que el programa muera horriblemente, lo que es malo. Para detectar tales casos, use warnings. Desafortunadamente, no se puede decir fácilmente Ruby al treat warnings as errors.
su enlace "usar advertencias" está roto. Estoy totalmente de acuerdo con su declaración anterior y me gustaría ver la URL a la que se refería =) – Abdo
@Abdo gracias por la información. Me he vinculado a una versión de Internet Archive de la página. –
genialidad! He revisado el artículo y parece que Ruby -w0 advierte sobre el método redef, la reasignación constante, etc. pero ya no advierte sobre variables de instancia no inicializadas, que es la que creo que es la más útil para detectar errores tipográficos. – Abdo
En mi caso, utilizo pruebas unitarias extensamente (desarrollándome en Python). Debido a que hay muchos marcos de pruebas de peso ligero y bien integrados a la lengua (o IDE, si lo prefiere), usándolos causa casi sin dolor;)
vistazo a este ejemplo:
def unpack_args(func):
def deco_func(*args):
if isinstance(args, tuple):
args = args[0]
return func(*args)
return deco_func
def func1(*args):
"""
>>> func1(1,2,3)
(1, 2, 3)
>>> func1(*func2(1,2,3))
(1, 2, 3)
>>> func1(func2(1,2,3))
((1, 2, 3),)
"""
return args
def func2(*args):
"""
>>> func2(1,2,3)
(1, 2, 3)
"""
return args
@unpack_args
def func3(*args):
return args
def test():
"""
>>> func3(func2(1,2,3))
(1, 2, 3)
"""
import doctest
doctest.testmod(verbose=True)
test()
-----------------------------
Results:
Trying:
func1(1,2,3)
Expecting:
(1, 2, 3)
ok
Trying:
func1(*func2(1,2,3))
Expecting:
(1, 2, 3)
ok
Trying:
func1(func2(1,2,3))
Expecting:
((1, 2, 3),)
ok
Trying:
func2(1,2,3)
Expecting:
(1, 2, 3)
ok
Trying:
func3(func2(1,2,3))
Expecting:
(1, 2, 3)
ok
3 items had no tests:
__main__
__main__.func3
__main__.unpack_args
3 items passed all tests:
3 tests in __main__.func1
1 tests in __main__.func2
1 tests in __main__.test
5 tests in 6 items.
5 passed and 0 failed.
Test passed.
supongo que por 'error tipográfico 'te refieres a escribir mal nombres de variable/función/clase. Esto es menos un problema en Python que en Perl, ya que Perl (y creo que Ruby) de forma predeterminada creará automáticamente una variable y la inicializará a cero o "" en su primer uso. Python no hace esto, ya que es un error utilizar una variable que no se ha creado explícitamente, por lo que en ese sentido ya está en modo 'estricto'.
Uso Vim con el complemento pyflakes, que subraya la mayoría de los tipos de errores tan pronto como los escribe. También uso frecuentemente pylint y pychecker ya que pueden detectar muchos otros tipos de errores.
Otra cosa que hago es hacer un uso intensivo de finalización automática de Vim - Sólo escriba un nombre en su totalidad una vez, a continuación, en los usos posteriores del nombre del tipo de las primeras letras y el uso de <ctrl-n>
o <ctrl-p>
para recorrer los partidos.
También uso Test Driven Development con el objetivo de obtener una cobertura de prueba 100% unitaria.
Me parece que la combinación de todas estas prácticas significa que los problemas causados por errores tipográficos son prácticamente inexistentes.
En Groovy, el árbol de sintaxis abstracta (AST) que compone un programa está disponible. De modo que se pueden escribir herramientas que inspeccionen el AST y emitan advertencias para cosas que probablemente sean errores.
Por ejemplo, GroovyLint le advertirá si intenta llamar a un método que no existe en tiempo de compilación, pero está muy cerca de uno que sí existe.
Ejemplo:
class Test{
static def foobar(){ return 5; }
}
Test.fooBar() //Here GroovyLint suggests calling foobar instead of fooBar.
¿También puede advertir acerca de los errores tipográficos en los nombres de las variables? – Geo
@Geo - Sí, si el nombre de una variable no existe, dará un error, a menos que esté en un script de Groovy, o a menos que prefija la variable con 'this'. Aquí hay un archivo que tiene descripciones de todas las comprobaciones que GroovyLint hace actualmente: http://www.groovylint.com/files/GroovyLintSettings.groovy. Puede activar o desactivar los controles individuales según sus preferencias. – Kyle
- 1. Perl DBI - Errores de captura
- 2. ¿Están todos los scripts escritos en lenguajes de script?
- 3. Captura de errores de Java
- 4. ASP clásico: errores de captura
- 5. R: errores de captura en `nls`
- 6. Error de script de Bash Captura
- 7. Lenguajes de script: Máx. Line Length
- 8. Lenguajes de script que admiten fibras/coroutines?
- 9. Captura todos los errores de JavaScript y envíalos al servidor
- 10. Convertir URL en captura de pantalla (script)
- 11. Notación de dólares en lenguajes de script: ¿por qué?
- 12. ¿Hay errores de captura dentro de window.onerror?
- 13. Captura de errores HTTPHttpRequest de dominio cruzado
- 14. ¿Errores de captura lanzados con `error`?
- 15. Correlaciones de errores o de captura en Sammy.js
- 16. ¿Captura errores de "comando no encontrado" de los apoyos de Ruby?
- 17. Diagramación en los lenguajes funcionales
- 18. captura sólo algunos errores de ejecución en Python
- 19. ¿Pueden los errores de captura de PowerShell en GetChildItem y continuar el bucle?
- 20. Captura de errores de compilación de expresiones regulares
- 21. Complejidad de los lenguajes de programación
- 22. ¿Código de salida de captura para script remoto?
- 23. Evaluación PHP y errores de captura (tanto como sea posible)
- 24. Aprendiendo cómo funcionan los lenguajes de programación
- 25. Descomposición (modularidad) en los lenguajes funcionales
- 26. Captura de "NullPointerExceptions" en JavaScript
- 27. ¿Necesita encontrar la ubicación real de la línea/char en los errores de Internet Explorer Script?
- 28. Los lenguajes de programación para el sistema distribuido
- 29. Rol de los combinadores en lenguajes de programación concatenativos/tácitos
- 30. Lenguajes de scripting
Esta es una * respuesta * fantástica. Quiero la posibilidad de votarlo varias veces y quizás llevarlo detrás del barco, en ese orden. –
El enlace fijo: [Revisiones de código para Fun and Profit] (http://www.aleax.it/osc08_crev.pdf) –
bien, eso son cosas buenas, pero ... ¿no es un poco exagerado escribir unidades -pruebas de todo tu programa donde solo el "modo estricto" hubiera captado la mayoría de los errores? – PypeBros