Como visualizar código? [fechadas]

107

Eu só tive que ler meu próprio código. Como tal, não tive necessidade de visualizar o código, pois já sei como cada classe e módulo se comunicam entre si.

Mas as poucas vezes que eu tive que ler o código de outra pessoa - vamos agora assumir que estamos falando de pelo menos um módulo maior que contém várias classes internas - eu quase sempre me encontrei desejando "Isso tem sido muito mais fácil de entender se eu pudesse visualizá-lo! "

Então, quais são os métodos ou ferramentas comuns para habilitar isso? Qual você usa, e por que você prefere eles sobre os outros? Eu ouvi coisas como UML, módulos e diagramas de classes, mas eu imagino que há mais. Além disso, qualquer um desses é provavelmente melhor do que qualquer coisa que eu possa imaginar sozinho.

EDIT: Para aqueles que respondem com "Use caneta e papel e apenas desenhe-o": Isso não é muito útil, a menos que você explique isso mais. O que exatamente eu deveria desenhar? Uma caixa para cada aula? Devo incluir os métodos públicos? E quanto aos seus campos? Como devo desenhar conexões que explicam como uma classe usa outra? E quanto aos módulos? E se a linguagem não for orientada a objetos, mas funcional ou lógica, ou mesmo imperativa (C, por exemplo)? E quanto às variáveis e funções globais? Existe uma maneira já padronizada de desenhar isso, ou eu preciso pensar em um método próprio? Você começa a deriva.

    
por gablin 06.10.2010 / 10:59
fonte

17 respostas

24

Eu gosto de usar o NDepend para reverter a complexa base de código .NET. A ferramenta vem com vários ótimos recursos de visualização como: Existem dezenas de maneiras de visualizar uma base de código, e para completar a resposta do Pierre_303, aqui estão algumas imagens extraídas do NDepend (disclaimer, eu sou o criador do NDepend).

Gráfico de Dependência : Um gráfico pode representar diferentes tipos de interação em seu código, mais documentação aqui a> (Gráfico de Interação, Gráfico de Chamada, Gráfico de Herança de Classe, Gráfico de Caminho, Gráfico de Ciclo ...)

MatrizdeDependência:Representaasmesmasinformaçõesqueumgráfico,masdeumamaneiracompletamentediferente.OMatrixémelhorqueoGraphparaexibirdependênciasgrandesconfiguradascomcentenasdenósearestas,enquantooGraphémelhorqueoMatrixparadependênciasmenores,especialmentecommenosde20nós.Matrixtambémtemumaimensavantagememmostraropadrãoestruturaldocódigonumpiscardeolhos,comocódigoemcamadas,ciclodedependência,coesão,acoplamento...Maisinformações aqui .

Visualizaçãodemétricadecódigopormeiodetreemaping:issonãovisamostrarestruturadecódigo/arquitetura,masmaiscomoocódigoéparticionado.Aqui,osretângulosmostrammétodos,classesenamespaces,equantomaislinhasdecódigoumaclassetiver,maiorseráoseuretângulo.Aoescolherumacombinaçãoapropriadademétricadecódigoevaloresdenível,aExibiçãodemétricadoTreemapajudaaverpadrõesqueseriamdifíceisdedetectardeoutrasmaneiras.Maisinformações aqui .

    
por 26.11.2010 / 18:57
fonte
21

De qualquer maneira, você entende melhor. Se você é um pensador visual, como desenhar o código que você pode visualizar? Para mim, eu esboço fluxogramas ou diagramas de banco de dados / UML. uma vez que você tenha uma maneira de representar o código, tente ler o código existente e desenhe-o enquanto você o lê.

    
por 05.10.2010 / 23:06
fonte
15

O Doxygen é útil para gerar diagramas de classes e explorar as classes por meio de hiperlinks. Ele funciona mesmo se o código não for especificamente aumentado com comentários no estilo do Doxygen.

    
por 06.10.2010 / 20:22
fonte
11

Além disso, dê uma olhada na Pesquisa sobre assinaturas de Ward Cunningham. É leve e simples, mas surpreendentemente útil para entender o tamanho e a complexidade de partes da base de código.

