Warum fehlt Visual C ++ die Refactor-Funktionalität?


78

Warum gibt es bei der Programmierung in C ++ in Visual Studio 2008 bei Verwendung von C # keine Funktionen wie diese im Refactor-Menü?

Ich benutze Rename ständig und du vermisst es wirklich, wenn es nicht da ist. Ich bin sicher, dass Sie Plugins erhalten können, die dies bieten, aber warum ist es bei Verwendung von C ++ nicht in die IDE integriert? Liegt das an einem Gotcha in der Art und Weise, wie C ++ analysiert werden muss?


1
Refactoring ist für C ++ schwierig, aber ich denke, VS sollte eine Rename allArt Funktionalität wie die in Xcode C ++ hinzufügen .
Dylan Czenski

Antworten:


70

Die Syntax und Semantik von C ++ machen es unglaublich schwierig , die Refactoring-Funktionalität korrekt zu implementieren. Es ist möglich, etwas relativ Einfaches zu implementieren, um 90% der Fälle abzudecken, aber in den verbleibenden 10% der Fälle wird diese einfache Lösung Ihren Code schrecklich beschädigen, indem sie Dinge ändert, die Sie nie ändern wollten.

Unter http://yosefk.com/c++fqa/defective.html#defect-8 finden Sie eine kurze Beschreibung der Schwierigkeiten, mit denen Refactoring-Code in C ++ zu kämpfen hat.

Microsoft hat offenbar beschlossen, diese spezielle Funktion für C ++ zu nutzen, und es den Entwicklern von Drittanbietern überlassen, das zu tun, was sie können.


8
Nein, ziemlich schlechter Link. Der Kerl ist frustriert und nicht einmal höflich (hat den Kerl einmal kontaktiert, wegen einiger eindeutig missbräuchlicher Punkte, die ihm egal waren). Aber ja, Refactoring ist eindeutig schwierig (abhängig von der Codegröße), und man muss beim ersten Design zweimal überlegen.
Reder

16
Hier stellen wir also fest, dass Microsoft schlecht darin ist, unglaublich schwierige Aufgaben zu lösen , während die Eclipse Foundation besser ist? Ich programmiere in VS für Projekteinschränkungen, aber wenn ich eine Variable umbenennen muss, starte ich Eclipse nur dafür ...
Zac

10
Warum ist dies eine akzeptierte Antwort? Das Parsen von C ++ - Code in eine semantisch sinnvolle Form muss von einem Compiler durchgeführt werden. MS besitzt offensichtlich den Compiler, der in ihrer IDE enthalten ist. Warum nicht denselben Parsing-Code verwenden? Es ist wirklich egal, wie schwer das Parsen ist, weil sie es sowieso schon tun.
Joe

4
Das ist eine schlechte Verbindung, da der Autor keine Kenntnisse über C ++ hat. Zum Beispiel kennt er RVO nicht. Refactoring-Tools sind recht einfach, wenn Sie die Clang-API verwenden möchten, bei der die Autoren bereits die ganze Hölle der Überlastungsauflösung durchlaufen haben. Das Problem ist, dass MSVS eine solche API fehlt.
polkovnikov.ph

2
Microsoft Visual Studio 2015 kann einen Teil des C ++ - Codes umbenennen.
Aeroson

11

Ich bin mir nicht sicher, warum das so ist, aber es gibt Tools von Drittanbietern, die helfen. Zum Beispiel evaluiere ich gerade Visual Assist X (von Whole Tomato). Wir verwenden auch Visual Studio 2005.


Visual Assist X ist ziemlich gut und macht den Job normalerweise ziemlich gut. Wenn Sie jedoch alle Vorlagen-Metaprogramme darauf haben, kann es einen Teil Ihres Codes in die Hände werfen.
Doug T.

2
Das ist richtig. Ich habe festgestellt, dass es nicht mehr als ein paar Ebenen von Vorlagen sehr gut verarbeitet (wie bei der Arbeit mit Boost).
Brian


4

Fühlen Sie sich nicht schwer getan, es ist auch nicht in VB.Net verfügbar :)

