¿Qué herramientas o técnicas son útiles para describir una base de código desconocida? [cerrado]

9

Al inspeccionar manualmente un código desconocido (para revisar o modificar), parece que tengo tres opciones.

  • Una lectura de arriba hacia abajo del código, eligiendo cada archivo fuente siguiente por lo fundamental que parece el nombre del archivo. Usualmente termino leyendo casi todo. Algunos archivos dos veces.
  • Una lectura de primera amplitud , donde encuentro y leo todo el método de invocación con una comprensión mínima. Luego lea todas las funciones que esa función llamó, y así sucesivamente. Mi pila mental tiende a desbordarse si hago algunas llamadas profundas.
  • Una lectura de profundidad , donde paso por todo el código en un depurador, sin saber si esto llevará 8 minutos u 8 horas.

Una vez que he leído suficiente código para tener una comprensión bastante sólida de lo que está haciendo, a menudo reflexiono que he leído el 80% o más de la base de código, mientras que el código fundamental es del 20% o menos . Perdí mucho tiempo.

¿Qué herramientas son útiles para obtener una comprensión rápida del código poco común? ¿Hay alguna herramienta que pueda dar una "imagen general" de la ruta crítica del código y me permita profundizar en los detalles de cualquier parte?

Drew Dormann
fuente
2
sin captar el porcentaje del 80% que no se puede entender por qué el 20% es la parte fundamental
de trinquete monstruo
@ratchetfreak No diría eso en términos tan absolutos. Una herramienta podría aislar el código que siempre se llama, por ejemplo. O solo ejecuta muchos niveles de pila de profundidad.
Drew Dormann el

Respuestas:

8

Lo mejor, por supuesto, es que alguien que conozca la base del código lo guíe a través de él. Si esa no es una opción, existen algunas herramientas que pueden ayudarlo.

  • VisualStudio puede generar automáticamente un diagrama de clase UML de una base de código. Por lo menos le mostrará las jerarquías de clases.
  • Doxygen puede ser extremadamente útil. Incluso si el código no tiene los comentarios de estilo doxygen, doxygen aún puede generar documentación legible, diagramas de clase y gráficos de llamadas, lo que puede ser muy útil para orientarse en una base de código desconocida.

En general, también desea utilizar un IDE con todas las funciones, donde puede hacer clic con el botón derecho en cualquier cosa e "ir a la definición". Esto puede ahorrarle mucho tiempo, en comparación con el uso de grep en muchos archivos en una estructura de directorio compleja.

Otra cosa importante, dependiendo de cuánto tiempo tendrá que lidiar con el código. Si hay pruebas unitarias, mire las pruebas. Si no hay pruebas, comience a escribirlas. Forme una hipótesis sobre lo que hace una clase o función en particular y escriba una prueba para probarla. Esto requiere mucha disciplina, pero es una excelente manera de obtener respuestas sobre lo que sucede en el código.

Dima
fuente
2
Gracias @Dima. Doxygen es fantástico para manejar algo de eso. (No quería dirigir las respuestas soltando el nombre de esa herramienta que conozco). Felicitaciones también en el componente de "interacción humana" de nivel equilibrado. :)
Drew Dormann
3

Este es un enfoque más drástico. Esta técnica puede ser útil para un proyecto que tiene muchas clases que no están organizadas en espacios de nombres significativos.

El objetivo de este ejercicio es descubrir la relación de clase. Haga un clon desechable del proyecto y luego intente poner algunas clases en espacios de nombres. Para ahorrar tiempo en intentos repetidos, use algunas herramientas de procesamiento de archivos Regex para automatizar este cambio.

Esto causará muchos errores de compilación. En el proceso de corregir estos errores, uno comprenderá mejor cómo estas clases dependen unas de otras y decidir qué clases se pueden poner en el mismo espacio de nombres.

Esta técnica es útil porque se puede aplicar incluso con poca comprensión de la organización del código del proyecto. Con esto viene el riesgo de que algunas clases puedan ser extraviadas por esta técnica debido a malentendidos.

rwong
fuente
Eso es inteligente. ¿Sueles hacer eso para muchas clases o lo guardas para cuando te encuentras con una clase específica que no está clara para ti?
Drew Dormann
@DrewDormann Aprendí esta técnica de uno de mis colegas cuando me enfrenté a cientos de clases que no estaban agrupadas. Es un primer paso para "ordenar" los archivos del proyecto, antes de que ocurra una refactorización. En otras palabras, se usa cuando todo sigue siendo un desastre. (Vergonzosamente, el desastre fue escrito por mi yo anterior). Al ordenar los archivos del proyecto en espacios de nombres, facilita la generación de páginas de clase Doxygen (al mostrar árboles de espacios de nombres) y también acelera la comprensión del programador.
rwong