Evolução de Software A Survey of Software Refactoring Reconstruction of Successful Software Evolution Using Clone Detection 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Roteiro • Contextualização • O Problema • Refatoração • Definição • Refatoração e Evolução • Processo • Técnicas e Ferramentas • Conclusão 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Contextualização • Software precisa evoluir • Modificações • Adição de funcionalidades • Melhoria na estrutura • Adequação ao cliente 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG O Problema • Complexidade aumenta • Distância do design original • Erosão do Design • Perda de qualidade • Custo com manutenção é alto 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG A Solução: Refatoração • Restruturação • Refatoração: • “Processo de mudar um software orientado a objeto de uma maneira que não altere seu comportamento externo, mas melhore sua qualidade interna” • Reduzir a complexidade do software aumentando de forma incremental sua qualidade 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG A Solução: Refatoração • Relacionado à qualidade interna do software • Evolution Critical • Normalmente não é fruto de novas funcionalidades no código, mas está relacionado à previsão da adição de novas funcionalidades • “Funciona, mas e quando eu precisar modificar? Vai ser simples?” 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Refatoração e Evolução • Melhorar aspectos como: • Modularidade • Reusabilidade • Complexidade • Manutenabilidade • Refatorar para facilitar futuras adaptações e extensões • Coverter código legado em um código modularizado e extensível 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Refatoração • Primitive Refactoring • MoveMethod • RenameMethod • AddClass • ExtractMethod • Composite Refactoring • MoveMethodsToVisitor 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Refatoração: O Processo • Identificar qual parte do código deve ser refatorada • Determinar quais refactorings devem ser aplicados • Garantir a preservação do comportamento • Avaliar o efeito da refatoração nas características que indicam qualidade no software • Manter a consistência do código com os outros artefatos 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Refatoração: O Processo • Uso de métricas para identificar quais partes do software precisam ser refatoradas • Abordagens dinâmicas e estáticas • Testes • Detecção Bad Semells • Código Duplicado • God Class 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Refatoração: O Processo • Por definição, refatoração não pode alterar o comportamento do software • O que é comportamento? • Para um mesmo conjunto de valores de entrada, a saída deve ser a mesma depois da refatoração • Desempenho depende do domínio • Embarcados • Sistemas de vendas web 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Refatoração: O Processo • Avaliar o efeito da refatoração na qualidade do software • Demeyer [1] avaliou que, ao trocar condições lógicas por polimorfismo, o software ganha em desempenho • Compiladores otimizam chamadas polimórficas 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Refatoração: O Processo • Manter a consistência com outros artefatos • Documentação do design • Testes de unidade • Documentação do código e de funcionalidades 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Refatoração: O Processo • Design Wizard • Abordagem baseada em testes que permite verificar se o design de um determinado programa está em conformidade com o design especificado • Suporte à atividade de refatoração 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Refatoração: Formalismos • Uso de Asserções • Pré-condições • Devem ser válidas antes da refatoração • Pós-condições • Devem ser válidas depois da refatoração • Invariantes • Devem ser válidas antes e depois da refatoração 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Refatoração: Uso de asserções • Maneira verificável de assegurar que o comportamento de um método foi mantido depois de refatorado • Exemplo: MoveMethod(print,ASCIIDoc,Printer) • Pré-condições • ASCIIDoc e Printer devem existir • o método print deve existir em ASCIIDoc • Não deve existir o método print em Printer 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Refatoração: Uso de asserções • Pós-condições • O método print deve existir em Printer • O método print não deve existir em ASCIIDoc • Invariantes • ASCIIDoc e Printer devem existir antes de depois da refatoração 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Outros Formalismos • Fatiamento de Programas • Extrair todas as declarações que podem afetar um certo conjunto de variáveis • Baseado em grafos de dependência • Pode ser usado para verificar que uma refatoração preserva o comportamento de determinada porção do código 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Outros artefatos • Refatoração não é somente aplicável a código • Modelos de Design • Esquemas de bancos de dados • Arquitetura de Software • Requisitos de Software • Necessidade de manter todos sincronizados 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Ferramentas • Ferramentas automatizam primitive refactorings • IntelliJ Idea • Eclipse • JFactor • XRefactory • JBuilder • CodeGuide • www.refactoring.com/tools.html 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Ferramentas • Indepedência de linguagem • Embora exista ferramentas de refatoração para Java, não existe para JAspect • Confiabilidade • Undo 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Refatoração e XP • Pequenas iterações ao estilo: • Codifica para passar nos testes • Refatora • Refatoração é um dos pilares de XP • Refatoração + Testes = Aumento da qualidade e confiabilidade do código 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Conclusões • Evolução implica em refatoração • O uso de métricas e visualização é extremamente importante para a atividade de refatoração • Análise de impacto também é uma das atividades que podem acompanhar a refatoração • Refatoração não é exclusiva a código 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Reconstruction of Successful Software Evolution Using Clone Detection • Heurística para reconstruir o processo evolutivo explorando técnicas de detecção de código duplicado • Interesse em como as mudanças afetam o software ao longo do tempo • Software Peleontology Heurist 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Visualização • Procura por mudanças entre duas versões distintas de software • Visualização em forma de matriz 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Visualização 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Conclusões • Limitações • Escrita • As linhas devem ser idênticas para serem detectadas • Escalabilidade da visualização • Poucos dados • Poucas conclusões 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Conclusões • Usar o histórico de refatoração com intuito de entender a evolução do software pode ser interessante • Detecção de outros tipos de refatoração • Abordar a interpretação dos dados 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG Referências • [1] S. Demeyer, “Maintainability versus Performance: What's the effect of introducing Polimorphism?” technical report, Lab. on Reeng., Universiteit Antwerpern, Belgium, 2002. 13/11/2007 João Arthur Brunet Monteiro GMF/DSC/CEEI/UFCG