Considere que hay una jerarquía de clases muy grande, de decenas o incluso cientos de clases. El diagrama de herencia también es muy complejo (doxygen no puede representarlo sin flechas de tamaño de media página :-)). Y aquí viene el temido problema de los diamantes. Estoy buscando una manera de encontrar todos los diamantes.
Alrededor así:
Aquí, las flechas de herencia dibujadas con lápiz rojo deben ser virtuales. En una estructura tan sencilla es fácil encontrarlos todos, pero no en uno mucho más grande.
Encontrar todos los diamantes parece un problema de recorrido gráfico fácilmente automatizable. Me sorprendería si ya no existiera una solución para la tarea.
La pregunta es una herramienta que ya existe para una tarea?
Tienes dos problemas que resolver:
La primera parte es compleja porque analizar C++ para obtener esta información de herencia con precisión es difícil (C++ en sí mismo es increíblemente difícil de analizar, luego tienes las complicaciones de los condicionales del preprocesador, los archivos incluidos, las macros y las plantillas). Necesita un front-end completo de C++ para hacer esto y un ataque organizado para recopilar la información de herencia.
Nuestro kit de herramientas de reingeniería de software DMS con su interfaz C++ se puede utilizar para extraer este tipo de información. Puede configurar DMS para analizar todas sus unidades de compilación y realizar una resolución de nombre/tipo; esto maneja todo el preprocesamiento/resolución de plantilla y produce, para cada unidad de compilación, tanto AST para el programa (que no necesita para esta tarea) como tablas de símbolos accesibles, que contienen declaraciones de clases y herencias A deseadas -desde-B información. Un simple escaneo de la tabla de símbolos puede producir la información de herencia para cada unidad de compilación.
Luego debe reunir esa información para obtener un gráfico de herencia para su sistema. Debería ser obvio que literalmente desea construir el gráfico de herencia.
Con ese gráfico, el descubrimiento de diamantes es básicamente fácil:
Puede implementar ese buscador de diamantes usando un software que no sea DMS, pero también podría implementarlo usando el lenguaje de programación de procedimientos interno de DMS, lo que evitaría el paso que exporta la información heredada.
Resumen:
Dado que DMS es el producto de mi empresa, no lo tome como una recomendación, simplemente como una nota de que DMS existe y puede realizar la tarea de OP.
También puede probar CppDepend , que proporciona muchas funciones relacionadas con las dependencias y un lenguaje de consulta de código para crear fácilmente sus reglas de dependencias.
Tomás Weller
steve barnes
Pedro