¿Cómo visualizar el código? [cerrado]

107

La mayoría de las veces solo he tenido que leer mi propio código. Como tal, no he tenido necesidad de visualizar el código, ya que sé cómo se comunican entre sí cada clase y cada módulo.

Pero las pocas veces que he tenido que leer el código de otra persona, supongamos ahora que estamos hablando de al menos un módulo más grande que contiene varias clases internas, casi siempre me encontré deseando "Esto haría ¡He sido mucho más fácil de entender si pudiera visualizarlo! "

Entonces, ¿cuáles son los métodos o herramientas comunes para habilitar esto? ¿Cuál usas y por qué los prefieres a los demás? He escuchado cosas como UML, módulos y diagramas de clase, pero imagino que hay más. Además, cualquiera de estos es probablemente mejor que cualquier otra cosa que pueda diseñar por mi cuenta.

EDITAR: para aquellos que responden con "Usa lápiz y papel y simplemente dibújalos": Esto no es muy útil a menos que expliques más. ¿Qué exactamente debo dibujar? ¿Una caja para cada clase? ¿Debo incluir los métodos públicos? ¿Qué pasa con sus campos? ¿Cómo debo dibujar conexiones que expliquen cómo una clase usa otra? ¿Qué pasa con los módulos? ¿Qué sucede si el lenguaje no está orientado a objetos, sino funcional o lógico, o incluso imperativo (C, por ejemplo)? ¿Qué pasa con las variables y funciones globales? ¿Hay una forma ya estandarizada de dibujar esto, o tengo que pensar en un método propio? Obtienes la deriva.

    
pregunta gablin 06.10.2010 - 10:59

17 respuestas

24

Me gusta usar NDepend para aplicar ingeniería inversa a una base de código .NET compleja. La herramienta viene con varias características de visualización excelentes como: Hay docenas de formas de visualizar una base de código, y para completar la respuesta Pierre_303, aquí hay un poco de captura de pantalla extraída de NDepend (descargo de responsabilidad, yo soy el creador de NDepend).

Gráfico de dependencia : un gráfico puede representar diferentes tipos de interacción en su código, más documentación aquí (Gráfico de interacción, Gráfico de llamada, Gráfico de herencia de clase, Gráfico de trayectoria, Gráfico de ciclo ...)

Matrizdedependencia:representalamismainformaciónqueungráfico,perodeunamaneracompletamentediferente.MatrixesmejorqueGraphparavisualizargrandesconjuntosdedependenciasconcientosdenodosyaristas,mientrasqueGraphesmejorqueMatrixparaconjuntosdedependenciasmáspequeños,especialmenteconmenosde20nodos.Matrixtambiéntieneunaventajainmensaparamostrarelpatrónestructuraldelcódigodeunvistazo,comocódigoencapas,ciclodedependencia,cohesión,acoplamiento...Másinformación aquí .

Visualizacióndelamétricadelcódigoatravésdetreemaping:estonopretendemostrarlaestructura/arquitecturadelcódigo,sinomásbiencómoseparticionaelcódigo.Aquílosrectángulosmuestranmétodos,clasesyespaciosdenombres,ycuantasmáslíneasdecódigotengaunaclase,mayorserásurectángulo.Alelegirunacombinaciónadecuadadevaloresdenivelymétricadecódigo,laVistadeMétricadeTreemapayudaaverpatronesqueseríandifícilesdedetectardeotrasmaneras.Másinformación aquí .

    
respondido por el Patrick Smacchia - NDepend dev 26.11.2010 - 18:57
21

Lo que sea que mejor lo entiendas. Si usted es un pensador visual, ¿cómo dibujaría el código que puede visualizar? Para mí, dibujo diagramas de flujo o diagramas de base de datos / UML. Una vez que tenga una forma de representar el código, intente leer el código existente y dibujarlo mientras lo lee.

    
respondido por el GSto 05.10.2010 - 23:06
15

Doxygen es útil para generar diagramas de clase y explorar las clases a través de hipervínculos. Funciona incluso si el código no está aumentado específicamente con comentarios de estilo Doxygen.

    
respondido por el jholl 06.10.2010 - 20:22
11

También, eche un vistazo a la Encuesta de firma de Ward Cunningham. Es ligero y simple, pero sorprendentemente útil para tener una idea del tamaño y la complejidad de las partes del código base.

