¿Existe una herramienta de refactorización C ++ que funcione? [cerrado]

161

¿Alguien conoce una herramienta de refactorización con todas las funciones para C ++ que funcione de manera confiable con bases de código grandes (unas 100.000 líneas)?

Intenté lo que puedo encontrar una y otra vez en los últimos años: SlickEdit, Eclipse CDT. No todos eran utilizables en absoluto.

RESUMEN : Me tomé el tiempo y evalué "Visual Assist X" y "Refactor for C ++". Ambos tienen algunas características impresionantes, pero ambos están lejos de ser perfectos. Extraer un gran bloque de código por lo general no se realiza de manera satisfactoria sin modificaciones manuales, y por lo tanto no vale la pena.

"Visual Assist X" tiene características agradables, como una autocompletación mucho más completa, etc. Pero genera muchos parpadeos y se ralentiza mucho en ciertos puntos.

Por lo tanto, en mi opinión, la respuesta es: "No, no hay una herramienta de refactorización lista para producción para C ++"

ACTUALIZACIÓN Marzo de 2015 En cuanto a la respuesta de hdoghmens hoy probé Resharper para C ++. Su enlace https://www.jetbrains.com/resharper/ no dice nada sobre C ++. Pero encontré Resharper C ++ que se anunció hace más de un año aquí:

https://www.jetbrains.com/resharper/features/cpp.html

Lo probé con VC2010 usando una base de código de 20 MB.

Prueba 1: Método de extracción: produce una excepción Resharper. No se cambió el código fuente.

Prueba 2: Método de extracción con una fuente diferente: funciona bien

Prueba 3: Cambiar la firma de la función extraída: Resultados en código C ++ roto:

bool myclass::do_work123(<unknown long Color>int& Filled*&, long, int&)

Quizás por eso C ++ no está en la lista de la página principal.

En mi opinión, la respuesta a esta pregunta sigue siendo "NO" .

ADAIR SUAVE ROJA
fuente
11
Favorito este. El problema con C ++ es su sintaxis muy compleja y sensible al contexto. Sin analizar realmente la fuente completa, no puede estar seguro de lo que significa un identificador.
DevSolar
Ver también: stackoverflow.com/questions/249827/... pero no tienen mucho que ofrecer
dmckee --- ex-moderador gatito
44
Eclipse realmente funciona bastante bien, solo necesita permitirle usar más memoria editando eclipse.ini
n0rd
3
Si todavía está monitoreando las herramientas de refactorización para C ++, considere que en JetBrains estamos trabajando actualmente en el soporte de C ++ en ReSharper y en un IDE C ++ multiplataforma separado
Jura Gorohovsky
1
@ RED ​​SOFT ADAIR eres famoso. Mira esto youtu.be/RT46MpK39rQ?t=1611
George C.

Respuestas:

38

Encuentro Visual Assist X con Visual Studio muy útil. Otra opción es Refactor para C ++ .

Gant
fuente
8
Desafortunadamente, Refactor for C ++ no funciona bien (si es que lo hace) con bases de código grandes.
Daniel Rose
1
¿Qué sucede específicamente con Refactor para C ++ y bases de código grandes?
Ira Baxter
2
@IraBaxter Simplemente está roto. Las opciones de refactorización no aparecen o no se completan. Hay mensajes de error extraños o ninguno en absoluto.
Daniel Rose
44
Refactor para C ++ no funciona bien incluso para bases de código pequeñas, está roto e inutilizable en absoluto.
kovarex
3
@Nils: ¿puede proporcionar un ejemplo específico de lo que no entiende?
Ira Baxter
41

Visual Assist y Visual Studio facilitan mucho el manejo de grandes bases de código. La asistencia visual es buena para rastrear cómo se usa una clase o miembro y es más efectiva para renombrarla sin falsos positivos que buscar y reemplazar.

Tom Leys
fuente
23

Espero que el sonido metálico cambie significativamente el panorama de las herramientas de refactorización de C ++ en los próximos años. Es un compilador modular de código abierto que expone una API para analizar y analizar semánticamente el código C ++. Los IDE y otras herramientas podrán usar esta API en lugar de hacer el difícil trabajo de escribir su propio analizador semántico y analizador.

Google ya hizo una herramienta de refactorización a gran escala usando clang .

