Comment naviguez-vous et refactorisez-vous le code écrit dans un langage dynamique?

14

J'aime que l'écriture de Python, Ruby ou Javascript nécessite si peu de passe-partout. J'aime les constructions fonctionnelles simples. J'adore la syntaxe claire et simple.

Cependant, il y a trois choses sur lesquelles je suis vraiment mal quand je développe un gros logiciel dans un langage dynamique:

  • Naviguer dans le code
  • Identifier les interfaces des objets que j'utilise
  • Refactoring efficace

J'ai essayé des éditeurs simples (c'est-à-dire Vim) ainsi que IDE (Eclipse + PyDev) mais dans les deux cas, je sens que je dois consacrer beaucoup plus de mémoire et / ou constamment "grep" et lire le code pour identifier les interfaces. Cela est particulièrement vrai lorsque vous travaillez avec une grande base de code avec plusieurs dépendances.

Quant au refactoring, par exemple le changement de nom de méthode, il dépend énormément de la qualité de mes tests unitaires. Et si j'essaie d'isoler mes tests unitaires en les «coupant» du reste de l'application, il n'y a aucune garantie que l'interface de mon stub reste à jour avec l'objet que je stubbe.

Je suis sûr qu'il existe des solutions à ces problèmes. Comment travaillez-vous efficacement en Python, Ruby ou Javascript?

Philippe Beaudoin
la source
Les fonctionnalités de changement de nom de PyDev ont très bien fonctionné pour moi jusqu'à présent.

Réponses:

3

Naviguer dans le code

Obtenez un meilleur éditeur que VIM.

J'utilise Komodo Edit.

J'ai l'impression de devoir me consacrer beaucoup plus à la mémoire

Bien. Penser, c'est bien. Je trouve que «l'apprentissage» mène finalement à la «mémoire».

"Grep" et lisez constamment le code pour identifier les interfaces.

C'est typique. Si vous ne vous en souvenez pas, alors ils sont trop complexes, n'est-ce pas? Il est temps de simplifier.

La simplicité est difficile à créer. Mais lorsque vous avez du mal à vous souvenir, c'est un symptôme de mauvaise conception.

J'utilise grep. Ça marche pour moi. Mon Komodo Edit a beaucoup de belles recherches. Notepad ++ aussi

Identifier les interfaces des objets que j'utilise

Doc Strings et la help()fonction fonctionnent. Je les utilise. Du quotidien.

Refactoring efficace ... cela dépend énormément de la qualité de mes tests unitaires.

Ce ne sont pas des nouvelles. Cela a toujours été vrai, même dans un langage statique.

Dans un langage statique, nous devenons souvent paresseux, en supposant que - tant qu'il est compilé - il est très probable qu'il fonctionne. C'est manifestement faux, mais nous devenons paresseux.


Je suis sûr qu'il existe des solutions à ces problèmes.

Ce ne sont pas des "problèmes" et ne nécessitent pas de "solutions de contournement".


Un langage dynamique consiste précisément à ne pas connaître le type des objets que vous manipulez. Lorsque vous recevez un paramètre, vous supposez qu'il définit une méthode "quack ()" et "feathers ()", mais vous ne savez pas où se trouve la documentation (en fait, ils auront plusieurs docstrings dans leurs implémentations multiples).

"ne connaissant pas le type des objets"? Vraiment. Quand je conçois le client d'un objet, je sais quel type j'ai conçu.

Lorsque je définis un service, utilisé par plusieurs clients, le type "exact" n'est pas pertinent, lorsque j'ai défini l'interface requise de quack()et feathers().

Enfin, j'ai la lecture-exécution-impression-boucle et d'autres outils pour déterminer le type "exact" dans les rares cas où j'ai un problème subtil. C'est ce que j'utilise tous les jours.

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

Il ne semble pas trop difficile - du moins en Python - de dérouler le type d'un objet. Les langues dynamiques doivent avoir un REPL, ce qui permet de voir assez facilement ce qui se passe.

Vous ne connaissez pas non plus l'ordre des paramètres attendu. Il semble difficile pour un IDE de vous y aider.

Cela n'a pas beaucoup de sens. help()travaux.

Et mon IDE peut souvent localiser la définition. Pas toujours - certaines constructions dynamiques alambiquées peuvent facilement cacher la classe de base. Dans ce cas, je dois réellement penser à la classe de l'objet pour localiser la définition de la méthode. Bien sûr, j'écris le code, donc il y a peu (ou pas) de mystère.

S.Lott
la source
6
J'ai l'impression que je pourrais affirmer qu'être forcé de s'engager davantage dans la mémoire vous donne moins de capacité de réflexion ...
Nicole
@Renesis: La mémorisation n'est pas mal s'il y a n'importe quel type de modèle ou de système aux interfaces.
S.Lott
1
Je suis d'accord avec les interfaces de mémorisation @Renesis qui m'éloigne de la vraie pensée. Je me fiche de savoir comment un autre codeur de mon équipe a décidé de commander les paramètres. Le fait qu'une grande base de code utilise un grand nombre de bibliothèques différentes avec des normes de dénomination différentes n'est pas rare, et il est souvent impossible ou peu pratique de simplifier ou d'unifier ces composants.
Philippe Beaudoin
Re: Doc strings, ils vont bien quand vous connaissez le type de l'objet, mais souvent vous ne le savez pas et vous devez le rechercher.
Philippe Beaudoin
1
grr ... il n'y a pas de meilleur éditeur que Vim: P
Anto
1

Il existe une société - JetBrains - auteurs de ReSharper, TeamCity et IDEA. Ils ont récemment commencé à étudier les langages dynamiques et ont déjà publié leurs outils pour Python, PHP et Ruby.

La qualité est super. Ce ne sont pas d'autres plugins pour votre IDE préféré mais des IDE complets et ils sont assez bons pour refactoring / navigation / débogage, etc. - ils sont comme IDEA lite.

Andrey Taptunov
la source