Originalmente lo hizo para Java, pero siempre puedes adaptarlo al lenguaje en el que estás trabajando. Hace poco lo hice con VB (mientras hacía algunas adiciones propias) y ha sido muy útil. Aquí hay una muestra de cómo se ve la salida:

(querrás hacer clic con el botón derecho - > ver la imagen, luego asegúrate de que estás ampliada)

    
respondido por el Nick Knowlson 26.11.2010 - 19:51
10

UML diagramas de clase para la estructura y diagramas de secuencia para el comportamiento (UML ofrece más tipos de diagramas para estos dos propósitos, todos enfocados en diferentes aspectos del software: estos son los dos me parecen particularmente útiles y las bosquejo / genero cuando las necesito porque ayudan mucho).

    
respondido por el Tamás Szelei 05.10.2010 - 23:36
10

Si el código se divide en capas, entonces puede visualizar el código fácilmente simplemente dibujando las capas en detalle.

Tomemos Android por ejemplo:

Ahora este es el tipo de diagrama más común que es realmente fácil de dibujar. Sin embargo, para que le resulte útil, simplemente comience a dibujar líneas para representar el flujo de datos. En este ejemplo, podría rastrear una aplicación a XMPP a SSL al controlador bluetooth, o cualquier otra combinación.

Sin embargo, te recomiendo que profundices un poco más. Como la mayoría de los proyectos no son tan grandes como Android, puede simplificar un poco las cosas y hacer que cada cuadro sea una clase o un método que facilite la escritura del código más adelante.

    
respondido por el TheLQ 06.10.2010 - 19:35
6

Le sugiero que eche un vistazo a herramientas como nDepend: enlace

  

NDepend es una herramienta de Visual Studio para administrar código .NET complejo y lograr una alta calidad de código. Con NDepend, la calidad del software se puede medir utilizando la Métrica del Código, visualizarse mediante Gráficos y mapas de ruta, y aplicarla mediante Reglas estándar y personalizadas.

     

Por lo tanto, el diseño del software se vuelve concreto, las revisiones de código son efectivas, la refactorización grande es fácil y se domina la evolución.

    
respondido por el user2567 05.10.2010 - 23:49
6

Si tiene un buen depurador y es bueno para usarlo, puede ingresar en el código, separarlo, desplazarse sobre los objetos y ver su estado, etc. Esencialmente, recorre el código mientras se ejecuta. Me parece que esto me ayuda a unir mentalmente los diversos objetos, y cómo interactúan entre sí.

    
respondido por el Robert Harvey 06.10.2010 - 00:06
5

Eso depende de la parte con la que me esté costando.

  • Si hay demasiadas clases, todas se comunican entre sí, las dibujo como cuadros y dibujo líneas / flechas entre ellas para ver quién habla con quién.
  • Si hay llamadas de función anidadas y necesito averiguar quién depende de quién hago algo similar a los diagramas de secuencia.
  • Cuando se trata de la lógica en sí misma, hago dos cosas. Una es imaginar el diseño de datos y seguir en mi cabeza la forma en que se manipula mientras se ejecuta el código, y dos es que construyo una "imagen mental" de la lógica. No puedo explicar qué es esta imagen mental porque realmente no la imagino, es más como sentir su "calidad espacial" de la misma manera que imaginar un mapa lo ayuda a descubrir su entorno.
respondido por el EpsilonVector 06.10.2010 - 20:24
5

Si estás usando Java o Smalltalk, definitivamente deberías consultar Code City . ¡Te permite usar la parte de tu cerebro que está familiarizada con la navegación por ciudades para obtener instantáneamente una perspectiva completamente nueva en tu base de código! Ciertamente me asombró la primera vez que lo usé.

    
respondido por el Nick Knowlson 26.11.2010 - 19:50
5

MS Research publicó Debugger Canvas para Visual Studio 2010

    
respondido por el Disciple 24.12.2011 - 18:35
3

No es muy visual, pero me parece que pasar por diferentes casos de uso es una forma realmente útil de visualizar cómo interactúan las diferentes clases. Esto es especialmente útil cuando tienes muchas clases pequeñas y puede ser abrumador tratar de entenderlas todas juntas.

