10
votes

Le refactoring automatique est-il possible dans des langages dynamiques?

Peut-être que j'en suis limité par mon expérience avec des langues dynamiques (Ruby sur Netbeans et Groovy sur Eclipse), mais il me semble que la nature des langues dynamiques rend impossible le refacteur (méthodes de renommage, classes, poussoir, tirage -down, etc.) automatiquement.

est-il possible de refroidir automatiquement dans une langue dynamique (avec un IDE / outil)? Je suis particulièrement intéressé par Ruby, Python et Groovy, et comment le refactoring se compare au refactoring 100% automatique Disponible dans tous les IDes Java.


0 commentaires

5 Réponses :


16
votes

Étant donné que le refactoring automatique était inventé dans une langue dynamique (SmallTalk), je devrais dire "oui".

En particulier, John Brant, Don Roberts et Ralph Johnson ont développé le Navigateur de refactoring qui est l'un des outils de base dans, par exemple, grincant.

Mon Google-Fu est faible aujourd'hui, mais vous pouvez essayer de trouver ce papier: Don Roberts, John Brant et Ralph Johnson, un outil de refactoring pour Smalltalk, "la théorie et la pratique des systèmes d'objets", (3) 4, 1997.


2 commentaires

Bien que cette note historique soit groovy (excusez le jeu de mots), je n'essaie pas de comprendre si cela est possible. Même dans Ruby, nous avons "refactoring automatique" mais dans la pratique, cela ne fonctionne pas. Dans NetBeans, il y a même un avertissement, mais la réalité est assez sombre. De plus, je ne sais pas si vous déclarez tous les types de smalltalk, ce qui aiderait à refléter. En rubis, vous ne le faites pas, ce qui est l'une des choses qui le rend si difficile.


Désolé, je ne voulais pas seulement donner une note historique. Je voulais dire que le navigateur de refactoring est un outil standard dans de nombreux IDes de SmallTalk



13
votes

SmallTalk ne déclare aucun type. Le navigateur de refactoring a effectué avec succès des refacteurs corrects dans le code de commerce depuis 1995 et est incorporé dans presque tous les SmallTalk IDE d'actualité. - Don Roberts


1 commentaires

Merci Don, maintenant je devrais juste avoir un travail de travail dans Smalltalk. Comment peut-il refracter sans déclarer des types (excusez mon ignorance)?



9
votes

Le refactoring automatique a été inventé dans SmallTalk, une langue très dynamique. Et cela fonctionne comme un charme depuis.

Vous pouvez vous essayer dans une version gratuite SmallTalk (par exemple, http://pharo-project.org )

Dans une langue dynamique, vous pouvez également faire des refacteurs de script vous-même ou interroger le système. Exemple simple pour obtenir le nombre de classes de test:

TestCase ALLSUBCLASSES Taille


0 commentaires

1
votes

Identifiez les points sur le navigateur de refactoring ... il est très efficace dans la smalltalité. Cependant, j'imagine qu'il existe certains types de refactoris qui seraient impossibles sans que les informations de type (qu'ils obtiennent d'une annotation de type explicite dans la langue ou d'une forme de déduction de type dans une langue dynamique ne sont pas pertinentes). Un exemple: lorsque vous renommez une méthode en SmallTalk, il renommera tous les implémentaux et les expéditeurs de cette méthode, ce qui est le plus souvent bien, mais parfois indésirable. Si vous avez eu des informations de type sur les variables, vous pouvez émerger la renommée des implémentations dans la hiérarchie de la classe actuelle et tous les expéditeurs lorsque le message est envoyé à une variable déclarée d'un type dans cette hiérarchie (cependant, je pouvais imaginer des scénarios où même avec la déclaration de type, cela tomberait et produirait des résultats indésirables).


9 commentaires

Merci pour ça. Qu'est-ce que cela signifie "il renommera tous les accompagnateurs et les expéditeurs de cette méthode"? Sont des méthodes globalement scopées (ou quelque chose comme ça?)?


En outre, est-ce la journée SmallTalk ou quelque chose? Je ne comprendrai jamais pourquoi cette question est descendue de la route Smalltalk. Avez-vous vu un lien quelque part? C'est un peu plus sur Python, Ruby et Groovy, mais ST est évidemment valable comme cas.


@Yar: Bien sûr, les méthodes sont globalement scopées. Doit être la même chose dans Python et Ruby, mais si une méthode prend un paramètre et envoie un message à / appelle une méthode sur le paramètre, il fonctionnera pour toutes les classes qui mettront en œuvre cette méthode, donc renommer, dire, un site d'appel signifiera qu'un site d'appel Renommer tous les sites d'appel et les implémentations. Seulement vous savez quel sous-ensemble de Renames fonctionnera toujours lorsque vous exécutez le programme.


@quamrana peut-être que je ne sais pas de quoi nous parlons. Dans Ruby, les méthodes d'une classe sont sur cette classe :) ... Mais ensuite, ils peuvent être mélangés à d'autres endroits.


@Yar: Bien sûr, les méthodes de n'importe quelle classe ont un nom et n'importe où qui appelle une méthode, dans une langue dynamique, ne connaît pas la classe de l'objet d'appeler la méthode sur. Il connaît simplement le nom de la méthode. Donc, peu importe quelles classes ont une méthode de nom donné, ni les implémentations d'eux, juste l'orthographe du nom.


@quamrana, alors avez-vous tendance à utiliser des noms de méthodes uniques pour aider à refléter? En rubis cela pourrait aider mais être ennuyeux


Je n'utilise pas nécessairement des noms de méthodes uniques. Parfois, je modifie simplement le nom d'une méthode et exécutez tous les tests pour voir quels sites d'appel sont affectés.


@ Smalltalk Day chose est probablement de ma faute. J'ai gémissé que je me transformais en un vieil homme grincheux sur Squeak-Dev à cause de votre question et la prochaine chose que Ralph Johnson était postale Don Roberts et John Brant, et je suppose que les grinceurs ont juste sauté sur la question.


Aha! Je savais qu'il y avait une explication à cela, coïncidence n'a aucun sens.



2
votes

Je me suis demandé la même chose. Je ne suis pas un écrivain de compilateur / interprète, mais je pense que la réponse sera qu'il est impossible de l'obtenir parfaitement. Cependant, vous pouvez le faire corriger dans la plupart des cas.

Premièrement, je vais changer le nom "Dynamic" Langue à la langue "interprétée" qui est ce que je pense avec Ruby, JavaScript, etc. Les langues interprétées ont tendance à Profitez des capacités de temps d'exécution. p>

Par exemple, la plupart des langages de script permettent la suivante p> xxx pré>

i juste "ran" une chaîne! Vous devriez refrorter cette chaîne également. Et une variable doit-elle être une variable ou cette langue vous permettra-t-elle d'imprimer le caractère A sans guillemets s'il n'y a pas de variable A? P>

Je veux croire que ce type de codage est probablement l'exception et que vous obtiendrez bon refactoring presque tout le temps. Malheureusement, il semble que lorsque je regarde dans les bibliothèques pour les langages de script, ils entrent dans de telles exceptions normalement et peuvent même baser leur architecture sur eux. P>

ou sur le bit ante: P>

String wasInt;
out = 3 + wasInt;


0 commentaires