2009-10-07 30 views
6

Básicamente, soy del mundo de la programación en lenguaje C, ahora profundizando en el mundo de los lenguajes de scripting como Ruby y Python.Depuración de un lenguaje de scripting como ruby ​​

Me pregunto cómo hacer la depuración. En la actualidad los pasos que sigo es,

  • que complete un script grande,
  • comentario a todo menos la parte que que desee comprobar
  • ejecutar el script

Aunque funciona, No puedo depurar como lo haría en, por ejemplo, un entorno VC++ o algo así.

Mi pregunta es, ¿hay alguna forma mejor de depuración?

Nota: Supongo que puede ser una pregunta repetida, si es así, indíqueme la respuesta.

+1

Si usted piensa que podría ser una cuestión de repetición, ¿por qué no buscar en desbordamiento de pila antes de pedir a él? –

+2

@Chris Lutz, busqué antes de hacer esta pregunta y no pude encontrar ningún golpe. Pero, estaba seguro de que este es un tema tan genérico que debería haber algunas preguntas antes ... – Alphaneo

Respuesta

10

Su secuencia parece totalmente imposible para mí. Así es como lo hago:

  1. Escribo una prueba para la funcionalidad que quiero.
  2. Empiezo a escribir el guión, ejecutando bits y verificando los resultados de las pruebas.
  3. Reviso lo que hice para documentar y publicar.

Específicamente, ejecuto antes de completo. Es demasiado tarde para entonces.

Hay depuradores, por supuesto, pero con buenas pruebas y buen diseño, casi nunca he necesitado uno.

+0

No todo el mundo está muy entusiasmado con esto (escribir pruebas antes del código real), pero las pruebas unitarias son muy importantes para esto tipo de cosas en Ruby. – Chuck

+1

La depuración es esencial para encontrar errores alámbricos, pero para verificar que su código realmente hace lo que desea durante el proceso de desarrollo, las pruebas unitarias son mucho mejores y usted tiene la posibilidad de volver a ejecutarlas. – sebastiangeiger

+2

TDD es esencial para evitar errores, eliminando cualquier necesidad de prácticas complejas de depuración. –

4

Parece que el problema aquí es que su entorno (Visual Studio) no es compatible con estos idiomas, no es que estos lenguajes no sean compatibles con los depuradores en general.

Perl, Python y Ruby tienen depuradores con todas las funciones; puedes encontrar otros IDEs que también te pueden ayudar. Para Ruby, hay RubyMine; para Perl, hay Komodo. Y eso está fuera de mi cabeza.

2

Si está trabajando con Python entonces usted puede encontrar una lista de herramientas de depuración here a la que sólo quiero añadir Eclipse con el Pydev extension, lo que hace que trabajar con los puntos de interrupción, etc. También es muy sencillo.

2

Los lenguajes de script no tienen diferencias en comparación con otros lenguajes en el sentido de que todavía tiene que dividir sus problemas en piezas manejables, es decir, funciones. Entonces, en lugar de probar toda la secuencia de comandos después de terminar todo el script, prefiero probar esas pequeñas funciones antes de integrarlas. TDD siempre ayuda.

3

Hay una agradable suave introducción al depurador Python here

0

Hay una pregunta sobre SO en Ruby IDEs here - y la búsqueda de "ruby IDE" ofrece más.

completo un gran guión

Eso es lo que me llamó la atención: "completo", para mí, significa "hecho", "terminado", "liberado". Independientemente de si escribe o no pruebas antes de escribir las funciones que las aprueban, o si escribe pruebas o no (y le recomiendo que lo haga), no debería escribir código que no se puede ejecutar (que es una prueba en sí misma)) hasta que se ha convertido en grande. Ruby y Python ofrecen una gran cantidad de formas de escribir fragmentos de código pequeños, comprobables individualmente (o ejecutables), para que no tenga que esperar (?) Días antes de poder ejecutar el código.

Estoy construyendo un (Rubí) script de base de datos de traducción/transformación en el momento - es hasta alrededor de 1000 líneas y todavía no se ha hecho. Pocas veces me paso más de 5 minutos sin ejecutarlo, o al menos ejecutar la parte en la que estoy trabajando. Cuando se rompe (no soy perfecto, se rompe mucho ;-p) Sé dónde debe estar el problema, en el código que escribí en los últimos 5 minutos. El progreso es bastante rápido.

No afirmo que los IDEs/depuradores no tienen cabida: algunos problemas no aparecen hasta que se libera un gran cuerpo de código: en ocasiones puede ser realmente útil dejar todo en un entorno de depuración para encontrar qué está pasando. Cuando se trata de bibliotecas y marcos de terceros, puede ser extremadamente útil depurar su código para localizar problemas (que generalmente, pero no siempre, están relacionados con la comprensión errónea de la función de la biblioteca).