Ele originalmente fez isso para Java, mas você sempre pode adaptá-lo para o idioma em que está trabalhando. Eu recentemente fiz isso com o VB (enquanto fazia algumas adições minhas) e foi muito útil. Veja uma amostra de como é a saída:

(você vai querer clicar com o botão direito do mouse - > ver a imagem, em seguida, certifique-se de ampliar o zoom)

    
por 26.11.2010 / 19:51
fonte
10

UML diagramas de classe para estrutura e diagramas de seqüência para comportamento (a UML oferece mais tipos de diagrama para esses dois propósitos, todos focando em diferentes aspectos do software - estes são os dois acho particularmente útil e faço esboços / gero quando necessário porque ajudam muito).

    
por 05.10.2010 / 23:36
fonte
10

Se o código for dividido em camadas, você poderá visualizar facilmente o código simplesmente desenhando as camadas em detalhes.

Vamos levar o android por exemplo:

Agora, esse é o tipo mais comum de diagrama que é realmente fácil de desenhar. Para torná-lo útil para você, basta começar a desenhar linhas para representar o fluxo de dados. Neste exemplo, você poderia rastrear um aplicativo para XMPP para SSL para o driver bluetooth ou qualquer outra combinação.

Eu recomendaria, porém, que você fosse um pouco mais a fundo. Como a maioria dos projetos não é tão grande quanto o Android, você pode tornar as coisas um pouco mais simples e ter cada caixa como uma classe ou um método que torna mais fácil escrever o código posteriormente.

    
por 06.10.2010 / 19:35
fonte
6

Eu sugiro que você dê uma olhada em ferramentas como nDepend: link

NDepend is a Visual Studio tool to manage complex .NET code and achieve high Code Quality. With NDepend, software quality can be measured using Code Metrics, visualized using Graphs and Treemaps, and enforced using standard and custom Rules.

Hence the software design becomes concrete, code reviews are effective, large refactoring are easy and evolution is mastered.

    
por 05.10.2010 / 23:49
fonte
6

Se você tem um bom depurador, e é bom em usá-lo, você pode entrar no código, no ponto de interrupção, passar o mouse sobre os objetos e ver o estado deles, etc. Basicamente, você percorre o código enquanto está sendo executado. Acho que isso me ajuda a costurar mentalmente os vários objetos e como eles estão interagindo uns com os outros.

    
por 06.10.2010 / 00:06
fonte
5

Isso depende da parte com a qual estou tendo dificuldades.

  • Se houver muitas turmas conversando entre si, desenhe-as como caixas e desenhe linhas / setas entre elas para ver quem fala com quem.
  • Se houver chamadas de função aninhadas e precisar descobrir quem depende de quem eu faço algo semelhante aos diagramas de seqüência.
  • Quando se trata da lógica em si, faço duas coisas. Uma é imaginar o layout dos dados e seguir na minha cabeça o modo como ele é manipulado enquanto o código é executado, e dois é construir uma "imagem mental" da lógica. O que essa imagem mental é que eu realmente não consigo explicar porque na verdade não a vejo, mais como sentir sua "qualidade espacial" da mesma maneira que imaginar um mapa ajuda a descobrir o que o cerca.
por 06.10.2010 / 20:24
fonte
5

Se você estiver usando Java ou Smalltalk, você deve definitivamente verificar Code City . Ele permite que você use a parte do seu cérebro que está familiarizada com as cidades de navegação para obter instantaneamente uma nova perspectiva sobre sua base de código! Certamente me surpreendeu quando eu usei pela primeira vez.

    
por 26.11.2010 / 19:50
fonte
5

MS Research publicou Debugger Canvas para o Visual Studio 2010

    
por 24.12.2011 / 18:35
fonte
3

Não é bem visualizável, mas acho que passar por diferentes casos de uso é uma maneira realmente útil de visualizar como as diferentes classes estão interagindo. Isso é especialmente útil quando você tem muitas turmas pequenas e pode ser complicado tentar entendê-las todas juntas.

Escreva um teste que iniciará seu caso de uso, iniciará o depurador e, em seguida, desenhará o fluxo de interações de classe. Isso é especialmente útil quando você está indo além do seu projeto único, pois você pode ver quais outros projetos estão sendo utilizados. Dependendo da complexidade, um diagrama de estado faria o truque.

    
por 05.10.2010 / 23:14
fonte
3