C ++ ist eine HARD-Sprache, die im Vergleich zu C # analysiert werden muss (VB ist auch schwierig zu sagen, was eine Codezeile in einem VIEL größeren Kontext tut, wenn Sie nicht "Option Explicit" und "Option Strict" aktiviert haben).

Vermutlich könnte es etwas mit der "Schwierigkeit" zu tun haben, es bereitzustellen.

PS Ich habe meine Antwort als Community-Wiki markiert, weil ich weiß, dass sie keine nützlichen Informationen enthält.


4

Eclipse führt nur wenige C ++ - Refactorings durch, einschließlich 'Umbenennen'. Schauen Sie sich diese Frage hier auf StackOverflow an.

Es ist auch möglich, Microsoft Compiler mit Eclipse zu verwenden. Schauen Sie sich hier .

Probieren Sie Eclipse aus und prüfen Sie, ob es zu Ihnen passt.


3

Es gibt viel Fud und Verwirrung um dieses Thema. Dieses erstaunliche Youtube-Video sollte klarstellen, warum C ++ - Refactoring schwierig ist: https://www.youtube.com/watch?v=mVbDzTM21BQ

tl; dr Google überarbeitet die gesamte C ++ - Codebasis mit 100 Millionen Zeilen mithilfe eines Compilers (Clang + LLVM), der den Zugriff auf das Zwischenformat ermöglicht.

Unterm Strich werden hier Dritte geschraubt, es gibt keine realistische Möglichkeit für sie, VS C ++ umzugestalten, es sei denn, MS gibt Zwischenergebnisse auf die gleiche Weise aus. Wenn Sie es aus der Perspektive des Programmierproblems betrachten, ist dies offensichtlich: Um VS C ++ umzugestalten, müssen Sie in der Lage sein, C ++ genau so zu kompilieren, wie VS es mit denselben Fehlern, Einschränkungen, Fehlern, Hacks, Verknüpfungen, Problemumgehungen usw. Die üblichen Verdächtigen wie Coderush und Resharper haben nicht das Budget für diese Art von Wahnsinn, obwohl sie es anscheinend versuchen, aber es sind Jahre vergangen ...

http://www.jetbrains.com/resharper-cpp/

Update 2016: Resharper leistet jetzt gute Arbeit bei C ++ refactor. Einschränkungen gelten ausschließlich für große / gigantische Projekte.



1

Ich benutze Visual Assist X mit Visual Studio seit ungefähr anderthalb Jahren. Es ist ein unglaubliches Tool, das Ihnen bei normalem C ++ - Code sehr hilft, aber bei Vorlagencode nicht sehr gut funktioniert. Wenn Sie beispielsweise über ein ausgeklügeltes richtlinienbasiertes Vorlagendesign verfügen, kann es Ihre Variablen nicht umbenennen, und das Projekt wird nicht mehr kompiliert.



0

Ich möchte darauf hinweisen, dass Qt Creator (eine C ++ - IDE, die mit VC ++ - Bibliotheken und Buildsystemen kompatibel ist) eine Symbolumbenennung bietet, die sehr gut funktioniert:

Sie können Symbole in allen Dateien eines Projekts umbenennen. Wenn Sie eine Klasse umbenennen, können Sie auch Dateinamen ändern, die dem Klassennamen entsprechen.

Qt Creator - Refactoring: Symbole umbenennen

Die Umbenennungsfunktion von Qt Creator bietet Ihnen eine Liste der gefundenen Symbolreferenzen und die Möglichkeit, diese auszuschließen, bevor Sie das Ersetzen durchführen. Wenn also eine Symbolreferenz falsch ist, können Sie sie ausschließen.

Qt Creator Refactor ersetzen

Das Umbenennen von C ++ - Symbolen ist also möglich. Wenn ich von Qt Creator zu VS komme, spüre ich Ihren Schmerz bis zu dem Punkt, an dem ich darüber nachgedacht habe, bereits vorhandene VS-Projekte von beträchtlicher Größe auf die Verwendung von Qt Creator umzustellen.

Ich kaufe mir nicht das Argument, dass dies in C ++ besonders schwierig ist. Zusätzlich zu der Tatsache, dass es in Qt Creator bereits sehr gut funktioniert, gibt es die Tatsache, dass der Compiler und der Linker Symbole finden und abgleichen können: Wenn dies nicht möglich wäre, könnten Sie Ihre Anwendung nicht erstellen.

