Como você navega e refatora o código escrito em um idioma dinâmico?

14

Eu amo que escrever Python, Ruby ou Javascript requer tão pouco clichê. Eu amo construções funcionais simples. Eu amo a sintaxe limpa e simples.

No entanto, há três coisas nas quais sou realmente ruim ao desenvolver um software grande em uma linguagem dinâmica:

  • Navegando no Código
  • Identificando as interfaces dos objetos que estou usando
  • Refatorando eficientemente

Eu tenho tentado editores simples (por exemplo, Vim) e IDE (Eclipse + PyDev), mas em ambos os casos sinto que tenho que comprometer muito mais com a memória e / ou constantemente "grep" e ler o código para identificar as interfaces. Isso é especialmente verdade quando se trabalha com uma grande base de código com várias dependências.

Quanto à refatoração, por exemplo, alterando os nomes dos métodos, ela se torna extremamente dependente da qualidade dos meus testes de unidade. E se eu tentar isolar meus testes de unidade "cortando-os" o restante do aplicativo, não há garantia de que a interface do meu stub permaneça atualizada com o objeto que estou stub.

Tenho certeza de que existem soluções alternativas para esses problemas. Como você trabalha eficientemente em Python, Ruby ou Javascript?

Philippe Beaudoin
fonte
Os recursos de renomeação do PyDev funcionaram muito bem para mim até agora.

Respostas:

3

Navegando no Código

Obtenha um editor melhor que o VIM.

Eu uso o Komodo Edit.

Sinto que tenho que comprometer muito mais a memória

Boa. Pensar é bom. Eu acho que "aprender" leva eventualmente à "memória".

Constantemente "grep" e leia o código para identificar as interfaces.

Isso é típico. Se você não consegue se lembrar deles, eles são muito complexos, não são? Hora de simplificar.

Simples é difícil de criar. Mas quando você tem problemas para se lembrar, é um sintoma de mau design.

Eu uso grep. Funciona para mim. Meu Komodo Edit tem muitas pesquisas legais. O mesmo acontece com o Notepad ++

Identificando as interfaces dos objetos que estou usando

Doc Strings e a help()função funcionam. Eu os uso. Diariamente.

Refatorando com eficiência ... torna-se extremamente dependente da qualidade dos meus testes de unidade.

Isso não é novidade. Isso sempre foi verdade, mesmo em uma linguagem estática.

Em uma linguagem estática, geralmente ficamos preguiçosos, assumindo que - desde que seja compilado - é realmente provável que funcione. Isso é manifestamente falso, mas ficamos preguiçosos.


Tenho certeza de que existem soluções alternativas para esses problemas.

Estes não são "problemas" e não requerem "soluções alternativas".


Uma linguagem dinâmica é precisamente sobre não saber o tipo dos objetos que você manipula. Quando você recebe um parâmetro, assume que ele define um método "quack ()" e "feathers ()", mas não sabe onde existe a documentação (na verdade, eles terão vários documentos em suas múltiplas implementações).

"sem saber o tipo dos objetos"? Realmente. Ao projetar o cliente de um objeto, sei qual o tipo que projetei.

Quando defino um serviço, usado por vários clientes, o tipo "exato" não é relevante, quando defini a interface necessária de quack()e feathers().

Por fim, tenho o Read-Execute-Print-Loop e outras ferramentas para determinar o tipo "exato" nos casos raros em que tenho um problema sutil. É o que eu realmente uso todos os dias.

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

Não parece muito difícil - pelo menos em Python - descontrair o tipo de um objeto. Os idiomas dinâmicos devem ter um REPL, facilitando a visualização do que está acontecendo.

Você também não sabe a ordem esperada dos parâmetros. Parece difícil para um IDE ajudar lá.

Isso não faz muito sentido. help()trabalho.

E meu IDE geralmente pode localizar a definição. Nem sempre - algumas construções dinâmicas complicadas podem ocultar facilmente a classe base. Nesse caso, eu tenho que pensar na classe do objeto para localizar a definição do método. Claro, estou escrevendo o código, então há pouco (ou nenhum) mistério lá.

S.Lott
fonte
6
Eu sinto que eu poderia argumentar que sendo forçado a cometer mais a memória lhe dá menos capacidade de pensamento ...
Nicole
@Renesis: Memorização não é ruim se houver algum tipo de padrão ou sistema nas interfaces.
S.Lott 2/02
1
Eu concordo com as interfaces de memorização do @Renesis, que me afastam do pensamento real. Não me importava como outro codificador da minha equipe decidisse ordenar os parâmetros. O fato de uma grande base de código usar várias bibliotecas diferentes com diferentes padrões de nomenclatura não é pouco frequente, e muitas vezes é impossível ou impraticável simplificar ou unificar esses componentes.
Philippe Beaudoin
Re: Doc strings, eles estão bem quando você sabe o tipo do objeto, mas muitas vezes você não sabe e precisa procurar isso.
Philippe Beaudoin
1
grr ... não há editor melhor que o Vim: P
Anto 03/02
1

Existe uma empresa - JetBrains - autores do ReSharper, TeamCity e IDEA. Eles recentemente começaram a analisar linguagens dinâmicas e já lançaram suas ferramentas para Python, PHP e Ruby.

A qualidade é ótima. Estes não são outros plugins para o seu IDE favorito, mas IDEs com todos os recursos e são muito bons para refatoração / navegação / depuração etc. - são como o IDEA Lite.

Andrey Taptunov
fonte