web-dev-qa-db-fra.com

Existe-t-il un outil de refactoring C ++ fonctionnel?

Est-ce que quelqu'un connaît un outil de refactoring complet pour C++ qui fonctionne de manière fiable avec des bases de code volumineuses (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 du temps et évalué "Visual Assist X" ainsi que "Refactor for C++". Les deux ont des caractéristiques impressionnantes, mais les deux sont loin d'être parfaits. Extraire un gros bloc de code n’est généralement pas satisfaisant sans modifications manuelles - et ne porte donc pas ses fruits.

"Visual Assist X" présente des fonctionnalités intéressantes telles que l'auto-complétion beaucoup plus complète, etc. Mais il en résulte beaucoup de scintillements et de ralentissements importants à certains moments.

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

UPDATE Mars 2015 En ce qui concerne la réponse de hdoghmens aujourd'hui, j'ai essayé Resharper pour C++. Son lien https://www.jetbrains.com/resharper/ ne dit rien du 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

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

Test 1: Méthode d'extraction: génère une exception Resharper. Aucun code source changé.

Test 2: Méthode d'extraction avec une source différente: Fonctionne bien

Test 3: Modifier la signature de la fonction extraite: Résultats en code C++ cassé:

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

C’est peut-être pour cette raison que C++ n’est pas répertorié sur la page principale.

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

158
RED SOFT ADAIR

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

37
Gant

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

41
Tom Leys

Je pense que clang changera considérablement le paysage des outils de refactoring C++ au cours des deux prochaines années. C'est un compilateur modulaire open-source qui expose une API pour analyser et analyser sémantiquement le code C++. Les IDE et d’autres outils pourront utiliser cette API plutôt que de faire le difficile travail d’écriture de leur propre analyseur syntaxique et de leur analyseur sémantique.

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

23
HighCommander4

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

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

17
Cristian Adam

Notre DMS Software Reengineering Toolkit est un moteur de transformation conçu pour effectuer des transformations complexes sur des corps de code volumineux, y compris C++. Il a été utilisé pour apporter des modifications fiables sur les systèmes de millions de lignes de code. Il fonctionne en utilisant des analyseurs et des transformateurs de langages précis pour le compilateur.

Il dispose d'un analyseur syntaxique 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: C++ 1X est maintenant compris dans la mesure où nous comprenons la norme :)

Il a été utilisé dans des projets de réingénierie à grande échelle, notamment la réarchitecture de composants C++ et des traductions entièrement automatisées entre langues. Vous pouvez lire à ce sujet sur le site.

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 insertion/suppression simples), etc.

Ce qu’il n’est pas (actuellement) est un outil de refactoring interactif. Nous pensons que pour bien effectuer la plupart des restructurations, il faut un contrôle approfondi et des analyses de flux de données. DMS possède des machines génériques pour supporter cela, et ces machines sont implémentées pour C, COBOL et Java à ce stade, le C++ étant le prochain en ligne. C'est un travail difficile. Vous ne verrez pas de nombreux outils de refactoring C++ sérieux de la part de n’importe qui jusqu’à ce que ce type de problème soit résolu correctement. Vous devez d’abord disposer d’un analyseur syntaxique C++ complet: -}

EDIT 05/07/2011: On dirait que nous allons essayer la version interactive. Nous avons remporté un SBIR du Département de l’énergie de phase I pour étudier la manière de procéder. Voir http://science.energy.gov/sbir/awards-and-general-stats/fy-2011/phase-par état /? p = 1 # tx (Recherchez les dessins 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 arriver à un outil.

EDIT 8/11/2011: Premier progrès ... nous traitons 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, le moteur d’analyseur/transformation frontal C++ 14 est bien en main. Même le renommage est-il assez fiable à ce stade: -}

9
Ira Baxter

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

8
bmeric

Actuellement, je ne peux pas recommander aucun outil de refactoring pour C++, certainement pas pour les bases de code volumineuses de 100 000 lignes ou plus. J'espère que cela va changer, comme le PO, et j'espère qu'un jour, il y aura quelque chose. Je crains que le langage lui-même doive être modifié de manière significative avant que nous ne voyions de très bons outils.

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

6
quamrana

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

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

J'ai décidé d'essayer après avoir regardé ceci discussion qui a introduit rtags (et emacs) pour moi.

(Je dois dire que je suis allé aussi loin après que mon QtCreator n'a pas réussi à renommer correctement certains symboles, ce qui est un frein à mon utilisation de ce super IDE pour l'instant)

Outre ce qui est supporté par rtags, j'ai besoin de quelques fonctionnalités supplémentaires, notamment:

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

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

En règle générale, les outils basés sur Clang semblent très prometteurs . Si vous souhaitez en savoir plus sur les outils clang pour la refactorisation C++, y compris pour les projets avec une grande base de code, il existe negrande conférences de Chandler Carruth.

3

Le boîte à outils de réingénierie logicielle DMS le fait, je pense. C’est un moteur de transformation de code, conçu pour la grande échelle et qui gère le C++. Je n'ai aucune idée de l'élégance de la sortie.

3
Saltash Matt

Il faut sûrement mentionner Klocwork en tant que suite de refactoring de code commercial. Lorsque vous regardez la vidéo de démonstration, cela semble très prometteur.

2
muenalan

Le problème concerne les modèles C++. En 2019, je ne connaissais 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 je lance Rename Refactoring sur foo::print, bar::print devrait également être renommé automatiquement. Parce qu'ils sont liés par call_print instanciations de modèles de fonction.

1
random

CLion semble très prometteur.

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

1
Adamski

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 facilitant le processus de refactoring. Ces algorithmes vous aident à comprendre comment déplacer des éléments d’une partie de la hiérarchie à une autre, rompre les cycles et déplacer les sous-systèmes afin que le couplage et la cohésion des sous-systèmes puissent être améliorés. Voici les résultats de l'analyse par Lattix de noyau Android (1,6 million de LOC de C/C++). Divulgation complète: je travaille pour Lattix

1
S Barow

Si vous cherchez à réorganiser votre base de code: MOOSE. Mais il s'agit d'un vaste ensemble d'outils d'analyse et de réingénierie, et non d'un éditeur.

1
Stephan Eggermont

Désolé de trouver cette question si tard. Mes étudiants et mes assistants travaillent sur la refactorisation C++ depuis environ 2006. La plupart des infrastructures de refactorisation des CDT ont été construites par mon équipe de l’IFS Institute of Software. Depuis quelques années, nous fournissons à Cevelop notre version de CDT avec prise en charge des modifications de modernisation du code C++, etc. Cevelop peut fonctionner avec des bases de code volumineuses, si l’espace de travail est correctement configuré. Gratuit disponible sur https://cevelop.com

1
PeterSom

Il existe maintenant une extension de refactoring C++ pour Visual Studio 2013 de Microsoft: http://visualstudiogallery.msdn.Microsoft.com/164904b2-3b47-417f-9b6b-fdd35757d194

1
Robert Hegner

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

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

1
JBRWilkinson

Certainement Resharper Ultimate est la voie à suivre. Bonheur garanti :)

En version bêta à partir de mars 2015.

0
hdoghmen

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:

enter image description here

0
Zac