Quais ferramentas ou técnicas são úteis para descrever uma base de código desconhecida? [fechadas]

9

Ao inspecionar manualmente códigos desconhecidos (para revisar ou modificar), pareço ter três opções.

  • Uma leitura de cima para baixo do código, escolhendo cada próximo arquivo de origem pelo quão fundamental o nome do arquivo parece. Normalmente, acabo lendo quase tudo. Alguns arquivos duas vezes.
  • Uma leitura abrangente , onde encontro e leio todo o método de chamada com o mínimo de entendimento. Em seguida, leia todas as funções que a função chamou e assim por diante. Minha pilha mental tende a transbordar se eu fizer algumas chamadas profundas.
  • Uma leitura aprofundada , na qual passo por todo o código em um depurador, sem saber se isso levará 8 minutos ou 8 horas.

Depois de ler o código o suficiente para ter uma compreensão bastante sólida do que está fazendo, geralmente reflito que li 80% ou mais da base de código, enquanto o código fundamental é 20% ou menos . Eu perdi muito tempo.

Quais ferramentas são úteis para obter uma rápida compreensão de códigos diferentes? Existe alguma ferramenta que possa fornecer uma "imagem geral" do caminho crítico do código e me permitir detalhar os detalhes de qualquer parte?

Drew Dormann
fonte
2
sem captar o percentual de 80% você não consegue entender por que o 20% é a parte fundamental
catraca aberração
@ratchetfreak Eu não diria isso em termos absolutos. Uma ferramenta pode isolar o código sempre chamado, por exemplo. Ou apenas execute muitos níveis de pilha com profundidade.
Tirou Dormann

Respostas:

8

A melhor coisa, é claro, é que alguém que conhece a base de código o guie por ela. Se isso não for uma opção, existem algumas ferramentas que podem ajudá-lo.

  • O VisualStudio pode gerar automaticamente um diagrama de classes UML de uma base de código. No mínimo, ele mostrará as hierarquias de classe.
  • Doxigênio pode ser extremamente útil. Mesmo que o código não possua comentários no estilo doxygen, o doxygen ainda poderá gerar documentação legível, diagramas de classes e gráficos de chamada, o que pode ser muito útil para encontrar o caminho de uma base de código desconhecida.

Geralmente, você também deseja usar um IDE completo, onde pode clicar com o botão direito do mouse em qualquer coisa e "ir para a definição". Isso pode economizar muito tempo, comparado ao uso de grep em muitos arquivos em uma estrutura de diretórios complexa.

Outra coisa importante, dependendo de quanto tempo você terá que lidar com o código. Se houver testes de unidade, verifique os testes. Se não houver testes, comece a escrevê-los. Forme uma hipótese sobre o que uma classe ou função específica faz e escreva um teste para testá-lo. Isso requer muita disciplina, mas é uma ótima maneira de obter respostas sobre o que está acontecendo no código.

Dima
fonte
2
Obrigado @Dima. O oxigênio é fantástico para lidar com isso. (Eu não queria orientar as respostas largando o nome de uma ferramenta que eu conheço). Parabéns pelo componente de "interação humana" de nível intermediário. :)
de Drew Dormann
3

Essa é uma abordagem mais drástica. Essa técnica pode ser útil para um projeto que possui muitas classes que não estão organizadas em espaços para nome significativos.

O objetivo deste exercício é descobrir o relacionamento de classe. Faça um clone descartável do projeto e tente colocar algumas classes nos namespaces. Para economizar tempo em tentativas repetidas, use algumas ferramentas de processamento de arquivo Regex para automatizar essa alteração.

Isso causará muitos erros do compilador. No processo de correção desses erros, será possível entender melhor como essas classes dependem umas das outras e decidir quais classes podem ser colocadas no mesmo espaço para nome.

Essa técnica é útil, pois é possível aplicá-la mesmo com pouco entendimento da organização do código do projeto. Com isso, corre-se o risco de que algumas classes possam ser extraviadas por essa técnica devido a mal-entendidos.

rwong
fonte
Isso é esperto. Você costuma fazer isso para muitas classes ou salva para quando se deparar com uma classe específica que não é clara para você?
Tirou Dormann
@DrewDormann Eu aprendi essa técnica com um de meus colegas quando confrontado com centenas de classes que não estavam agrupadas. É um primeiro passo para "classificar" os arquivos do projeto, antes que ocorra qualquer refatoração. Em outras palavras, é usado quando tudo ainda está uma bagunça. (Embaraçosamente, a bagunça foi escrita pelo meu eu anterior.) Ao classificar os arquivos do projeto em espaços para nome, ele facilita a geração de páginas da classe Doxygen (exibindo árvores do espaço para nome) e também acelera a compreensão do programador.
rwong