HighCommander4
fuente
2
¿Pero hay algún resultado que pueda usar un simple mortal fuera de Google?
Jan Hudec
1
@ JanHudec: Mira el tutorial vinculado desde aquí: comments.gmane.org/gmane.comp.compilers.clang.devel/23203
HighCommander4
17

Mozilla tiene su propia herramienta de refactorización llamada Pork ( Wiki , Developer Wiki ). Aquí está el blog del desarrollador detrás de Pork. Por lo que he leído, el cerdo se utilizó con éxito en refactorizaciones en Mozilla.

El cerdo debería ayudar si vienes de * nix land, para Visual Studio también recomiendo Visual Assist.

Cristian Adam
fuente
9

Nuestro kit de herramientas de reingeniería de software DMS es un motor de transformación diseñado para llevar a cabo transformaciones complejas en grandes cuerpos de código, incluido C ++. Se ha utilizado para realizar cambios confiables en los sistemas de millones de líneas de código. Funciona mediante el uso de transformadores y analizadores de idiomas con precisión de compilador.

Tiene un analizador completo de C ++ con resolución de nombre y tipo, crea AST de código, puede aplicar transformaciones de procedimiento o de fuente a fuente (con sintaxis de superficie C ++) para revisar esos árboles y regenerar la salida compilable con comentarios conservados. (Edición: 7/1/2011: ahora C ++ 1X en la medida en que entendemos el estándar :)

Se ha utilizado en proyectos de reingeniería a gran escala, incluida la rediseño de componentes C ++ y traducciones 100% totalmente automatizadas entre idiomas. Puedes leer sobre esto en el sitio web.

DMS también se utiliza para construir herramientas de análisis de fuentes arbitrarias. Los ejemplos incluyen detección de clones, cobertura de prueba, diferencia inteligente (comparación de estructuras de código fuente y operaciones de edición abstracta en lugar de líneas con inserción y eliminación simples), etc.

Lo que no es (actualmente) es una herramienta interactiva de refactorización. Creemos que para hacer bien la mayoría de las refactorizaciones, necesita un control profundo y análisis de flujo de datos. DMS tiene una maquinaria genérica para soportar esto, y esa maquinaria se implementa para C, COBOL y Java en este punto, con C ++ como el siguiente en la línea. Este es un trabajo duro. No verá muchas herramientas serias de refactorización de C ++ hasta que este tipo de problema se haya resuelto bien. Primero necesita un analizador de C ++ completo: -}

EDITAR 5/7/2011: Parece que vamos a correr en la versión interactiva. Hemos ganado un SBIR del Departamento de Energía Fase I para investigar cómo hacer esto. Ver http://science.energy.gov/sbir/awards-and-general-stats/fy-2011/phase-i-by-state/?p=1#tx (Busque diseños semánticos en "Texas"). No esperes un resultado apurado; Este es solo el comienzo del programa trianual de tres fases para llegar a una herramienta.

EDITAR 11/08/2011: Primer progreso ... ahora manejamos todas las directivas C ++ 0x y OpenMP.

EDITAR 1/4/2012: hace un análisis de flujo de control total del código C ++.

EDITAR 15/09/2014: ahora tenga el motor de análisis / transformación de front-end C ++ 14 bien en la mano. Incluso cambia el nombre de manera bastante confiable en este punto: -}

Ira Baxter
fuente
No parece haber un enlace para evaluar esta herramienta en su página de descarga semanticdesigns.com/Products/RegisterEval.html ¿Hay una versión de prueba y precios disponibles en este momento para VS2010 o VS2008?
SmacL
Para una herramienta de refactorización, "no esperes un resultado apurado". Nuestra tarea de I + D de Fase I ha terminado y estamos solicitando fondos para la Fase II. Para analizar el DMS y los medios para evaluarlo, comuníquese con la empresa. No es el tipo de cosa que "descarga para evaluar", de la misma manera que Enterprise Oracle no es un elemento de descarga.
Ira Baxter
... DMS puede transformar VS2008 / VS2010, pero no como una herramienta interactiva, y existen limitaciones con respecto a las directivas de preprocesador. (La buena noticia es que creemos que resolvimos un problema importante con estos, y lo aplicaremos en un programa de I + D de Fase II).
Ira Baxter
Gracias por los comentarios, pero no parece el tipo de herramienta que busco. No necesito interactivos, solo algo que pueda realizar transformaciones razonablemente simples en una base de código grande, sin costar un brazo y una pierna, por ejemplo, cambiar el número de parámetros que toma una llamada, cambiar un parámetro de puntero a una referencia. VisualAssist está cerca pero solo necesita ir un poco más allá.
SmacL
3
... el propósito de DMS es habilitar la codificación y la aplicación sin errores de transformaciones de código, ya sea "refactorizando" o "no". Sí, es difícil y aún no hemos llegado. Estamos más cerca de IMNSHO que cualquier otra herramienta que haya visto para C ++, y no hay nada de malo en nuestros fundamentos de herramientas. Lo que queda son problemas desagradables con el preprocesador, la escala de código y el esfuerzo por codificar la semántica de C ++ de manera adecuada para permitir tales transformaciones. Y seré el primero en decir que este es un GRAN proyecto.
Ira Baxter
8

