Como mergulhar fundo no código que não possui um único ponto de entrada?

8

Trabalho em projetos Java corporativos que não têm um único ponto de entrada a partir do qual posso rastrear o fluxo de execução. Alguns dos projetos têm centenas de classes e, quando me pedem para adicionar um recurso a um projeto, muitas vezes me vejo sem saber por onde começar a examinar o código.

Qual é a melhor maneira de mergulhar nesses projetos para que eu possa implementar o recurso rapidamente, sem perder tempo.

rdasxy
fonte
Seus projetos são extraídos de uma camada de acesso a dados?
PhillipKregg
Dê mais detalhes. Ele usa frameworks como struts / EJB etc?
Java_mouse
@PhillipKregg Sim, possui uma camada de acesso a dados.
rdasxy
@java_mouse é um projeto do Spring.
rdasxy
Pergunte a um dos desenvolvedores que escreveu o código ou partes maiores dele. Ninguém ainda está na sua empresa? Então você provavelmente precisará passar algumas semanas ou meses para entender o sistema.
Doc Brown

Respostas:

10

O projeto possui um conjunto de testes de unidade bem mantidos? Os testes de unidade são documentação programática para o que o código faz.

Além disso, você precisa aprender o suficiente sobre a arquitetura do aplicativo para identificar os locais onde precisa inserir código para seus novos recursos e ignorar mais ou menos o restante. Você não precisa conhecer toda a base de código para fazer isso; se os projetos forem bem arquitetados, a funcionalidade já estará suficientemente encapsulada e dissociada para que você possa se concentrar nas partes relevantes. Se você tiver sorte, os projetos já seguem uma arquitetura conhecida que servirá como um mapa para você seguir.

O código sempre tem um ou mais pontos de entrada. Para projetos MVC, o ponto de entrada é um método de controlador baseado em uma URL; o método quase certamente acessará um repositório de dados e retornará uma visualização. Comece por aí.

Robert Harvey
fonte
3

Comece com a camada intermediária (camada de lógica de negócios).

Esse é um dos locais em que o controle vem para qualquer ação do usuário ou acionar eventos, se for um aplicativo não baseado na interface do usuário. Se você estiver no modo de depuração, poderá rastreá-lo até a parte superior e inferior (camada de acesso a dados mais provável).

Levará algum tempo, mas esta é a maneira eficiente de pular para projetos não documentados.

Se o projeto usar qualquer estrutura (struts-config.xml, xmls de configuração do ejb, xmls de configuração da primavera) terá interfaces definidas e você poderá começar a partir daí também.

java_mouse
fonte
2

Sempre há um ponto de entrada. Para aplicativos corporativos Java: servlets, filtros e ouvintes de contexto estão no topo, eles normalmente levam à inicialização do aplicativo, por exemplo, o Spring context loader, que leva a controladores, entidades e exibições. Na verdade, é bastante direto, principalmente se uma estrutura como primavera, tapeçaria ou wicket for usada. Depois de saber como a estrutura processa uma solicitação, você poderá identificar os pontos de extensão necessários.


fonte
1

Eu começaria com uma hierarquia de classes. Se você tem um ótimo, se não, encontre uma ferramenta que pode fazer engenharia reversa do seu código e criar um para você. A partir disso, você pode começar a ver como as coisas podem estar relacionadas. Depois de ver como as coisas podem estar relacionadas, você pode pelo menos segmentar áreas, em vez de ter uma grande "mistura de classes". Você pode segmentar uma área e ver como eles estão associados (esta classe é uma associação desta, esse conjunto de classes é um padrão de design etc.). Tente adicionar alguma ordem e estrutura em torno do que você está vendo e depois divida cada seção.

EDITAR:

Aqui estão algumas postagens do estouro de pilha, descrevendo as ferramentas que você pode usar no eclipse (ou como aplicativos independentes) para fazer engenharia reversa e gerar um modelo:

"Como você come um elefante". "Uma mordida de cada vez".

jmq
fonte
2
Como você codifica um elefante? Um byte de cada vez.
Mason Wheeler
1

É quase impossível estender seu projeto java se você não obtiver os pontos de entrada e uma documentação clara do que foi feito e por quê.

FYI: Quando entregamos um projeto a nossos clientes, agora aderimos sistematicamente a um modelo UML, além de java doc e uma documentação impressa. Criamos centenas de visualizações do modelo exibido como diagramas de classes. Adicionamos muitos comentários e explicamos a arquitetura estática, bem como o fluxo de regras e métodos de negócios. Se nossos clientes quiserem pegar o código dele e entregá-lo a outra empresa, será fácil para eles modificar o software existente não apenas no nível da implantação, mas também no nível da arquitetura. Uso poderoso, simples e brilhante de visualizações UML dinâmicas a partir de um único modelo.

Dito isto, conheço muito poucos integradores interessados ​​em fornecer todas essas informações porque, uma vez que o cliente está preso, é melhor não deixá-lo ir. Oferecer um modelo completo e navegação UML dinâmica permitirá que os clientes sejam independentes e, portanto, isso não é bom para a receita comercial. Ainda não entendo por que os grandes bancos ou empresas de telecomunicações são tão ingênuos ao ficar presos pelos integradores e não perguntam o modelo completo na entrega do projeto? O código java ou uma documentação impressa não é suficiente. A documentação impressa é geralmente um processo automático. Não tem valor real extrair informações do código para imprimi-las ou fornecer um PDF.

UML_Guru
fonte
1

SEMPRE existem pontos de entrada, basta encontrá-los. Se for um aplicativo em lote controlado por agendamento, há tarefas configuradas em algum lugar. Se for um aplicativo da Web (usando o Spring), existem mapeamentos e controladores. Se for um aplicativo de serviços da web, existem pontos de extremidade de serviço. Se for um aplicativo Swing, existem manipuladores de eventos ou algo assim. E se é um grande aplicativo de linha de comando peludo, existe um main()método.

Quanto a "mergulhar rapidamente" - bem, quanto tempo leva para encontrar os pontos de entrada é realmente individual. Se o sistema for escrito de acordo com os padrões estabelecidos e você estiver familiarizado com as estruturas e com as regras e processos de negócios subjacentes, será possível descobrir com muita rapidez. Caso contrário, pode demorar mais tempo. Mas não existe um "truque" universal. Você acumula experiência, aprende a reconhecer padrões e a entender como as estruturas são construídas e organizadas e você melhora.

pap
fonte
1

Em relação a lidar com código legado:

  • O livro de Michael Feathers fornece algumas boas práticas sobre como abordar o software herdado.

Em relação ao fluxo de execução:

  • É um projeto Spring, portanto, espere que o fluxo de controle faça truques de mágica. Pode fazer muitos métodos de chamada por reflexão ou mesmo AOP. Tentar entender o "fluxo de execução" usando um depurador pode causar frustração.
  • Como é um projeto do Spring, a estrutura do projeto é bastante homogênea. Aprenda Spring (se você ainda não o fez) para entender os conceitos de beans e fiação. Isso mostra quais classes funcionam juntas.

Em relação ao ponto de entrada:

  • Deixe-me adivinhar: é um aplicativo da web. Deixe-me adivinhar novamente: está usando o Spring MVC. Aprenda este também, para saber como encontrar as classes de controlador para as páginas. Estes são os pontos de entrada no seu aplicativo. Eles são chamados por reflexão, para que você não os encontre usando a análise estática do código-fonte.
Wolfgang
fonte