¿Cómo navega y refactoriza el código escrito en un lenguaje dinámico?

14

Me encanta que escribir Python, Ruby o Javascript requiera tan poco repetitivo. Me encantan las construcciones funcionales simples. Me encanta la sintaxis limpia y simple.

Sin embargo, hay tres cosas en las que soy realmente malo al desarrollar un software grande en un lenguaje dinámico:

  • Navegando por el código
  • Identificar las interfaces de los objetos que estoy usando
  • Refactorización eficiente

He intentado editores simples (es decir, Vim), así como IDE (Eclipse + PyDev), pero en ambos casos siento que debo dedicar mucho más a la memoria y / o a "grep" constantemente y leer el Código para identificar las interfaces. Esto es especialmente cierto cuando se trabaja con una base de código grande con múltiples dependencias.

En cuanto a la refactorización, por ejemplo, cambiar los nombres de los métodos, depende enormemente de la calidad de mis pruebas unitarias. Y si trato de aislar mis pruebas de unidad "cortándolas" del resto de la aplicación, entonces no hay garantía de que la interfaz de mi apéndice se mantenga actualizada con el objeto que apunto.

Estoy seguro de que hay soluciones para estos problemas. ¿Cómo trabajas de manera eficiente en Python, Ruby o Javascript?

    
pregunta Philippe Beaudoin 02.02.2011 - 21:33

3 respuestas

3
  

Navegando por el código

Consigue un mejor editor que VIM.

Yo uso Komodo Edit.

  

Siento que debo dedicar mucho más a la memoria

Bien. Pensar es bueno. Encuentro que el "aprendizaje" conduce eventualmente a la "memoria".

  

Constantemente "grep" y lea el código para identificar las interfaces.

Esto es típico. Si no puedes recordarlos, entonces son demasiado complejos, ¿no? Es hora de simplificar.

Simple es difícil de crear. Pero cuando tienes problemas para recordar, es un síntoma de mal diseño.

Yo uso grep. Esto funciona para mi. Mi edición de Komodo tiene mucha búsqueda agradable. Lo mismo ocurre con Notepad ++

  

Identificación de las interfaces de los objetos que estoy usando

Doc Strings y la función help() funcionan. Yo los uso Diaria.

  

Refactorizando eficientemente ...    depende enormemente de la calidad de mis pruebas unitarias.

Eso no es noticia. Eso siempre ha sido cierto, incluso en un lenguaje estático.

En un lenguaje estático, a menudo nos volvemos perezosos, suponiendo que, mientras se compile, es muy probable que funcione. Esto es manifiestamente falso, pero nos hacemos perezosos.

  

Estoy seguro de que hay soluciones para estos problemas.

Estos no son "problemas" y no requieren "soluciones".

  

Un lenguaje dinámico es precisamente acerca de no saber el tipo de objetos que manipulas. Cuando recibe un parámetro, asume que define un método "quack ()" y un método "feathers ()", pero no sabe dónde hay documentación (de hecho, tendrán varias cadenas de documentación en sus implementaciones múltiples).

¿"no saber el tipo de los objetos"? De Verdad. Cuando diseño el cliente de un objeto, sé qué tipo diseñé.

Cuando defino un servicio, utilizado por varios clientes, el tipo "exacto" no es relevante, cuando tengo definida la interfaz requerida de quack() y feathers() .

Finalmente, tengo la herramienta Leer-Ejecutar-Imprimir-Bucle y otras herramientas para determinar el tipo "exacto" en los casos raros en los que tengo un problema sutil. Eso es lo que realmente uso todos los días.

>>> x = some_mystery_factory( some, args )
>>> type(x)
>>> dir(x)

No parece demasiado difícil, al menos en Python, para desenrollar el tipo de objeto. Los lenguajes dinámicos deben tener un REPL, lo que hace que sea bastante fácil ver lo que está pasando.

  

Tampoco sabe el orden de parámetros esperado. Parece difícil que un IDE ayude allí.

Eso no tiene mucho sentido. help() funciona.

Y mi IDE a menudo puede localizar la definición. No siempre: algunas construcciones dinámicas complicadas pueden ocultar fácilmente la clase base. En ese caso, tengo que pensar realmente en la clase del objeto para ubicar la definición del método. Por supuesto, estoy escribiendo el código, así que hay poco (o ningún) misterio allí.

    
respondido por el S.Lott 02.02.2011 - 22:26
2

Una búsqueda rápida mostró Rfactor for Ruby ( entrevista aquí ) y hombre de reparación de bicicletas para Python. Tampoco estoy seguro de lo buenos que son ... pero vale la pena mirarlos.

    
respondido por el Michael Brown 02.02.2011 - 21:55
1

Hay una compañía, JetBrains , autores de ReSharper, TeamCity e IDEA. Recientemente comenzaron a ver los lenguajes dinámicos y ya lanzaron sus herramientas para Python, PHP y Ruby.

La calidad es excelente. Estos no son otros complementos para su IDE favorito, sino IDE con todas las funciones y son bastante buenos para refactorizar / navegar / depurar, etc. - son como IDEA lite.

    
respondido por el Andrey Taptunov 03.02.2011 - 19:09

Lea otras preguntas en las etiquetas