web-dev-qa-db-fra.com

Pourquoi Visual C++ manque-t-il de fonctionnalités de refactor?

Lors de la programmation en C++ dans Visual Studio 2008, pourquoi n'y a-t-il pas de fonctionnalité semblable à celle proposée dans le menu de refactorisation lors de l'utilisation de C #?

J'utilise Renommer constamment et vous le manquez vraiment quand il n'est pas là. Je suis sûr que vous pouvez obtenir des plugins offrant cela, mais pourquoi n'est-il pas intégré dans IDE lors de l'utilisation de C++? Est-ce dû à un piège dans la façon dont C++ doit être analysé?

78
xyz

La syntaxe et la sémantique de C++ en font incroyablement difficile pour implémenter correctement la fonctionnalité de refactoring. Il est possible d'implémenter quelque chose d'assez simple pour couvrir 90% des cas, mais dans les 10% restants, cette solution simple va casser horriblement votre code en modifiant des choses que vous n'avez jamais voulu changer.

Lisez http://yosefk.com/c++fqa/defective.html#defect-8 pour une brève discussion des difficultés que tout code de refactoring en C++ doit résoudre.

Microsoft a évidemment décidé de miser sur cette fonctionnalité particulière pour C++, en laissant aux développeurs tiers le soin de faire ce qu'ils peuvent.

70
JSBձոգչ

Je ne sais pas pourquoi c'est comme ça, mais des outils tiers existent pour vous aider. Par exemple, je suis en train d’évaluer Visual Assist X (Whole Tomato). Nous utilisons également Visual Studio 2005.

11
Brian

devexpress fournit un complément Refactor! pour C++ pour VS2005 et VS2008.

5
mem64k

Ne vous sentez pas harcelé, il n'est pas disponible dans VB.Net non plus :)

C++ est un langage HARD à analyser comparé à C # (VB aussi, à moins que "Option Explicit" et "Option Strict" ne soient activés, il est difficile de dire exactement quelle ligne de code fait dans un contexte BEAUCOUP plus grand).

Cela pourrait avoir quelque chose à voir avec la "difficulté" de le fournir.

P.S. J'ai marqué ma réponse en tant que wiki de communauté parce que je sais que cela ne fournit aucune information utile.

4
Binary Worrier

Eclipse fait peu de refactorings c ++, y compris 'renommer' Découvrez cette question ici sur StackOverflow.

Il est également possible d'utiliser le compilateur Microsoft avec Eclipse. Découvrez ici .

Essayez Eclipse et voyez si cela vous convient.

4
fukanchik

Il y a beaucoup de confusion et de confusion autour de cette question. Cette incroyable vidéo sur youtube devrait expliquer pourquoi le refactoring C++ est difficile: https://www.youtube.com/watch?v=mVbDzTM21BQ

tl; dr Google refonte leur base de code C++ de 100 millions de lignes en utilisant un compilateur (Clang + LLVM) qui permet d’accéder à son format intermédiaire.

En fin de compte, les tiers sont vissés ici, il n’existe aucun moyen réaliste de refactoriser VS C++ à moins que MS ne produise des résultats intermédiaires de la même manière. Si vous y réfléchissez du point de vue du problème de programmation, ceci est évident: pour refactoriser VS C++, vous devez être capable de le compiler exactement de la même manière que VS le fait avec les mêmes bugs, limitations, défauts, hacks, raccourcis, solutions de contournement, etc. Les suspects habituels, tels que Coderush et Resharper, ne disposent pas du budget nécessaire pour ce genre de démence, bien qu’apparemment ils essaient, mais cela fait des années ...

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

Mise à jour 2016: Resharper fait maintenant un travail décent chez le refactor C++. Les limitations concernent uniquement les projets volumineux/gigantesques.

3
Dirk Bester

MS a finalement fait cela: https://channel9.msdn.com/Shows/C9-GoingNative/GoingNative-33-C-Refactoring-in-Visual-Studio-2015#time=04m37s

Ils ont commencé à le faire il y a environ 10 ans. Je me rappelle avoir regardé ms channel9 il y a longtemps.

2
Stepan Yakovenko

J'utilise Visual Assist X avec Visual Studio depuis environ un an et demi. C'est un outil incroyable qui vous aide beaucoup avec du code C++ ordinaire, mais il ne fonctionne pas très bien avec du code basé sur des modèles. Par exemple, si vous avez une conception de modèle sophistiquée basée sur des règles, elle ne saura pas comment renommer vos variables et le projet ne compilera plus.

1
Liviu

Installez le plugin qui vous permet cette fonctionnalité: https://visualstudiogallery.msdn.Microsoft.com/164904b2-3b47-417f-9b6b-fdd35757d194

0
support_ms

Je voudrais signaler que Qt Creator (un C++ IDE compatible avec les bibliothèques VC++ et le système de construction) fournit un renommage de symbole qui fonctionne très bien:

Vous pouvez renommer les symboles de tous les fichiers d'un projet. Lorsque vous renommez une classe, vous pouvez également modifier les noms de fichiers correspondant au nom de la classe.

Qt Creator - Refactoring: Renommer les symboles

La fonctionnalité de changement de nom de Qt Creator vous fournit une liste des références de symboles trouvées et une possibilité d’exclure n’importe laquelle d’entre elles avant d’effectuer le remplacement. Ainsi, si une référence de symbole erronée est obtenue, vous pouvez l'exclure.

 Qt Creator Refactor Replace

Donc, renommer un symbole C++ est possible. En venant de Qt Creator, je ressens votre douleur, au point que j’ai envisagé de convertir des projets VS déjà existants de taille considérable pour utiliser Qt Creator à la place.

Je n'accepte pas l'argument selon lequel c'est spécifiquement difficile en C++. En plus du fait que cela fonctionne déjà très bien dans Qt Creator, il existe le fait que le compilateur et l'éditeur de liens peuvent trouver et faire correspondre des symboles: si cela n'était pas possible, vous ne pourriez pas créer votre application.

En fait, les langages tels que Python qui sont typés dynamiquement ont également des outils de changement de nom. Si vous pouvez créer un tel outil pour un langage ne contenant aucune référence explicite au type de variable, vous pouvez le faire pour C++.

Exemple:

... Rope, une bibliothèque de refactoring python ... Je l'ai essayée quelques fois, et cela a fonctionné comme prévu.

Débordement de pile - Quels outils de refactoring utilisez-vous pour Python?

0
Terrabits