Escriba una prueba que inicie su caso de uso y encienda el depurador, y luego dibuje el flujo de interacciones de clase. Esto es especialmente útil cuando va más allá de su proyecto individual, ya que puede ver qué otros proyectos se están utilizando. Dependiendo de la complejidad, un diagrama de estado haría el truco.

    
respondido por el Sam J 05.10.2010 - 23:14
3

SO parece tener una discusión paralela con un montón de enlaces de herramientas de software: enlace

Pero también, la pregunta es demasiado genérica para obtener una buena respuesta. En qué idioma se encuentra el código. Si es algo estático, etc., como Java, existen herramientas para analizar / convertir / visualizar la estructura de clases, enlaces cruzados, etc. Si es más dinámico como Ruby, es posible que tenga mucho más problemas.

Si es de dominio público, a menudo hay sitios que se especializan en buscar y navegar a través del código. Linux ciertamente tiene uno, como ejemplo.

Además, ¿puedes ejecutar el código o solo leerlo? Si puede ejecutarlo, intente pegar un volcado de hilos (o no equivalente a Java) en las ubicaciones en las que está confundido. Eso te mostrará qué camino tomó el programa para llegar allí. Si tiene problemas para entender qué archivos de configuración están cargados y cuando mira algo como ProcessMonitor de Sysinternals / Microsoft. Para el análisis del comportamiento de la red, puede utilizar Wireshark. En general, puede utilizar técnicas de solución de problemas. Para Java, hice una presentación sobre eso hace un tiempo para JavaOne / InfoQ: enlace

Finalmente, intente buscar herramientas de análisis de código fuente, a menudo incluyen componentes de visualización.

    
respondido por el Alexandre Rafalovitch 23.05.2017 - 13:33
3

En Visual Studio, puede hacer clic derecho en un proyecto o archivo y hacer clic en 'generar diagrama de clase'. A veces se ven sucias, pero a menudo son útiles cuando tienes muchas interacciones.

Me gustaría ver algún tipo de editor visual que ofrezca una representación lógica del código y te permita editarlo a través de eso, en lugar del código, probablemente ya exista.

    
respondido por el rmx 04.04.2014 - 15:49
2

AgileJ StructureViews está diseñado para exactamente la situación que describe: desea una versión visual de una base de código grande escrita por otras personas. El problema habitual con los diagramas de clase UML de ingeniería inversa es que los resultados contienen tantos detalles que no está mucho mejor que solo leer el código. AgileJ es grande en el filtrado. Debajo del diagrama de clase hay un script de filtro que edita para cortar los miembros que se muestran. AgileJ también es grande en la generación de diagramas por lotes. Puede iniciar un lote y buscará grupos de clases relacionadas para formar diagramas que puede examinar para ver la estructura.

    
respondido por el Paul 06.07.2012 - 14:05
1

Cuando está codificando, obtiene las necesidades de una vista completa, se divide en pequeños pedazos y comienza a dibujar, diagramar y codificar. Después de esto, se une a las partes y tiene el resultado completo.

Para comprender el código no creado por usted, debe realizarse el mismo proceso. En este proceso puedes usar diagramas si tienes. Comience con los casos de uso, la vista de componentes y subsistemas y finalice con diagramas de clase en los que su enfoque sea la vista lógica para comprender las relaciones y las responsabilidades, no los atributos / métodos.

Después de eso, comienzas a investigar diagramas de clase detallados o vas directamente al código. Creo que los diagramas secuenciales son un poco confusos, prefiero mirar el código.

Creo que UML no es una forma ideal todavía, pero es un estándar que mucha gente conoce y es fácil de compartir y entender.

Si no tiene una documentación UML, puede usar ingeniería inversa, pero necesitará ayuda para resolver algunas cosas.

    
respondido por el Pagotti 06.10.2010 - 00:23
1

Uso EclipseUML Omondo para navegar en el código a nivel de modelo. Realmente genial !! Primero invierto mi proyecto java para asignarlo al modelo UML. Luego creo vistas de mi modelo detectando asociaciones, dependencias, herencias, etc. ... mostrar y ocultar lo que necesito. Puedo crear tantos diagramas como necesito basados en un modelo único que se asigna a Java.

El truco que utiliza Omondo es mapear los identificadores de Java y UML y sincronizarlos directamente con el metamodelo UML. Tecnología maravillosa y realmente increíble para visualizar mi código.

    
respondido por el UML_GURU 13.10.2010 - 17:19

Lea otras preguntas en las etiquetas