0

Puede depurar las secuencias de comandos de Python usando el módulo AP incluido. Si desea un depurador visual, puede descargar winpdb - no se deje intimidar por el prefijo "win", winpdb es multiplataforma.

2

Mi pregunta es, ¿hay alguna forma mejor de depuración? "

Sí.

Su enfoque," 1. Completo una secuencia de comandos grande, 2. Comente todo menos la parte que quiero verificar, 3. Ejecute la secuencia de comandos "no es realmente la mejor manera de escribir cualquier software en cualquier idioma (lo siento, pero esa es la verdad)

no escriba una gran nada. nunca.

hacer esto.

  1. Descomponer el problema en clases de objetos.

  2. Para cada clase, escribir la clase de

    2a. Resuma la clase, concéntrese en la interfaz externa, no en los detalles de implementación.

    2b. Escriba pruebas para probar que la interfaz funciona.

    2c. Ejecuta las pruebas. Van a fallar, ya que solo delineaste la clase.

    2d. Arregle la clase hasta que pase la prueba.

    2e. En algunos puntos, te darás cuenta de que tus diseños de clase no son óptimos. Refactorice su diseño, asegurándose de que sus pruebas aún pasen.

  3. Ahora, escribir el guión final. Debe ser corto. Todas las clases ya han sido probadas.

    3a. Delinear el guion. De hecho, generalmente puedes escribir el guión.

    3b. Escribe algunos casos de prueba que prueben que el script funciona.

    3c. Runt las pruebas. Pueden pasar. Ya terminaste

    3d. Si las pruebas no pasan, arregle las cosas hasta que lo hagan.

escribir muchas cosas pequeñas. Funciona mucho mejor a la larga que escribir algo grande y comentar partes de él.

+0

TDD es una metodología, no una herramienta de depuración como la que OP está preguntando. –

+0

@Josh Smeaton: la depuración es una técnica; también lo es TDD Prefiero la técnica TDD sobre la técnica de escritura y depuración. Funciona mejor para mí. –

+0

S. Lott, la depuración no es una 'técnica', e incluso si era una 'técnica' (ugh) no es completamente reemplazable por TDD. – horseyguy

0

El método de depuración que describió es perfecto para un lenguaje estático como C++, pero dado que el idioma es muy diferente, los métodos de codificación son similares. Una de las cosas más importantes en un lenguaje dinámico como Python o Ruby es el nivel superior interactivo (lo que obtienes escribiendo, digamos python en la línea de comandos). Esto significa que ejecutar una parte de tu programa es muy fácil.

Incluso si ha escrito un programa grande antes de la prueba (lo cual es una mala idea), con suerte se lo separa en muchas funciones. Por lo tanto, abra su nivel superior interactivo, haga un import thing (para lo que sea que thing sea) y luego puede comenzar fácilmente a probar sus funciones una por una, simplemente llamándolos en el nivel superior.

Por supuesto, para un proyecto más maduro, es probable que desee escribir a cabo una serie de pruebas reales, y la mayoría de las lenguas tienen un método para hacer eso (en Python, esto es doctest y nose, no sé acerca de otros idiomas) En un primer momento, sin embargo, cuando se está escribiendo algo no muy formal, sólo recuerda algunas reglas simples de la depuración de lenguajes dinámicos:

  • inicio pequeña. No escriba programas grandes y pruébelos. Pruebe cada función mientras la escribe, al menos de forma provisional.
  • Utilice el toplevel. Ejecutar pequeños trozos de código en un lenguaje como Python es extremadamente ligero: enciende el topevel ​​y ejecútalo. Compare con la escritura de un programa completo y la ejecución de compilación en, digamos, C++. Use ese hecho de que puede cambiar rápidamente la corrección de cualquier función.
  • Los depuradores son útiles. Pero a menudo, también lo son las declaraciones print. Si solo está ejecutando una función única, la depuración con instrucciones print no es tan inconveniente, y también le permite no arrastrar a lo largo de un IDE.
1

Hay un montón de buenos consejos aquí, recomiendo ir a través de algunas de las mejores prácticas:

http://github.com/edgecase/ruby_koans

http://blog.rubybestpractices.com/

http://on-ruby.blogspot.com/2009/01/ruby-best-practices-mini-interview-2.html

(y leer el libro de Greg Brown, que es excelente)


Usted habla de grandes scripts. Gran parte de mi flujo de trabajo es resolver la lógica en irb o python, y luego capturarlos en una cascada de pequeños métodos enfocados en una sola tarea, con las pruebas adecuadas (no cobertura al 100%, más enfoque en casos extremos y de esquina).

http://binstock.blogspot.com/2008/04/perfecting-oos-small-classes-and-short.html

Cuestiones relacionadas