Existe-t-il un outil de refactoring C ++ fonctionnel? [fermé]

161

Est-ce que quelqu'un connaît un outil de refactoring complet pour C ++ qui fonctionne de manière fiable avec de grandes bases de code (environ 100 000 lignes)?

J'ai essayé tout ce que je pouvais trouver encore et encore au cours des dernières années: SlickEdit, Eclipse CDT. Ils n'étaient pas du tout utilisables.

Résumé : j'ai pris le temps et évalué «Visual Assist X» ainsi que «Refactor for C ++». Les deux ont des caractéristiques impressionnantes, mais les deux sont également loin d'être parfaits. Extraire un gros bloc de code n'est généralement pas satisfaisant sans modifications manuelles - et ne paie donc pas.

"Visual Assist X" a des fonctionnalités intéressantes telles qu'une autocomplétition beaucoup plus complète, etc. Mais cela entraîne tellement de scintillement et ralentit beaucoup à certains moments.

À mon avis, la réponse est donc: "Non, il n'y a pas d'outil de refactoring prêt pour la production pour C ++"

MISE À JOUR Mars 2015 En ce qui concerne la réponse hdoghmens aujourd'hui, j'ai essayé Resharper pour C ++. Son lien https://www.jetbrains.com/resharper/ ne dit rien sur C ++. Mais j'ai trouvé Resharper C ++ qui a été annoncé il y a plus d'un an ici:

https://www.jetbrains.com/resharper/features/cpp.html

Je l'ai essayé avec VC2010 en utilisant une base de code de 20 Mo.

Test 1: Méthode d'extraction: entraîne une exception Resharper. Aucun code source modifié.

Test 2: méthode d'extraction avec une source différente: fonctionne bien

Test 3: Modifier la signature de la fonction extraite: entraîne un code C ++ cassé:

bool myclass::do_work123(<unknown long Color>int& Filled*&, long, int&)

C'est peut-être pourquoi C ++ n'est pas répertorié sur la page principale.

A mon avis, la réponse à cette question est toujours "NON" .

ADAIR SOUPLE ROUGE
la source
11
J'ai préféré celui-ci. Le problème avec C ++ est sa syntaxe très complexe et contextuelle. Sans réellement analyser la source complète, vous ne pouvez pas être sûr de ce que signifie un identificateur.
DevSolar
Voir aussi: stackoverflow.com/questions/249827/... mais il n'a pas grand chose à offrir
dmckee --- ex-moderator chaton
4
Eclipse fonctionne plutôt bien, il vous suffit de lui permettre d'utiliser plus de mémoire en éditant
eclipse.ini
3
Si vous surveillez toujours les outils de refactoring pour C ++, veuillez considérer que chez JetBrains, nous travaillons actuellement sur le support C ++ dans ReSharper et un IDE C ++ multiplateforme distinct
Jura Gorohovsky
1
@RED SOFT ADAIR vous êtes célèbre. Vérifiez ce youtu.be/RT46MpK39rQ?t=1611
George C.

Réponses:

38

Je trouve Visual Assist X avec Visual Studio très utile. Un autre choix est Refactor pour C ++ .

Gant
la source
8
Malheureusement, Refactor pour C ++ ne fonctionne pas bien (voire pas du tout) avec de grandes bases de code.
Daniel Rose
1
Que se passe-t-il spécifiquement avec Refactor pour C ++ et les bases de code volumineuses?
Ira Baxter
2
@IraBaxter Il est simplement cassé. Les options de refactoring ne s'affichent pas ou ne se terminent pas. Il y a des messages d'erreur étranges ou pas du tout.
Daniel Rose
4
Refactor for C ++ ne fonctionne pas bien même pour les petites bases de code, il est cassé et inutilisable du tout.
kovarex
3
@Nils: pouvez-vous donner un exemple précis de ce qu'il ne comprend pas?
Ira Baxter
41

Visual Assist et Visual Studio facilitent grandement la gestion des bases de code volumineuses. L'assistance visuelle permet de suivre la manière dont une classe ou un membre est utilisé et est plus efficace pour le renommer sans faux positifs que rechercher et remplacer.

Tom Leys
la source
23

Je m'attends à ce que clang changera considérablement le paysage des outils de refactoring C ++ au cours des prochaines années. Il s'agit d'un compilateur modulaire open source qui expose une API pour l'analyse et l'analyse sémantique du code C ++. Les IDE et autres outils pourront utiliser cette API plutôt que de faire le difficile travail d'écrire leur propre analyseur et analyseur sémantique.

Google a déjà créé un outil de refactoring à grande échelle en utilisant clang .

