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" .
quelle
Antworten:
Ich finde Visual Assist X mit Visual Studio sehr nützlich. Eine andere Wahl ist Refactor für C ++ .
quelle
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.
quelle
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 .
quelle
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.
quelle
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: -}
quelle
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.
quelle
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?
quelle
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.
quelle
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:
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:
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.
quelle
Man muss Klocwork sicherlich als kommerzielle Code-Refactoring-Suite erwähnen . Es sieht sehr vielversprechend aus, wenn Sie das Demo-Video durchgehen.
quelle
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:
Wenn ich Refactoring umbenennen auf ausführe
foo::print
,bar::print
sollte dies auch automatisch umbenannt werden. Weil sie durchcall_print
Instanziierungen von Funktionsvorlagen verknüpft sind .quelle
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.
quelle
Wenn Sie Ihre Codebasis neu gestalten möchten: MOOSE. Aber das ist eine große Sammlung von Analyse- und Reengineering-Tools, kein Editor.
quelle
Es gibt jetzt eine C ++ - Refactoring-Erweiterung für Visual Studio 2013 von Microsoft: http://visualstudiogallery.msdn.microsoft.com/164904b2-3b47-417f-9b6b-fdd35757d194
quelle
Auf jeden Fall Resharper Ultimate ist der Weg. Glück garantiert :)
In der Beta-Version ab März 2015.
quelle
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.
quelle
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
quelle
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
quelle
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:
quelle