Gibt es ein funktionierendes C ++ - Refactoring-Tool? [geschlossen]

161

Kennt jemand ein voll ausgestattetes Refactoring-Tool für C ++, das zuverlässig mit großen Codebasen (ca. 100.000 Zeilen) funktioniert?

Ich habe in den letzten Jahren immer wieder versucht, was ich finden kann: SlickEdit, Eclipse CDT. Sie alle waren überhaupt nicht verwendbar.

ZUSAMMENFASSUNG : Ich habe mir Zeit genommen und "Visual Assist X" sowie "Refactor for C ++" evaluiert. Beide haben einige beeindruckende Eigenschaften, aber auch beide sind alles andere als perfekt. Das Extrahieren eines großen Codeblocks ist normalerweise ohne manuelle Änderungen nicht zufriedenstellend - und zahlt sich daher nicht aus.

"Visual Assist X" verfügt über nette Funktionen wie eine viel vollständigere automatische Vervollständigung usw. Aber es führt zu so viel Flackern und verlangsamt sich an bestimmten Stellen erheblich.

Meiner Meinung nach lautet die Antwort daher: "Nein, es gibt kein produktionsfertiges Refactoring-Tool für C ++."

UPDATE März 2015 Was die Antwort von hdoghmens betrifft, habe ich heute Resharper für C ++ ausprobiert. Sein Link https://www.jetbrains.com/resharper/ sagt nichts über C ++ aus. Aber ich habe Resharper C ++ gefunden, das vor mehr als einem Jahr hier angekündigt wurde:

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

Ich habe es mit VC2010 unter Verwendung einer Codebasis von 20 MB versucht.

Test 1: Extraktionsmethode: führt zu einer Resharper-Ausnahme. Kein Quellcode geändert.

Test 2: Extraktionsmethode mit unterschiedlicher Quelle: Funktioniert einwandfrei

Test 3: Signatur der extrahierten Funktion ändern: Führt zu fehlerhaftem C ++ - Code:

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

Vielleicht ist C ++ deshalb nicht auf der Hauptseite aufgeführt.

Meiner Meinung nach lautet die Antwort auf diese Frage immer noch "NEIN" .

ROTE WEICHE ADAIR
quelle
11
Favorit dieses. Das Problem mit C ++ ist die sehr komplexe, kontextsensitive Syntax. Ohne die vollständige Quelle zu analysieren, können Sie nicht sicher sein, was ein Bezeichner bedeutet.
DevSolar
Siehe auch: stackoverflow.com/questions/249827/… aber es hat nicht viel zu bieten
dmckee --- Ex-Moderator Kätzchen
4
Eclipse funktioniert eigentlich ziemlich gut, Sie müssen nur zulassen, dass es mehr Speicher benötigt, indem Sie eclipse.ini
n0rd
3
Wenn Sie noch Refactoring-Tools für C ++ überwachen, denken Sie bitte daran, dass wir bei JetBrains derzeit an der C ++ - Unterstützung in ReSharper und einer separaten plattformübergreifenden C ++
Jura Gorohovsky
1
@ Red SOFT ADAIR Sie sind berühmt. Überprüfen Sie diese youtu.be/RT46MpK39rQ?t=1611
George C.

Antworten:

38

Ich finde Visual Assist X mit Visual Studio sehr nützlich. Eine andere Wahl ist Refactor für C ++ .

Gant
quelle
8
Leider funktioniert Refactor für C ++ (wenn überhaupt) nicht gut mit großen Codebasen.
Daniel Rose
1
Was passiert speziell mit Refactor für C ++ und großen Codebasen?
Ira Baxter
2
@IraBaxter Es ist einfach kaputt. Die Refactoring-Optionen werden entweder nicht angezeigt oder nicht abgeschlossen. Es gibt seltsame oder gar keine Fehlermeldungen.
Daniel Rose
4
Refactor für C ++ funktioniert selbst für kleine Codebasen nicht gut, es ist kaputt und überhaupt unbrauchbar.
Kovarex
3
@Nils: Können Sie ein konkretes Beispiel dafür geben, was es nicht versteht?
Ira Baxter
41