In der Tat haben Sprachen wie Python, die dynamisch typisiert werden, auch Umbenennungswerkzeuge. Wenn Sie ein solches Tool für eine Sprache erstellen können, in der es keine expliziten Verweise auf den Variablentyp gibt, können Sie dies definitiv für C ++ tun.

Ein typisches Beispiel:

... Rope, eine Python-Refactoring-Bibliothek ... Ich habe es für ein paar Umbenennungen versucht, und das hat definitiv wie erwartet funktioniert.

Stapelüberlauf - Welche Refactoring-Tools verwenden Sie für Python?


-3

Trotz der Kommentare aller Experten bin ich völlig anderer Meinung, dass das Problem der Refactoring-Unterstützung etwas mit der C ++ - Sprachsemantik oder einer anderen Sprachsemantik zu tun hat. Außer der Compiler-Builder selbst entscheidet sich aus eigenen Gründen oder Einschränkungen nicht dafür, einen im ersten Fall zu implementieren.

Und Beleidigung nicht zu nehmen, aber es tut mir leid zu sagen, Herr jsb, der obige Link, den Sie zur Unterstützung Ihres Falls (dh von yosefk) über C ++ - Defekte bereitgestellt haben, kommt überhaupt nicht in Frage. Es ist eher so, als würden Sie "Los Angeles" Anweisungen geben, wenn jemand nach "San Franisco" fragt.

Meiner Meinung nach ist das Problem der Refactoring-Schwierigkeit für eine bestimmte Sprache eher so, als würde man einen Finger auf die Sprachintegrität selbst legen. Besonders für Sprachen, die manchmal nur Schmerzen bereiten ... wenn es um die Deklaration und Verwendung von Variablen geht. :) Okay! Sag mir, warum verlierst du den Überblick über einen Knoten in einem Knotenbaum ... wie? Was es also mit jeder Sprache macht, sei es so einfach wie Code auf Maschinenebene. Sie wissen, dass Ihr VS-Compiler leicht erkennen kann, ob eine Variable oder Routine toter Code ist. Verstanden?

Informationen zur Entwicklung von Tools von Drittanbietern. Ich denke, Compiler-Anbieter können es viel einfacher und effektiver implementieren, wenn sie jemals ein Drittanbieter-Tool benötigen, das die gesamte Parsing-Datenbank duplizieren muss, um damit umzugehen. Heutzutage kann der Compiler Code auf Maschinencodeebene sehr effizient optimieren, und ich höre hier, dass es schwierig ist zu sagen, wie eine Variable zuvor verwendet wurde. Ich nehme an, Sie haben der inneren Arbeitsweise des Compilers keine wirkliche Aufmerksamkeit geschenkt. In welcher Datenbank wird es aufbewahrt?

Und sicher ist es die gleiche Datenbank, die IDE für all diese ähnlichen Zwecke verwendet. In der Vergangenheit war der Compiler nur eine separate Entität und die IDE nur ein Texteditor mit einer gewissen Spezialisierung. Mit der Zeit wird die Lücke zwischen Compiler und IDE-Editor jedoch kleiner und es wird direkt mit der Arbeit an einer ähnlich analysierten Datenbank begonnen. Dies ermöglicht es, all diese Intellisense- und Refactoring- oder andere syntaxbezogene Probleme effektiver zu behandeln. Bei allen vorkompilierten Dingen und JIT ist das Kompilieren dieser Lücke fast fahrlässig. Daher ist es fast sinnvoll, dieselbe Datenbank für beide Zwecke zu verwenden, da sonst Ihr Speicherbedarf aufgrund von Duplikaten steigt.

Sie alle sind Programmierer - ich nicht! Und ihr scheint Schwierigkeiten zu haben, zu visualisieren, wie Refactoring für C ++ oder eine andere Sprache implementiert werden kann, die ich nicht verstehen kann. Es geht nur um etwas, für das man sich mehr Mühe geben muss, je nachdem, wie schwer eine Person ist, die man schiebt.

Auf jeden Fall VS eine nette IDE, besonders wenn es um C # geht.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.