¿Por qué Visual C ++ carece de funcionalidad de refactorización?


78

Al programar en C ++ en Visual Studio 2008, ¿por qué no hay una funcionalidad como la que se ve en el menú de refactorización cuando se usa C #?

Uso Rename constantemente y realmente lo extrañas cuando no está allí. Estoy seguro de que puede obtener complementos que ofrecen esto, pero ¿por qué no está integrado en el IDE cuando se usa C ++? ¿Se debe esto a algún error en la forma en que se debe analizar C ++?


1
La refactorización es difícil para C ++, pero creo que VS debería agregar un Rename alltipo de funcionalidad como la de Xcode C ++.
Dylan Czenski

Respuestas:


70

La sintaxis y la semántica de C ++ hacen que sea increíblemente difícil implementar correctamente la funcionalidad de refactorización. Es posible implementar algo relativamente simple para cubrir el 90% de los casos, pero en el 10% restante de los casos, esa solución simple romperá horriblemente su código al cambiar cosas que nunca quiso cambiar.

Lea http://yosefk.com/c++fqa/defective.html#defect-8 para una breve discusión de las dificultades con las que tiene que lidiar cualquier código de refactorización en C ++.

Microsoft evidentemente ha decidido apostar por esta característica particular para C ++, dejando que los desarrolladores externos hagan lo que puedan.


8
No, es un vínculo bastante malo. El chico está frustrado, y ni siquiera es cortés (contacté al chico una vez, sobre algunos puntos claramente abusivos, no le importaba). Pero sí, la refactorización es claramente difícil (dependiendo del tamaño del código) y hay que pensarlo dos veces en el diseño inicial.
lea el

16
Entonces, aquí estamos diciendo que Microsoft es pobre en la resolución de tareas increíblemente difíciles , mientras que la Fundación Eclipse es mejor. Programando en VS para las restricciones del proyecto, pero cuando necesito cambiar el nombre de una variale, lanzo Eclipse solo para esto ...
Zac

10
¿Por qué es esta una respuesta aceptada? El análisis del código C ++ en una forma semánticamente significativa TIENE que hacerlo un compilador. MS obviamente posee el compilador que se incluye con su IDE. ¿Por qué no utilizar el mismo código de análisis? Realmente no importa lo difícil que sea el análisis, porque de todos modos ya lo hacen.
Joe

4
Ese es un enlace incorrecto, porque el autor no tiene conocimientos de C ++. Por ejemplo, no conoce RVO. Las herramientas de refactorización son bastante sencillas si está preparado para usar la API de Clang, donde los autores ya han pasado por todo ese infierno de resolución de sobrecarga. El problema es que MSVS carece de dicha API.
polkovnikov.ph

2
Microsoft Visual Studio 2015 puede refactorizar y cambiar el nombre de parte del código C ++.
aeroson

11

No estoy seguro de por qué es así, pero existen herramientas de terceros que ayudan. Por ejemplo, ahora mismo estoy evaluando Visual Assist X (de Whole Tomato). También estamos usando Visual Studio 2005.


Visual Assist X es bastante bueno y normalmente hace el trabajo bastante bien. Sin embargo, si obtiene toda la metaprogramación de plantillas, puede echar mano a parte de su código.
Doug T.

2
Es verdad. Me di cuenta de que no maneja muy bien más de unas pocas capas de plantillas (como cuando se trabaja con Boost).
Brian


4

No se sienta mal, tampoco está disponible en VB.Net :)

C ++ es un lenguaje DIFÍCIL de analizar en comparación con C # (VB también a menos que haya activado "Option Explicit" y "Option Strict", es difícil saber exactamente qué está haciendo cualquier línea de código fuera de un contexto MUCHO más grande).

Supongo que podría tener algo que ver con la "dificultad" de proporcionarlo.

PD: Marqué mi respuesta como wiki de la comunidad porque sé que no proporciona ninguna información útil.


4

Eclipse hace pocas refactorizaciones de C ++, incluido 'renombrar'. Consulte esta pregunta aquí en StackOverflow.

También es posible utilizar el compilador de Microsoft con Eclipse. Mira aquí .

Pruebe Eclipse y vea si le queda bien.


3

Hay mucha confusión y confusión en torno a este tema. Este increíble video de YouTube debería aclarar por qué la refactorización de C ++ es difícil: https://www.youtube.com/watch?v=mVbDzTM21BQ

tl; dr Google refactoriza toda su base de código C ++ de 100 millones de líneas utilizando un compilador (Clang + LLVM) que permite acceder a su formato intermedio.

En pocas palabras, los terceros están jodidos aquí, no hay una forma realista de refactorizar VS C ++ a menos que MS produzca resultados intermedios de la misma manera. Si lo piensa desde la perspectiva del problema de programación, esto es obvio: para refactorizar VS C ++ debe poder compilar C ++ exactamente de la misma manera que lo hace VS con los mismos errores, limitaciones, fallas, hacks, atajos, soluciones alternativas, etc. .Los sospechosos habituales como Coderush y Resharper no tienen presupuesto para ese tipo de locura aunque al parecer lo están intentando pero ya han pasado años ...

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

Actualización 2016: Resharper ahora hace un trabajo decente en la refactorización de C ++. Las limitaciones son puramente para proyectos grandes / gigantes.