Visual Assist und Visual Studio erleichtern den Umgang mit großen Codebasen erheblich. Die visuelle Unterstützung kann gut nachverfolgen, wie eine Klasse oder ein Mitglied verwendet wird, und ist effektiver darin, sie ohne Fehlalarme umzubenennen als zu suchen und zu ersetzen.

Tom Leys
quelle
23

Ich gehe davon aus, dass Clang die Landschaft der C ++ - Refactoring-Tools in den nächsten Jahren erheblich verändern wird. Es ist ein modularer Open-Source-Compiler, der eine API zum Parsen und semantischen Analysieren von C ++ - Code bereitstellt. IDEs und andere Tools können diese API verwenden, anstatt die schwierige Arbeit des Schreibens eines eigenen Parsers und Semantikanalysators zu erledigen.

Google hat bereits ein umfangreiches Refactoring-Tool mit clang erstellt .

HighCommander4
quelle
2
Aber gibt es ein Ergebnis davon, das ein bloßer Sterblicher außerhalb von Google gebrauchen könnte?
Jan Hudec
1
@ JanHudec: Schauen Sie sich das Tutorial von hier verlinkt: Kommentare.gmane.org/gmane.comp.compilers.clang.devel/23203
HighCommander4
17

Mozilla hat ein eigenes Refactoring-Tool namens Pork ( Wiki , Developer Wiki ). Hier ist der Blog des Entwicklers hinter Pork. Nach dem, was ich gelesen habe, wurde Schweinefleisch erfolgreich in Refactorings bei Mozilla eingesetzt.

Schweinefleisch sollte helfen, wenn Sie aus * nix Land kommen. Für Visual Studio empfehle ich auch Visual Assist.

Cristian Adam
quelle
9

Unser DMS Software Reengineering Toolkit ist eine Transformations-Engine, mit der komplexe Transformationen über große Codemengen, einschließlich C ++, durchgeführt werden können. Es wurde verwendet, um zuverlässige Änderungen an Systemen mit Millionen von Codezeilen vorzunehmen. Es arbeitet mit compilergenauen Sprachanalysatoren und Transformatoren.

Es verfügt über einen vollständigen C ++ - Parser mit Namens- und Typauflösung, erstellt ASTs von Code, kann prozedurale oder Source-to-Source-Transformationen (mit C ++ - Oberflächensyntax) anwenden, um diese Bäume zu überarbeiten, und die kompilierbare Ausgabe mit beibehaltenen Kommentaren neu generieren. (Edit: 7/1/2011: Jetzt funktioniert C ++ 1X soweit wir den Standard verstehen :)

Es wurde in großen Reengineering-Projekten verwendet, einschließlich der Neuarchitektur von C ++ - Komponenten und 100% vollautomatisierten Übersetzungen zwischen Sprachen. Sie können dies auf der Website lesen.

DMS wird auch verwendet, um beliebige Quellenanalysetools zu erstellen. Beispiele hierfür sind Klonerkennung, Testabdeckung, intelligente Unterschiede (Vergleich von Quellcodestrukturen und abstrakten Bearbeitungsvorgängen anstelle von Zeilen mit einfachem Einfügen und Löschen) usw.

Was es (derzeit) nicht ist, ist ein interaktives Refactoring-Tool. Wir glauben, dass Sie eine gründliche Kontrolle und Datenflussanalysen benötigen, um die meisten Refactorings gut durchführen zu können. DMS verfügt über generische Maschinen, um dies zu unterstützen, und diese Maschinen sind zu diesem Zeitpunkt für C, COBOL und Java implementiert, wobei C ++ an nächster Stelle steht. Das ist ein harter Job. Sie werden nicht viele ernsthafte C ++ - Refactoring-Tools von irgendjemandem sehen, bis diese Art von Problem gut gelöst ist. Zuerst benötigen Sie einen vollständigen C ++ - Parser: -}

EDIT 7/5/2011: Sieht so aus, als würden wir die interaktive Version ausprobieren . Wir haben ein SBIR des Energieministeriums der Phase I gewonnen, um zu untersuchen, wie dies zu tun ist. Siehe http://science.energy.gov/sbir/awards-and-general-stats/fy-2011/phase-i-by-state/?p=1#tx (Suchen Sie unter "Texas" nach semantischen Designs). Erwarten Sie kein eiliges Ergebnis. Dies ist nur der Beginn eines dreiphasigen mehrjährigen Programms, um zu einem Werkzeug zu gelangen.

