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

14

Me encanta que escribir Python, Ruby o Javascript requiera tan poca información. Me encantan las construcciones funcionales simples. Me encanta la sintaxis limpia y simple.

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

  • Navegando por el código
  • Identificando las interfaces de los objetos que estoy usando
  • Refactorizando eficientemente

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

En cuanto a la refactorización, por ejemplo, cambiar los nombres de los métodos, depende en gran medida de la calidad de las pruebas de mi unidad. Y si trato de aislar las pruebas de mi unidad "cortando" el resto de la aplicación, entonces no hay garantía de que la interfaz de mi código auxiliar esté actualizada con el objeto que estoy copiando.

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

Philippe Beaudoin
fuente
Las características de cambio de nombre de PyDev me han funcionado muy bien hasta ahora.

Respuestas:

3

Navegando por el código

Consigue un mejor editor que VIM.

Yo uso Komodo Edit.

Siento que tengo que comprometer mucho más la memoria

Bueno. Pensar es bueno. Me parece que el "aprendizaje" conduce eventualmente a la "memoria".

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

Esto es tipico. Si no puedes recordarlos, entonces son demasiado complejos, ¿no? Hora de simplificar.

Lo simple es difícil de crear. Pero cuando tiene 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 buena búsqueda. También Notepad ++

Identificando las interfaces de los objetos que estoy usando

Doc Strings y la help()función funcionan. Los uso Diario.

Refactorizando eficientemente ... se vuelve enormemente dependiente 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, siempre y cuando se compile, es muy probable que funcione. Esto es manifiestamente falso, pero nos volvemos perezosos.


Estoy seguro de que hay soluciones para estos problemas.

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


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

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

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

Finalmente, tengo el Read-Execute-Print-Loop y otras herramientas para determinar el tipo "exacto" en los casos raros cuando 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, desenrollar el tipo de un objeto. Los lenguajes dinámicos deben tener un REPL, por lo que es bastante fácil ver lo que está sucediendo.

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

Eso no tiene mucho sentido. help()trabajos.

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

S.Lott
fuente
66
Siento que podría argumentar que se ven obligados a comprometerse más con la memoria le da menos capacidad de pensamiento ...
Nicole
@Renesis: la memorización no es mala si hay algún tipo de patrón o sistema en las interfaces.
S.Lott
1
Estoy de acuerdo con las interfaces de memorización de @Renesis que me alejan del pensamiento real. No podría importarme menos cómo otro codificador de mi equipo decidió ordenar los parámetros. El hecho de que una base de código grande use muchas bibliotecas diferentes con diferentes estándares de nombres no es infrecuente, y a menudo es imposible o poco práctico simplificar o unificar estos componentes.
Philippe Beaudoin
Re: cadenas de documentos, están bien cuando sabes el tipo de objeto, pero a menudo no lo sabes y tienes que buscarlo.
Philippe Beaudoin
1
grr ... no hay mejor editor que Vim: P
Anto
1

Hay una empresa, JetBrains , autores de ReSharper, TeamCity e IDEA. Recientemente comenzaron a buscar 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 la refactorización / navegación / depuración, etc., son como IDEA lite.

Andrey Taptunov
fuente