Refactoring-Tools für C++?



  • Moin,

    gibt es für C++ Tools, mit denen man Funktions- und Variablennamen bequem im ganzen Projekt ändern lassen kann?
    Refactoring ist bei C++ ja nicht ganz einfach, auf korrekte Behandlung von Makros könnte ich z.B. aber auch verzichten.
    Wenn man sucht, findet man erstmal nur viele Leute, die auch gerne ein solches Tool hätten.

    Kennt jemand ein Tool, das für den praktischen Einsatz taugt oder ist immer noch Handarbeit angesagt?



  • Ich bin da mit Visual Assist X [1] ganz zufrieden. Leistet mir jedenfalls gute Dienste.
    Es gibt auch noch Xrefactory C++ [2], mit dem ich jedoch keine praktische Erfahrung habe.

    [1] http://www.wholetomato.com/
    [2] http://www.xref-tech.com/



  • Kostenlose Tools kenne ich leider keine. Die Mozillaleute arbeiten da wohl an was und Eclipse hat wohl mittlerweile auch Sachen. Aber das hab ich bisher nicht genauer angeschaut.

    Kommerziell gibt es da zB xrefactory



  • Danke, Xrefactory klingt von der Beschreibung her sehr vielversprechend, das werde ich mir mal in Ruhe anschauen.
    Über 300€ für eine Privatperson haben sich allerdings ganz schön gewaschen... Visual Assist X ist da zwar deutlich günstiger, aber unpassenderweise nur für Visual Studio.



  • Also einfach nur Suchen und Ersetzen? Wie waere es mit sed?



  • Athar schrieb:

    Danke, Xrefactory klingt von der Beschreibung her sehr vielversprechend, das werde ich mir mal in Ruhe anschauen.
    Über 300€ für eine Privatperson haben sich allerdings ganz schön gewaschen... Visual Assist X ist da zwar deutlich günstiger, aber unpassenderweise nur für Visual Studio.

    Gibt eine kostenlose Demoversion von Xrefactory.



  • rüdiger schrieb:

    Gibt eine kostenlose Demoversion von Xrefactory.

    Gut, acht Tage reichen zumindest um mein aktuelles Projekt zu überarbeiten.

    knivil schrieb:

    Also einfach nur Suchen und Ersetzen? Wie waere es mit sed?

    Suchen und Ersetzen reicht nicht ganz, da sed ja z.B. nicht zwischen lokalen/globalen Objekten unterscheiden kann und da oft mehr ersetzen wird als es eigentlich sollte.
    In manchen Fällen, wo garantiert alle Vorkommnisse ersetzt werden sollen (z.B. WriteToStream -> serialize) dürfte das aber funktionieren.



  • knivil schrieb:

    Also einfach nur Suchen und Ersetzen? Wie waere es mit sed?

    Nicht einfach nur Suchen+Ersetzen.
    Ein Refactoring-Tool kann z.B. folgendes machen:

    class A
    {
    public:
        void B(); // soll umbenannt werden
    };
    
    namespace B // soll nicht umbenannt werden
    {
    class B {}; // auch nicht umbenennen
    } // namespace B
    
    namespace C
    {
    
    A a;
    
    void B() // auch nicht
    {
        int B = 0; // erst recht nicht
        a.B(); // das hier schon
    }
    
    } // namespace C
    
    // etc.
    

    Visual Assist X kann das z.B. ziemlich gut. So gut, dass ich es nichtmal mehr ansatzweise nachkontrolliere wenn ich am Refactorn bin.

    Machen tut man das, indem man den Cursor einfach in den Bezeichner stellt wo er deklariert bzw. referenziert wird, und dann "Refactor-Rename" aus dem Menu auswählt. Bzw. wie ich die Funktion auf eine Tastenkombination legt. Dadurch weiss das Refactoring-Tool dann welches "B" man genau umbenennen will. Also in dem Fall die Member-Funktion ::A::B.

    Funktioniert auch genauso für Variablen jeder Art (globale, lokale, statische, ...), Klassennamen, Namespace-Namen - alles was es halt so an Namen gibt. Sogar Makro-Namen.



  • hustbaer schrieb:

    Funktioniert auch genauso für Variablen jeder Art (globale, lokale, statische, ...), Klassennamen, Namespace-Namen - alles was es halt so an Namen gibt. Sogar Makro-Namen.

    Wie siehts eigentlich mit Templates aus? Stösst man da mit VAX schnell an die Grenzen?



  • Nexus schrieb:

    hustbaer schrieb:

    Funktioniert auch genauso für Variablen jeder Art (globale, lokale, statische, ...), Klassennamen, Namespace-Namen - alles was es halt so an Namen gibt. Sogar Makro-Namen.

    Wie siehts eigentlich mit Templates aus? Stösst man da mit VAX schnell an die Grenzen?

    Ja. Grenzen. Mehr oder weniger schnell, das kommt auf den Programmierstil an.

    Einfache Dinge kann er. Gut. Also ein std::vector<Foo> v; und v[0].Name(), und dann Foo::Name umbenennen, da findet er schon das v[0].Name().

    Wenn man es allerdings drauf anlegt, hat man ihn nach meiner Erfahrung nach recht schnell so weit, dass er aussteigt. Das heisst nicht dass man Refactor-Rename nicht mehr verwenden könnte, aber es kann sein dass er dann gewisse Referenzen nicht erkennt und daher nicht umbenennt. Vermutlich kann es auch sein dass man ihn dazu bringen kann zu viel umzubenennen (hab' ich aber nicht ausprobiert).

    z.T. reicht schon ein Projekt wo man mehrfach mittels "using" Klassen in Namespaces "rumschiebt". Also ::A::X heisst die Klasse, dann erst mit "using A::X" nach ::B reinbringen, von dort mit "using B::X" nach "C", und dann vielleicht nochmal weiter in den globalen Namespace. Also ganz "harmlos" und ohne Templates. (Kann aber sein dass das mittlerweile behoben ist)

    Ich weiss mein Beitrag vorhin hat eher so geklungen als dass VAX so ziemlich alles checkt. Ist nicht so. Ist nur so, dass ich im Alltag damit keine Probleme habe. Und das ist das was für mich zählt. Auch sind die Tage - Gott sein Dank - vorbei, wo VAX alle paar Tage mal seine Daten-Files vernichtet hat, so dass man die löschen musste, damit das Studio nicht abkackt. Oder ähnliche unfreundliche Dinge. Läuft bei mir jetzt seit min. 1 Jahr "wartungsfrei".

    Wenn man dagegen Library-Code/Framework-Code unter schwerem Template-Einsatz schreibt o.ä., kann es sein, dass VAX zu oft aussteigt um nützlich zu sein. So lange man einfach nur halbwegs "normale" C++ Programme (oder Libraries) schreibt, kann man aber sehr gut damit arbeiten.

    Gibt aber soweit ich weiss ne Test-Version (30 Tage oder so limitiert). Kannste einfach mal ausprobieren.



  • Was passiert denn, wenn man boost Bibliotheken benutzt, welche oftmals ja nicht gerade wenig Abhängigkeiten haben? - Also jetzt weniger bezogen auf die Refactoring Funktionalitäten, sondern eher Vervollständigung usw.

    Bin mir wirklich schwer am überlegen, ob ich mir auch VAX zulegen soll. Habe nämlich vor etwas grösseres zu Refactoren.
    Was hast du für eine Lizenz?



  • Ich hab eine ganz normale Standard-Lizenz. Als ich meine gekauft habe, gab's den Split zwischen Standard und Personal noch nicht.
    Hab auch keine $249 bezahlt damals, aber trotzdem eine "renewable" Lizenz. Die ich bis jetzt auch schon 1x erneuert habe.

    Und Boost verwenden wir in unseren Projekten eigentlich dauernd. Dauert dann ein wenig länger beim Parsen, aber das macht er nur 1x nachdem man das Projekt aufgemacht hat.

    Aber probier es wie gesagt einfach aus, gibt ja ne Test-Version. Mit der kannst du erstmal 40 Tage lang refactorn. Bis dahin solltest du wissen ob VAX für dich funktioniert.


Anmelden zum Antworten