Si está utilizando emacs, intente Xrefactory . Es compatible con la extracción de métodos, renombrar clases / funciones / variables e insertar / eliminar / mover parámetros. También tiene un motor de finalización de código muy bueno / rápido.

bmeric
fuente
6

Actualmente no puedo recomendar ninguna herramienta de refactorización para C ++, ciertamente no para grandes bases de código de 100k líneas y superiores. He estado esperando que esto cambie, como el OP, y espero que algún día haya algo. Temo que el lenguaje en sí tenga que cambiar significativamente antes de que veamos herramientas realmente buenas.

por cierto, ¿SlickEdit ha eliminado sus funciones de refactorización?

quamrana
fuente
El lenguaje hizo cambiar de manera significativa, con el lanzamiento del estándar C ++ 2011. Las complicaciones adicionales hacen que el problema sea más difícil, no más fácil, porque todos los usuarios querrán todas las funciones de lenguaje avanzadas y una capacidad de refactorización: - {
Ira Baxter
2
Habiendo leído recientemente sobre las capacidades de Slickedit, parece que determina la definición correspondiente al uso de un nombre por métodos heurísticos. No realiza una búsqueda "correcta" del nombre de C ++. Esto significa que no puede confiar en que sus transformaciones sean correctas. Si no le importa inspeccionar su trabajo, esto puede estar bien para usted. En paquetes de software realmente grandes, esto probablemente no sea bueno. Mi opinión.
Ira Baxter
3

El kit de herramientas de ingeniería de software DMS hace esto, creo. Es un motor de transformación de código, diseñado para gran escala y maneja C ++. Sin embargo, no tengo idea de lo elegante que es la salida.

Ira Baxter
fuente
1
DMS se ha utilizado para automatizar la reorganización de grandes cuerpos de código C ++. Ver Akers, R., Baxter, I., Mehlich, M., Ellis, B., Luecke, K., Estudio de caso: Reingeniería de modelos de componentes C ++ a través de la transformación automática de programas, tecnología de información y software 49 (3): 275 -291 2007. Disponible del editor
Ira Baxter
No sé qué quiere decir con "salida elegante". El resultado que obtiene de DMS depende claramente de lo que le dé y de las transformaciones que aplique. Si la transformación no toca parte del código, esa parte del código es tan elegante o no como lo era en primer lugar. Si toca el código, la elegancia está determinada por cuán inteligentes son las transformaciones, tal como lo serían los cambios manuales de un codificador. No creo que esto sea elegancia, pero el formato del resultado puede ser impresión de "fidelidad" (el formato original) o un estilo de impresión bonito definido.
Ira Baxter
3

Recomiendo probar rtags si usa emacs y aún no lo ha probado (también hay un paquete para vim disponible). Es una aplicación cliente / servidor basada en clang que indexa el código C / C ++, con estas características incluidas:

  • ir a definición / declaración
  • encuentre todas las referencias, vaya a siguiente / anterior
  • renombrar símbolo
  • integración con los "arreglos" de clang

Decidí probarlo después de ver esta charla que introdujo rtags (y emacs) para mí.

(Tengo que decir que llegué tan lejos solo después de que mi QtCreator no pudo cambiar el nombre de algunos símbolos correctamente, lo que es un obstáculo para mi uso de este gran IDE por ahora)

Además de lo que es compatible con rtags, también necesito algunas características adicionales, como:

  • crear definición de función / prototipo
  • función de extracción
  • crear métodos getter / setter

Para estos, recomiendo usar un paquete semántico-refactor para emacs (no estoy seguro si hay alternativas para vim)

En general, las herramientas basadas en el sonido metálico parecen muy prometedoras. Si está interesado en obtener más información acerca de las herramientas clang para C ++ refactorización, incluso para proyectos con gran base de código, hay algunas grandes conversaciones por Chandler Carruth.

Nikolay Bobovnikov
fuente
2

Seguramente hay que mencionar a Klocwork como una suite de refactorización de código comercial. Parece muy prometedor cuando revisas el video de demostración.

muenalan
fuente
2

El problema son las plantillas C ++. A partir de 2019, no conozco ninguna herramienta de refactorización que admita plantillas de C ++. He intentado VS2019, VisualAssist, Clion, QtCreator.

Considere un ejemplo:

#include <iostream>

struct foo { void print() {} };
struct bar { void print() {} };

template <typename T>
void call_print(T&& v) { v.print(); }

void print() {}

int main()
{
    call_print(foo{});
    call_print(bar{});
    return 0;
}

Si ejecuto Rename Refactoring foo::print, bar::printtambién debería cambiar el nombre automáticamente. Porque están vinculados a través de call_printinstancias de plantilla de función.

aleatorio
fuente
1

Si está utilizando Visual C ++ (Express Edition es gratis), puede usar Visual Assist desde www.wholetomato.com (enlace a las características de refactorización de C ++).

Tiene un período de prueba de 30 días y hemos encontrado que es más rápido y tiene más funciones que el intellisense incorporado en el producto Visual C ++.

JBRWilkinson
fuente
2
Yo no creo que se podría utilizar plugins con la edición express
Yacoby
3
Ciertamente, he tratado de instalar VA con VS C ++ express en el pasado y no funcionó.
quamrana
No puede instalar complementos de Visual Studio en modo aislado (todas las ediciones Express ejecutan el IDE en modo aislado). Si eres estudiante, puedes descargar versiones completas de Visual Studio desde DreamSpark o MSDNAA.
Billy ONeal
1

Si está buscando rediseñar su base de código: MOOSE. Pero esa es una gran colección de herramientas de análisis y reingeniería, no un editor.

Stephan Eggermont
fuente
1

Definitivamente ReSharper último es el camino a seguir. Felicidad garantizada :)