HighCommander4
la source
2
Mais y a-t-il un résultat qu'un simple mortel extérieur à Google pourrait utiliser?
Jan Hudec
1
@JanHudec: Découvrez le tutoriel lié à partir d'ici: comments.gmane.org/gmane.comp.compilers.clang.devel/23203
HighCommander4
17

Mozilla a son propre outil de refactoring nommé Pork ( Wiki , Developer Wiki ). Voici le blog du développeur derrière Pork. D'après ce que j'ai lu, Pork a été utilisé avec succès dans des refactorisations chez Mozilla.

Pork devrait vous aider si vous venez de * nix land, pour Visual Studio, je recommande également Visual Assist.

Cristian Adam
la source
9

Notre boîte à outils de réingénierie logicielle DMS est un moteur de transformation conçu pour effectuer des transformations complexes sur de grands corps de code, y compris C ++. Il a été utilisé pour apporter des modifications fiables sur des systèmes de millions de lignes de code. Il fonctionne à l'aide d'analyseurs et de transformateurs de langages précis au compilateur.

Il dispose d'un analyseur C ++ complet avec résolution de nom et de type, construit des AST de code, peut appliquer des transformations procédurales ou source-à-source (avec la syntaxe de surface C ++) pour réviser ces arbres et régénérer la sortie compilable avec les commentaires préservés. (Edit: 7/1/2011: fait maintenant C ++ 1X dans la mesure où nous comprenons la norme :)

Il a été utilisé sur des projets de réingénierie à grande échelle, y compris la refonte de composants C ++ et des traductions 100% entièrement automatisées entre les langues. Vous pouvez en savoir plus sur le site Web.

DMS est également utilisé pour créer des outils d'analyse de source arbitraires. Les exemples incluent la détection de clone, la couverture de test, la différence intelligente (comparaison des structures de code source et des opérations d'édition abstraites plutôt que des lignes avec simple insertion et suppression), etc.

Ce qu'il n'est pas (actuellement) est un outil de refactoring interactif. Nous pensons que pour bien faire la plupart des refactorisations, vous avez besoin d'un contrôle approfondi et d'analyses de flux de données. DMS a des machines génériques pour prendre en charge cela, et cette machine est implémentée pour C, COBOL et Java à ce stade, le C ++ étant le suivant. C'est un travail difficile. Vous ne verrez pas beaucoup d'outils de refactoring C ++ sérieux de qui que ce soit tant que ce genre de problème n'a pas été bien résolu. Vous avez d'abord besoin d'un analyseur C ++ complet: -}

EDIT 7/5/2011: On dirait que nous allons faire un tour à la version interactive. Nous avons remporté un SBIR de phase I du ministère de l'Énergie pour étudier comment y parvenir. Voir http://science.energy.gov/sbir/awards-and-general-stats/fy-2011/phase-i-by-state/?p=1#tx (recherchez les conceptions sémantiques sous "Texas"). Ne vous attendez pas à un résultat pressé; ce n'est que le début d'un programme pluriannuel en 3 phases pour accéder à un outil.

EDIT 8/11/2011: Premiers progrès ... nous gérons maintenant toutes les directives C ++ 0x et OpenMP.

EDIT 1/4/2012: Effectue une analyse complète du flux de contrôle du code C ++.

EDIT 15/09/2014: Maintenant, avez bien en main l'analyseur / moteur de transformation frontal C ++ 14. Renomme même de manière assez fiable à ce stade: -}

Ira Baxter
la source
Il ne semble pas y avoir de lien pour évaluer cet outil sur votre page de téléchargement semanticdesigns.com/Products/RegisterEval.html Une version d'essai et une tarification sont-elles actuellement disponibles pour VS2010 ou VS2008?
SmacL
Pour un outil de refactoring, "ne vous attendez pas à un résultat pressé". Notre tâche de recherche et développement de phase I est terminée et nous demandons des fonds pour la phase II. Pour discuter du DMS et des moyens de l'évaluer, contactez l'entreprise. Ce n'est pas le genre de chose que vous «téléchargez pour évaluer», de la même manière qu'Enterprise Oracle n'est pas un élément de téléchargement.
Ira Baxter
... DMS est capable de transformer VS2008 / VS2010, mais pas en tant qu'outil interactif, et il existe des limitations en ce qui concerne les directives de préprocesseur. (La bonne nouvelle est que nous pensons que nous avons résolu un problème majeur avec ceux-ci et que nous l'appliquerons dans un programme de R&D de phase II).
Ira Baxter
Merci pour les commentaires, mais cela ne ressemble pas au type d'outil que je recherche. Je n'ai pas besoin d'interactif, juste quelque chose qui peut effectuer des transformations raisonnablement simples sur une grande base de code, sans coûter un bras et une jambe, par exemple changer le nombre de paramètres qu'un appel prend, changer un paramètre de pointeur en référence. VisualAssist est proche mais a juste besoin d'aller un peu plus loin.
SmacL
3
... le but du DMS est de permettre le codage et l'application sans erreur des transformations de code, que ce soit "refactoring" ou "non". Oui, c'est dur et nous n'en sommes pas encore là. Nous sommes plus proches IMNSHO que tout autre outil que j'ai vu pour C ++, et il n'y a rien de mal avec nos fondations d'outils. Ce qui reste, ce sont des problèmes désagréables avec le préprocesseur, l'échelle du code et l'effort de coder la sémantique de C ++ de manière adéquate pour permettre de telles transformations. Et je serai le premier à dire que c'est un GRAND projet.
Ira Baxter
8