EDIT 8/11/2011: Erster Fortschritt ... wir behandeln jetzt alle C ++ 0x- und OpenMP-Direktiven.

EDIT 1/4/2012: Führt eine vollständige Kontrollflussanalyse von C ++ - Code durch.

EDIT 15.09.2014: Jetzt haben Sie die C ++ 14 Front-End-Parser / Transformations-Engine gut in der Hand. Sogar benennt sich an dieser Stelle ziemlich zuverlässig um: -}

Ira Baxter
quelle
Auf Ihrer Download-Seite semanticdesigns.com/Products/RegisterEval.html scheint es keinen Link für die Bewertung dieses Tools zu geben. Ist derzeit eine Testversion und ein Preis für VS2010 oder VS2008 verfügbar?
SmacL
Erwarten Sie für ein Refactoring-Tool "kein schnelles Ergebnis". Unsere Phase-I-F & E-Aufgabe ist beendet und wir beantragen Mittel für Phase II. Wenden Sie sich an das Unternehmen, um DMS und Mittel zu seiner Bewertung zu besprechen. Es ist nicht die Art von Dingen, die Sie "herunterladen, um zu bewerten", genauso wie Enterprise Oracle kein Download-Element ist.
Ira Baxter
... DMS kann VS2008 / VS2010 transformieren, jedoch nicht als interaktives Tool, und es gibt Einschränkungen in Bezug auf Präprozessoranweisungen. (Die gute Nachricht ist, dass wir glauben, ein großes Problem damit gelöst zu haben, und dies in einem Phase-II-F & E-Programm anwenden werden.)
Ira Baxter
Vielen Dank für das Feedback, aber es sieht nicht nach dem Tool aus, nach dem ich suche. Ich brauche keine interaktive Funktion, sondern nur etwas, das einigermaßen einfache Transformationen auf einer großen Codebasis durchführen kann, ohne einen Arm und ein Bein zu kosten, z. B. die Anzahl der Parameter, die ein Aufruf benötigt, oder die Änderung eines Zeigerparameters in eine Referenz. VisualAssist ist nah dran, muss aber noch ein bisschen weiter gehen.
SmacL
3
... der Zweck von DMS ist es, die Codierung und fehlerfreie Anwendung von Codetransformationen zu ermöglichen, unabhängig davon, ob es sich um "Refactoring" handelt oder nicht. Ja, es ist schwer und wir sind noch nicht da. Wir sind IMNSHO näher als jedes andere Tool, das ich für C ++ gesehen habe, und an unseren Tool-Grundlagen ist nichts auszusetzen. Was bleibt, sind schlimme Probleme mit dem Präprozessor, der Codeskala und dem Aufwand, die Semantik von C ++ adqueat zu codieren, um solche Transformationen zu ermöglichen. Und ich werde der Erste sein, der sagt, dass dies ein GROSSES Projekt ist.
Ira Baxter
8

Wenn Sie Emacs verwenden, versuchen Sie es mit Xrefactory . Es unterstützt die Methodenextraktion, das Umbenennen von Klassen / Funktionen / Variablen und das Einfügen / Löschen / Verschieben von Parametern. Es verfügt auch über eine sehr gute / schnelle Code-Vervollständigungs-Engine.

bmeric
quelle
6

Derzeit kann ich kein Refactoring-Tool für C ++ empfehlen , schon gar nicht für große Codebasen mit 100.000 Zeilen und mehr. Ich habe gehofft, dass sich dies ändern wird, wie beim OP, und ich hoffe, dass es eines Tages etwas geben wird. Ich befürchte, dass sich die Sprache selbst erheblich ändern muss, bevor wir wirklich gute Werkzeuge sehen.

Übrigens, hat SlickEdit seine Refactoring-Funktionen eingestellt?