O SO parece ter uma discussão paralela com vários links de ferramentas de software: link

Mas também, a questão é muito genérica para obter uma boa resposta. Em que linguagem é o código. Se for algo estaticamente digitado, etc, como Java, existem ferramentas para analisar / converter / visualizar a estrutura de classes, links cruzados, etc. Se for mais dinâmico como Ruby, você pode ter muito mais problemas.

Se for de domínio público, geralmente há sites especializados em pesquisar e navegar pelo código. O Linux certamente tem um, como um exemplo.

Além disso, você pode executar o código ou apenas lê-lo? Se você pode executá-lo, tente colocar um dump de thread (ou equivalente não-Java) nos locais que você está confuso. Isso mostrará o caminho que o programa levou para chegar lá. Se você tiver dificuldade em entender quais arquivos de configuração são carregados e quando olhar para algo como ProcessMonitor da Sysinternals / Microsoft. Para análise de comportamento de rede, você pode usar o Wireshark. Em geral, você pode usar técnicas de solução de problemas. Para Java, fiz uma apresentação sobre isso há um tempo para o JavaOne / InfoQ: link

Por fim, tente pesquisar ferramentas de análise de código-fonte, geralmente elas incluem componentes de visualização.

    
por 23.05.2017 / 13:33
fonte
3

No Visual Studio, você pode clicar com o botão direito em um projeto ou arquivo e clicar em "gerar diagrama de classes". Às vezes, eles parecem confusos, mas geralmente são úteis quando você tem muitas interações.

Eu gostaria de ver algum tipo de editor visual que forneça uma representação lógica do código e permita que você o edite através dele, em vez do código - provavelmente ele já existe.

    
por 04.04.2014 / 15:49
fonte
2

O AgileJ StructureViews é construído exatamente para a situação que você descreve - querendo uma versão visual de uma grande base de código escrita por outras pessoas. O problema usual com diagramas de classe UML com engenharia reversa é que os resultados contêm tantos detalhes que você não está muito melhor do que apenas ler o código. AgileJ é grande em filtragem. Abaixo do diagrama de classes, há um script de filtro que você edita para reduzir os membros exibidos. O AgileJ também é grande na geração de diagramas em lote. Você pode lançar um lote e procurar por grupos de classes relacionadas para formar diagramas que você pode procurar para ver a estrutura.

    
por 06.07.2012 / 14:05
fonte
1

Quando você está codificando, você obtém as necessidades de uma visão completa e você divide em pequenos pedaços e começa a desenhar, diagramar e codificar. Depois disso, você participa das partes e obtém o resultado completo.

Para entender o código não criado por você, o mesmo processo deve ser feito. Nesse processo, você pode usar diagramas se tiver. Comece com casos de uso, visualização de componentes e subsistemas e conclua com diagramas de classes em que seu foco é a visualização lógica para entender as relações e responsabilidades, não os atributos / métodos.

Depois disso, você começa a investigar diagramas de classes detalhados ou vai direto para o código. Eu acho que os diagramas sequenciais são um pouco confusos, eu prefiro olhar o código.

Acho que a UML ainda não é uma forma ideal, mas é um padrão que muitas pessoas conhecem e é fácil de compartilhar e entender.

Se você não tiver uma documentação UML, poderá usar engenharia reversa, mas precisará de ajuda para descobrir algumas coisas.

    
por 06.10.2010 / 00:23
fonte
1

Eu uso o EclipseUML Omondo para navegar no código no nível do modelo. Realmente legal !! Primeiro reviro meu projeto java para mapeá-lo para o modelo UML. Então eu crio visões do meu modelo detectando associações, dependências, heranças etc ... mostro e escondo o que eu preciso. Eu posso criar quantos diagramas eu precisar com base em um único modelo que é mapeado para Java.

O truque usado pelo Omondo é mapear ids Java e UML e sincronizá-lo diretamente com o metamodelo UML. Tecnologia maravilhosa e realmente incrível para visualizar meu código.

    
por 13.10.2010 / 17:19
fonte