2008-12-12 8 views
75

Al programar en C++ en Visual Studio 2008, ¿por qué no hay una funcionalidad como la que se ve en el menú refactor al usar C#?¿Por qué Visual C++ carece de funcionalidad refactor?

Yo uso Cambie el nombre constantemente y realmente lo extraño 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++? ¿Esto se debe a algunos errores en la forma en que C++ debe ser analizado?

+0

refactorizar es difícil para C++ pero me parece que VS debería agregar un tipo de funcionalidad 'Renombrar todo' como la de Xcode C++. –

Respuesta

69

La sintaxis y la semántica de C++ lo hacen increíblemente difícil para 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 casos esa solución simple romperá de manera horrible su código al cambiar las cosas que nunca quiso cambiar.

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

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

+2

+1: Excelente enlace, haz que se marque el libro, gracias. –

+8

No, enlace bastante malo de hecho. El chico está frustrado, y ni siquiera es cortés (contactó con el chico una vez, sobre algunos puntos de abuso, no le importó). Pero sí, la refacturación es claramente difícil (dependiendo del tamaño del código), y uno debe pensar dos veces en el diseño inicial. – reder

+16

Entonces, ¿estamos diciendo que Microsoft es pobre en la solución de tareas increíblemente difíciles, mientras que la Fundación Eclipse es mejor? Yo programo en VS para las limitaciones del proyecto, pero cuando necesito cambiar el nombre de una variale, ejecuto Eclipse solo para esto ... – Zac

11

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

+0

Visual Assist X es bastante bueno y generalmente hace el trabajo bastante bien. Sin embargo, si obtienes todo el meta-programa de la plantilla en él, puede echar mano de algo de tu código. –

+2

Eso es verdad. Me di cuenta de que no maneja muy bien algunas plantillas de plantillas (como cuando se trabaja con Boost). – Brian

4

No se sienta duro hecho-por-, no está disponible en VB.Net bien :)

C++ es un lenguaje de dificultar su análisis en comparación con C# (VB también, a menos que haya activado "Opción explícita" y "Opción estricta", es difícil decir exactamente qué hace una línea de código de un contexto MUCHO más grande.

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

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

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 ordinario de C++, pero no funciona muy bien en el código de 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á.

-3

Bueno, a pesar de los comentarios de todos los expertos, estoy totalmente en desacuerdo con que la cuestión de la compatibilidad de refactorización tenga algo que ver con la semántica del lenguaje C++ o cualquier semántica de lenguaje para ese asunto. Excepto que el constructor de compiladores ellos mismos no eligen implementar uno en primer caso debido a sus propios motivos o restricciones, tal vez sean.

Y la ofensa no se debe tomar pero lamento decir Mr jsb el enlace anterior que proporcionó para apoyar su caso (es decir, de yosefk) sobre el defecto de C++ está totalmente fuera de toda duda. Es más como si le dieras dirección a "Los Ángeles" cuando alguien le preguntó por "San Francisco".

En mi opinión, aumentar el problema de la dificultad de refactorización para un determinado idioma es más como levantar un dedo sobre la integridad del lenguaje. Especialmente para lenguajes que a veces solo son 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é hacer con cualquier idioma ya sea tan simple como el código de nivel de la máquina. Usted sabe que su compilador VS puede detectar fácilmente si alguna variable o rutina es un código muerto. Tengo mi punto?

Acerca del desarrollo de una herramienta de terceros. Creo que los proveedores de compiladores pueden implementarlo de forma mucho más fácil y efectiva si alguna vez quisieran con 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 estoy escuchando aquí que es difícil saber cómo se usa alguna variable anteriormente. Usted no ha prestado ninguna atención real al funcionamiento interno del compilador, supongo. Que base de datos guarda dentro

Y seguro que es la misma base de datos que IDE utiliza para todos esos propósitos similares. En tiempo anterior el compilador era solo una entidad separada e 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 disminuye y comenzó a trabajar directamente en una base de datos analizada similar. Lo que hace que sea posible manejar de manera más efectiva todas esas cuestiones relacionadas con intellisense y refactorización u otras relacionadas con la sintaxis. Con todas las cosas de precompilación y compilación JIT, esta brecha es casi negligente. Por lo tanto, tiene sentido usar la misma base de datos para ambos propósitos, de lo contrario, la demanda de memoria aumentará debido a la duplicación.

Todos ustedes son programadores - ¡No lo soy! Y ustedes parecen estar teniendo dificultades para visualizar cómo se puede implementar la refactorización para C++ o cualquier lenguaje que no pueda comprender. Todo se trata de algo por lo que tienes que esforzarte un poco menos dependiendo de qué tan pesada sea la persona que intentes empujar.

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

+10

"¿Tengo mi punto?" - no, realmente no. – AakashM

+2

No escucho rangos llenos de errores. – Kupiakos

3

Eclipse realiza algunas refactorizaciones de C++, incluido 'rename'. Mira esto question aquí en StackOverflow.

También es posible usar el compilador de Microsoft con Eclipse. Consulte here.

Pruebe Eclipse y vea si se ajusta a sus necesidades.

3

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

tl; dr Google refactors su totalidad de 100 millones de línea de base de código C++ mediante el uso de un compilador (Sonido metálico + LLVM) que permite el acceso a su formato intermedio.

En pocas palabras, los terceros están atornillados aquí, no hay una forma realista para que refactoricen VS C++ a menos que MS emita resultados intermedios de la misma manera. Si lo piensas desde la perspectiva del problema de programación esto es obvio: para refactorizar VS C++ debes poder compilar C++ exactamente de la misma manera que VS lo hace con los mismos errores, limitaciones, fallas, ataques, atajos, soluciones, etc. . los sospechosos habituales, como CodeRush y ReSharper no tienen el presupuesto para ese tipo de locura aunque aparentemente están tratando, pero ha sido años ...

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

actualización 2016: ReSharper ahora hace un trabajo decente en Refactor de C++ Las limitaciones son solo para proyectos grandes/gigantescos.

Cuestiones relacionadas