Quamrana
quelle
Die Sprache hat sich mit der Veröffentlichung des C ++ 2011-Standards erheblich geändert. Die zusätzlichen Komplikationen machen das Problem schwieriger und nicht einfacher, da alle Benutzer alle erweiterten Sprachfunktionen und eine Refactoring-Fähigkeit wünschen : - {
Ira Baxter
2
Nachdem Sie kürzlich die Funktionen von Slickedit gelesen haben, scheint es, dass es die Definition bestimmt, die der Verwendung eines Namens durch heuristische Methoden entspricht. Es wird keine "korrekte" C ++ - Namenssuche durchgeführt. Dies bedeutet, dass Sie nicht darauf vertrauen können, dass die Transformationen korrekt sind. Wenn es Ihnen nichts ausmacht, die Arbeit zu überprüfen, ist dies möglicherweise in Ordnung für Sie. Bei wirklich großen Softwarepaketen ist dies wahrscheinlich nicht gut. Meine Meinung.
Ira Baxter
3

Das DMS Software Rengineering Toolkit macht dies meiner Meinung nach. Es ist eine Code-Transformations-Engine, die für den großen Maßstab entwickelt wurde und C ++ verarbeitet. Ich habe keine Ahnung, wie elegant die Ausgabe ist.

Ira Baxter
quelle
1
DMS wurde verwendet, um die Neuarchitektur großer Teile von C ++ - Code zu automatisieren. Siehe Akers, R., Baxter, I., Mehlich, M., Ellis, B., Lücke, K., Fallstudie: Neuentwicklung von C ++ - Komponentenmodellen über automatische Programmtransformation, Informations- und Softwaretechnologie 49 (3): 275 -291 2007. Erhältlich beim Verlag
Ira Baxter
Keine Ahnung, was Sie unter "eleganter Ausgabe" verstehen. Die Ausgabe, die Sie von DMS erhalten, hängt eindeutig davon ab, was Sie geben und welche Transformationen Sie anwenden. Wenn die Transformation keinen Teil des Codes berührt, ist dieser Teil des Codes genauso elegant oder nicht so wie ursprünglich. Wenn es den Code berührt, wird die Eleganz davon bestimmt, wie clever die Transformationen sind, genau wie die manuellen Änderungen eines Codierers. Ich denke nicht, dass dies Eleganz ist, aber die Formatierung des Ergebnisses kann entweder "Wiedergabetreue" (das Originalformat) oder ein definierter hübscher Druckstil sein.
Ira Baxter
3

Ich empfehle, rtags auszuprobieren, wenn Sie Emacs verwenden und es noch nicht ausprobiert haben (es gibt auch ein Paket für vim). Es handelt sich um eine Clang-basierte Client / Server-Anwendung, die C / C ++ - Code indiziert. Diese Funktionen sind enthalten:

  • gehe zur Definition / Deklaration
  • Alle Referenzen finden, weiter / weiter
  • Symbol umbenennen
  • Integration mit Clangs "Fixits"

Ich beschloss, es zu versuchen, nachdem ich diesen Vortrag gesehen hatte, in dem rtags (und Emacs) für mich eingeführt wurden.

(Ich muss sagen, dass ich erst so weit gegangen bin, nachdem mein QtCreator einige Symbole nicht richtig umbenannt hat. Dies ist ein Show-Stopper für die Verwendung dieser großartigen IDE im Moment.)

Neben dem, was von rtags unterstützt wird, benötige ich auch einige zusätzliche nette Funktionen, darunter:

  • Funktionsdefinition / Prototyp erstellen
  • Extraktionsfunktion
  • Erstellen Sie Getter / Setter-Methoden

Für diese empfehle ich die Verwendung von a semantischen Refaktors Pakets für Emacs (nicht sicher, ob es Alternativen für vim gibt).

Im Allgemeinen sehen Clang-basierte Tools sehr vielversprechend aus. Wenn Sie an weiteren Informationen zu Clang-Tools für das C ++ - Refactoring interessiert sind, einschließlich für Projekte mit großer Codebasis, gibt es einige großartige Vorträge von Chandler Carruth.

Nikolay Bobovnikov
quelle
2

Man muss Klocwork sicherlich als kommerzielle Code-Refactoring-Suite erwähnen . Es sieht sehr vielversprechend aus, wenn Sie das Demo-Video durchgehen.

Muenalan
quelle
2

Das Problem sind C ++ - Vorlagen. Ab 2019 sind mir keine Refactoring-Tools bekannt, die C ++ - Vorlagen unterstützen. Ich habe VS2019, VisualAssist, Clion, QtCreator ausprobiert.

Betrachten Sie ein Beispiel:

#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;
}