En versión Beta a partir de marzo de 2015.

hdoghmen
fuente
Finalmente lo probé y actualicé mi Pregunta. Gracias de cualquier manera.
RED SOFT ADAIR
Esto es para .NET ... no para C ++.
wcochran
1

CLion se ve muy prometedor.

Descargo de responsabilidad: aún no lo he probado, ya que necesito convertir mis proyectos al formato CMake para poder usarlo.

Adamski
fuente
1

Te recomiendo que pruebes Lattix . Le permite analizar grandes bases de código C / C ++ para descubrir la arquitectura, identificar dependencias problemáticas y rediseñar el código para mejorar la modularidad y reducir la deuda técnica. Lattix también proporciona una serie de algoritmos para ayudar en el proceso de refactorización. Estos algoritmos le ayudan a descubrir cómo mover elementos de una parte de la jerarquía a otra, romper ciclos y mover subsistemas para que se pueda mejorar el acoplamiento y la cohesión de los subsistemas. Aquí están los resultados de Lattix analizando el kernel de Android (1.6 millones de LOC de C / C ++). Divulgación completa: trabajo para Lattix

S Barow
fuente
1

Perdón por encontrar esta pregunta tan tarde. Mis alumnos y asistentes trabajan en la refactorización de C ++ desde aproximadamente 2006. La mayor parte de la infraestructura de refactorización de CDT fue construida por mi equipo en el instituto de software IFS. Desde hace un par de años, proporcionamos a Cevelop nuestra versión de CDT con soporte para refactorizaciones de modernización de código C ++, etc. Cevelop puede trabajar con bases de código grandes, si el espacio de trabajo está configurado correctamente. Gratis disponible en https://cevelop.com

PeterSom
fuente
Muy interesante. Lo descargué y no comenzará. Consulte github.com/Cevelop/Issues/issues/84
RED SOFT ADAIR el
0

Encontré el siguiente complemento para Visual Studio 2013: Visual C ++ Refactoring by Microsoft.

Es solo una herramienta de cambio de nombre simple pero funciona perfectamente. Agrega el siguiente menú contextual después de hacer clic derecho en un símbolo:

ingrese la descripción de la imagen aquí

Zac
fuente