1

He estado usando Visual Assist X con Visual Studio durante aproximadamente un año y medio. Es una herramienta increíble que te ayuda mucho con el código C ++ ordinario, pero no funciona muy bien en el código con plantilla. Por ejemplo, si tiene un diseño de plantilla sofisticado basado en políticas, no sabrá cómo cambiar el nombre de sus variables y el proyecto ya no se compilará.



0

Me gustaría señalar que Qt Creator (un IDE de C ++ que es compatible con las bibliotecas y el sistema de compilación de VC ++) proporciona un cambio de nombre de símbolos que funciona muy bien:

Puede cambiar el nombre de los símbolos en todos los archivos de un proyecto. Cuando cambia el nombre de una clase, también puede cambiar los nombres de archivo que coinciden con el nombre de la clase.

Qt Creator - Refactorización: cambio de nombre de símbolos

La función de cambio de nombre de Qt Creator le brinda una lista de las referencias de símbolos que encontró y la oportunidad de excluir cualquiera de ellos antes de realizar el reemplazo. Entonces, si obtiene una referencia de símbolo incorrecta, puede excluirla.

Reemplazo de Qt Creator Refactor

Por tanto, es posible cambiar el nombre de los símbolos de C ++. Al llegar a VS de Qt Creator, siento su dolor, hasta el punto en que he considerado convertir proyectos VS preexistentes de tamaño considerable para usar Qt Creator en su lugar.

No compro el argumento de que esto es específicamente difícil en C ++. Además del hecho de que ya funciona muy bien en Qt Creator, existe el hecho de que el compilador y el enlazador pueden encontrar y hacer coincidir símbolos: si eso no fuera posible, no podría construir su aplicación.

De hecho, los lenguajes como Python que se escriben dinámicamente también tienen herramientas de cambio de nombre. Si puede crear una herramienta de este tipo para un lenguaje donde no hay referencias explícitas al tipo de variable, definitivamente puede hacerlo para C ++.

Caso en punto:

... Rope, una biblioteca de refactorización de Python ... Lo probé para algunos cambios de nombre, y definitivamente funcionó como se esperaba.

Stack Overflow: ¿Qué herramientas de refactorización usas para Python?


-3

Bueno, a pesar de los comentarios de todos ustedes, los expertos, estoy totalmente en desacuerdo con que el problema del soporte de refactorización tenga algo que ver con la semántica del lenguaje C ++ o cualquier semántica del lenguaje para el caso. Excepto que el constructor del compilador por sí mismo no elige implementar uno en el primer caso debido a sus propias razones o restricciones, sean cuales sean.

Y no debe ofenderse, pero lamento decirle Sr. jsb, el enlace anterior que proporcionó para respaldar su caso (es decir, de yosefk) sobre el defecto de C ++ está totalmente fuera de discusión. Es más como si estuvieras dando dirección a "Los Ángeles" cuando alguien preguntó por "San Franisco".

En mi opinión, plantear el problema de la dificultad de refactorización para cierto idioma es más como poner un dedo en la integridad del idioma en sí. Especialmente para lenguajes que a veces son simplemente dolorosos ... cuando se trata de su declaración y uso de variables. :) ¡Bueno! dime cómo es que pierdes la pista de algún nodo dentro de un árbol de nodos ... ¿eh? Entonces, ¿qué puede hacer con cualquier lenguaje, ya sea tan simple como el código de nivel de máquina? Sabes que tu compilador VS puede detectar fácilmente si alguna variable o rutina es código muerto. ¿Entendido mi punto?

Acerca del desarrollo de herramientas de terceros. Creo que los proveedores de compiladores pueden implementarlo de manera mucho más fácil y efectiva si alguna vez quisieran usar una herramienta de terceros que tendrá que duplicar toda la base de datos de análisis para manejarla. Hoy en día, el compilador puede optimizar el código de manera muy eficiente a nivel de código de máquina y escucho aquí que es difícil saber cómo se usa alguna variable anteriormente. Supongo que no has prestado mucha atención al funcionamiento interno del compilador. Qué base de datos guarda.

Y seguro que es casi la misma base de datos que usa IDE para todos esos propósitos similares. En tiempos anteriores, el compilador era solo una entidad separada y el IDE solo un editor de texto con cierta especialización, pero a medida que pasa el tiempo, la brecha entre el compilador y el editor IDE se reduce y comienza a trabajar directamente en una base de datos analizada similar. Lo que hace posible manejar todos esos intellisense y refactorización u otros problemas relacionados con la sintaxis de manera más efectiva. Con todas las cosas precompiladas y compilando JIT, esta brecha es casi negligente. Por lo tanto, casi tiene sentido usar la misma base de datos para ambos propósitos o, de lo contrario, su demanda de memoria aumentará debido a la duplicación.

Todos ustedes son programadores, ¡yo no! Y ustedes parecen tener dificultades para visualizar cómo se puede implementar la refactorización para C ++ o cualquier lenguaje que no pueda comprender. Se trata simplemente de algo en lo que tienes que esforzarte más por algo menos, dependiendo de qué tan pesada sea la persona a la que intentas presionar.

De todos modos VS un buen IDE, especialmente cuando se trata de C #.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.