Wenn ich Refactoring umbenennen auf ausführe foo::print, bar::printsollte dies auch automatisch umbenannt werden. Weil sie durch call_printInstanziierungen von Funktionsvorlagen verknüpft sind .

zufällig
quelle
1

Wenn Sie Visual C ++ verwenden (Express Edition ist kostenlos), können Sie Visual Assist von www.wholetomato.com verwenden (Link zu den C ++ - Refactoring-Funktionen).

Es hat eine 30-tägige Testphase und wir haben festgestellt, dass es schneller und funktionsreicher ist als das im Visual C ++ - Produkt selbst integrierte Intellisense.

JBRWilkinson
quelle
2
Ich dachte nicht, dass Sie Plugins mit der Express Edition verwenden könnten
könnten
3
Ich habe in der Vergangenheit sicherlich versucht, VA mit VS C ++ Express zu installieren, und es hat nicht funktioniert.
Quamrana
Sie können Visual Studio-Plugins nicht im isolierten Modus installieren (alle Express-Editionen führen die IDE im isolierten Modus aus). Wenn Sie Student sind, können Sie Vollversionen von Visual Studio von DreamSpark oder MSDNAA herunterladen.
Billy ONeal
1

Wenn Sie Ihre Codebasis neu gestalten möchten: MOOSE. Aber das ist eine große Sammlung von Analyse- und Reengineering-Tools, kein Editor.

Stephan Eggermont
quelle
1

Auf jeden Fall Resharper Ultimate ist der Weg. Glück garantiert :)

In der Beta-Version ab März 2015.

hdoghmen
quelle
Ich habe es endlich versucht und meine Frage aktualisiert. Danke trotzdem.
RED SOFT ADAIR
Dies ist für .NET .... nicht für C ++.
wcochran
1

CLion sieht sehr vielversprechend aus.

Haftungsausschluss: Ich habe es noch nicht ausprobiert, da ich meine Projekte in das CMake-Format konvertieren muss, um es verwenden zu können.

Adamski
quelle
1

Ich empfehle Ihnen, Lattix auszuprobieren . Sie können große C / C ++ - Codebasen analysieren, um die Architektur zu ermitteln, problematische Abhängigkeiten zu identifizieren und den Code neu zu entwickeln, um die Modularität zu verbessern und die technische Verschuldung zu verringern. Lattix bietet auch eine Reihe von Algorithmen, die beim Refactoring helfen. Mithilfe dieser Algorithmen können Sie herausfinden, wie Sie Elemente von einem Teil der Hierarchie in einen anderen verschieben, Zyklen unterbrechen und Subsysteme verschieben, um die Kopplung und den Zusammenhalt von Subsystemen zu verbessern. Hier sind die Ergebnisse der Analyse des Android-Kernels durch Lattix (1,6 Millionen LOC C / C ++). Vollständige Offenlegung: Ich arbeite für Lattix

S Barow
quelle
1

Es tut uns leid, diese Frage erst so spät zu finden. Meine Studenten und Assistenten arbeiten seit etwa 2006 am C ++ - Refactoring. Die meisten CDTs, die die Infrastruktur umgestalten, wurden von meinem Team am IFS-Institut für Software erstellt. Seit einigen Jahren bieten wir Cevelop, unserer CDT-Version, Unterstützung für Refactorings zur Modernisierung von C ++ - Code usw. Cevelop kann mit großen Codebasen arbeiten, wenn der Arbeitsbereich korrekt eingerichtet ist. Kostenlos verfügbar unter https://cevelop.com

PeterSom
quelle
Sehr interessant. Ich habe es heruntergeladen und es startet nicht. Bitte sehen Sie github.com/Cevelop/Issues/issues/84
RED SOFT ADAIR
0

Ich habe das folgende Plugin für Visual Studio 2013 gefunden: Visual C ++ Refactoring von Microsoft.

Es ist nur ein einfaches Umbenennungswerkzeug, aber es funktioniert einwandfrei. Nach dem Klicken mit der rechten Maustaste auf ein Symbol wird das folgende Kontextmenü hinzugefügt:

Geben Sie hier die Bildbeschreibung ein

Zac
quelle