Si vous utilisez emacs, essayez Xrefactory . Il prend en charge l'extraction de méthodes, le changement de nom des classes / fonctions / variables et d'insertion / suppression / déplacement de paramètres.Il dispose également d'un moteur de complétion de code très bon / rapide.

bmeric
la source
6

Actuellement, je ne peux recommander aucun outil de refactoring pour C ++, certainement pas pour les grandes bases de code de 100k lignes et plus. J'espérais que cela changera, comme l'OP, et j'espère qu'un jour il y aura quelque chose. Je crains que le langage lui-même doive changer de manière significative avant de voir de très bons outils.

btw, SlickEdit a-t-il abandonné ses fonctionnalités de refactoring?

quamrana
la source
Le langage a considérablement changé avec la sortie de la norme C ++ 2011. Les complications supplémentaires rendent le problème plus difficile, pas plus facile, car tous les utilisateurs voudront toutes les fonctionnalités avancées du langage et une capacité de refactoring: - {
Ira Baxter
2
Ayant récemment pris connaissance des capacités de Slickedit, il semble qu'il détermine la définition correspondant à l'utilisation d'un nom par des méthodes heuristiques. Il n'effectue pas une recherche de nom C ++ "correcte". Cela signifie que vous ne pouvez pas croire que ses transformations sont correctes. Si cela ne vous dérange pas d'inspecter son travail, cela peut vous convenir. Sur de très gros progiciels, ce n'est probablement pas bon. Mon avis.
Ira Baxter
4

Je recommande d'essayer les rtags si vous utilisez emacs et que vous ne l'avez pas encore essayé (il existe également un package pour vim disponible). Il s'agit d'une application client / serveur basée sur clang qui indexe le code C / C ++, avec ces fonctionnalités incluses:

  • aller à la définition / déclaration
  • trouver toutes les références, aller au suivant / précédent
  • renommer le symbole
  • intégration avec les «fixits» de clang

J'ai décidé de l'essayer après avoir regardé cette conférence qui a présenté les rtags (et emacs) pour moi.

(Je dois dire que je suis allé jusque-là seulement après que mon QtCreator n'a pas réussi à renommer certains symboles correctement, ce qui est un obstacle pour mon utilisation de cet excellent IDE pour le moment)

Outre ce qui est pris en charge par les rtags, j'ai également besoin de fonctionnalités supplémentaires, notamment:

  • créer une définition / un prototype de fonction
  • fonction d'extraction
  • créer des méthodes getter / setter

Pour ceux-ci, je recommande d'utiliser un package sémantique-refactor pour emacs ( je ne sais pas s'il existe des alternatives pour vim)

En général, les outils basés sur le clang semblent très prometteurs. Si vous êtes intéressé par plus d'informations sur les outils clang pour la refactorisation C ++, y compris pour les projets avec une base de code importante, il y a quelques excellentes discussions de Chandler Carruth.

Nikolay Bobovnikov
la source
3

La boîte à outils de rengineering logiciel DMS fait cela , je pense. Il s'agit d'un moteur de transformation de code, conçu pour une grande échelle et qui gère le C ++. Je n'ai aucune idée de l'élégance de la sortie.

Ira Baxter
la source
1
Le DMS a été utilisé pour automatiser la réarchitecture de grands corps de code C ++. Voir Akers, R., Baxter, I., Mehlich, M., Ellis, B., Luecke, K., Case Study: Re-engineering C ++ Component Models Via Automatic Program Transformation, Information & Software Technology 49 (3): 275 -291 2007. Disponible auprès de l'éditeur
Ira Baxter
Je ne sais pas ce que vous entendez par "sortie élégante". La sortie que vous obtenez de DMS dépend clairement de ce que vous lui donnez et des transformations que vous appliquez. Si la transformation ne touche pas une partie du code, cette partie du code est aussi élégante ou pas qu'elle ne l'était au départ. S'il touche le code, l'élégance est déterminée par l'intelligence des transformations, tout comme le seraient les changements manuels d'un codeur. Je ne pense pas que ce soit de l'élégance, mais le formatage du résultat peut être soit une impression "fidélité" (le format d'origine), soit un style d'impression joli défini.
Ira Baxter le
2

Il faut sûrement mentionner Klocwork comme une suite de refactoring de code commercial. Cela semble très prometteur lorsque vous parcourez la vidéo de démonstration.

Muenalan
la source
2

Le problème, ce sont les modèles C ++. Depuis 2019, je ne connais aucun outil de refactoring prenant en charge les modèles C ++. J'ai essayé VS2019, VisualAssist, Clion, QtCreator.

Prenons l'exemple:

#include <iostream>

struct foo { void print() {} };
struct bar { void print() {} };

template <typename T>
void call_print(T&& v) { v.print(); }

void print() {}

int main()
{
    call_print(foo{});
    call_print(bar{});
    return 0;
}

Si j'exécute Rename Refactoring sur foo::print, bar::printdoit également être renommé automatiquement. Parce qu'ils sont liés par call_printdes instanciations de modèle de fonction.

Aléatoire
la source
1

Si vous utilisez Visual C ++ (Express Edition est gratuite), vous pouvez utiliser Visual Assist à partir de www.wholetomato.com (lien vers les fonctionnalités de refactoring C ++).

Il a une période d'essai de 30 jours et nous avons trouvé qu'il était plus rapide et plus complet que l'intellisense intégré dans le produit Visual C ++ lui-même.

JBRWilkinson
la source
2
Je ne pensais pas que vous pouviez utiliser des plugins avec l'édition express
Yacoby
3
J'ai certainement essayé d'installer VA avec VS C ++ express dans le passé et cela n'a pas fonctionné.
quamrana
Vous ne pouvez pas installer les plugins Visual Studio en mode isolé (les éditions Express exécutent toutes l'EDI en mode isolé). Si vous êtes étudiant, vous pouvez télécharger des versions complètes de Visual Studio depuis DreamSpark ou MSDNAA.
Billy ONeal
1

Si vous cherchez à réorganiser votre base de code: MOOSE. Mais c'est une grande collection d'outils d'analyse et de réingénierie, pas un éditeur.

Stéphan Eggermont
la source
1

Resharper Ultimate est définitivement la voie à suivre. Bonheur garanti :)

En version bêta à partir de mars 2015.

hdoghmen
la source
J'ai finalement essayé celui-là et mis à jour ma question. Merci quand même.
RED SOFT ADAIR
C'est pour .NET .... pas C ++.
wcochran
1

CLion semble très prometteur.

Avertissement: je ne l'ai pas encore essayé car je dois convertir mes projets au format CMake pour pouvoir l'utiliser.

Adamski
la source
1

Je vous recommande d'essayer Lattix . Il vous permet d'analyser de grandes bases de code C / C ++ pour découvrir l'architecture, identifier les dépendances problématiques et repenser le code pour améliorer la modularité et réduire la dette technique. Lattix fournit également un certain nombre d'algorithmes pour aider dans le processus de refactoring. Ces algorithmes vous aident à comprendre comment déplacer des éléments d'une partie de la hiérarchie à une autre, interrompre les cycles et déplacer les sous-systèmes afin d'améliorer le couplage et la cohésion des sous-systèmes. Voici les résultats de Lattix analysant le noyau Android (1,6 million de LOC de C / C ++). Divulgation complète: je travaille pour Lattix

S Barow
la source
1

Désolé de ne trouver cette question que si tard. Mes étudiants et assistants travaillent sur le refactoring C ++ depuis environ 2006. La plupart des infrastructures de refactoring des CDT ont été construites par mon équipe à l'IFS institute of software. depuis quelques années, nous fournissons à Cevelop notre version de CDT avec un support pour les refactorisations de modernisation de code C ++, etc. Gratuit disponible sur https://cevelop.com

PeterSom
la source
Très intéressant. Je l'ai téléchargé et il ne démarre pas. Veuillez consulter github.com/Cevelop/Issues/issues/84
RED SOFT ADAIR
0

J'ai trouvé le plugin suivant pour Visual Studio 2013: Refactoring Visual C ++ par Microsoft.

C'est juste un simple outil de changement de nom, mais il fonctionne parfaitement. Il ajoute le menu contextuel suivant après un clic droit sur un symbole:

entrez la description de l'image ici

Zac
la source