MANUTENÇÃO E EVOLUÇÃO DE SOFTWARE ATRAVÉS DO PROCESSO DE MUDANÇAS INCREMENTAIS Dalton Dario Serey Guerrero Orientador Software escolhido Jedit ◦ ◦ ◦ ◦ Editor de texto open source Mais de 500 classes Projeto ativo, com vários change requests Projeto popular no SourceForge Modus Operandi Três grupos de quatro alunos Coordenação do projeto: Dalton Um gerente de projeto para cada grupo: mestrando ou doutorando do GMF Pair programming Programação em horário e local fixos (para atender às necessidades de pesquisa) Estimativa de 8 horas semanais de trabalho Uso do XPlanner Cada grupo gera uma monografia de conclusão de curso ao final do projeto Fases do processo de mudanças incrementais Iniciação Localização de Conceitos Análise de Impacto Pré-Refatoração Atualização Propagação da Mudança Pós-Refatoração Nova Baseline Testes Iniciação Analisar a user story ou change request e extrair os conceitos relevantes ◦ Pode vir de um bug report ou de uma open source “wish list” ◦ Conceitos expressos em linguagem natural Localização de Conceitos Localizar os conceitos no código-fonte ◦ Conceitos podem ser explícitos ou implícitos ◦ Conceitos explícitos são representados como métodos, atributos, trechos de código e/ou classes ◦ Conceitos implícitos não estão implementados em código, deve-se achar conceitos similares que apontam onde o novo conceito deve ser implementado Análise de Impacto Identificar um conjunto de classes (ou métodos) provavelmente afetado pela mudança incremental ◦ Localização dos conceitos gera conjunto inicial de impacto ◦ Percorrendo o conjunto inicial e suas dependências, é possível achar que também precisarão mudar para implementar os novos conceitos Pré-Refatoração Refatorar para tornar a mudança mais fácil ◦ Atividade oportunista para limitar o tamanho da mudança e de sua propagação ◦ Exemplo: refatoração Extract Method pode colocar métodos, atributos e trechos de código relevante em uma nova classe que implementa o novo conceito Atualização Implementar os conceitos no códigofonte e incorporar o novo código ao sistema existente ◦ Se o conceito é implícito, cria-se nova classe e esta é plugada no resto do código através de dependências ◦ Se o conceito é explícito, o código já existente pode ser extraído para nova classe ou a classe já existe. Nova funcionalidade pode ser adicionada e dependências adicionais podem ser criadas. Propagação da Mudança Propagar a mudança através do sistema e corrigir inconsistências ◦ A partir das classes modificadas, o programador visita as suas dependências para checar se estas classes precisam ser modificadas também ◦ Mudanças de interface levam a mudanças em quem usa a interface ◦ Mudanças de semântica são mais complexas e requerem análise mais detalhada Pós-Refatoração Refatorar para eliminar falhas de design (bad smells) introduzidos durante a mudança ◦ Verificar se anti-patterns foram introduzidos pela mudança ◦ Bad smells comuns são Data Class, Long Method e Middle Man ◦ Arquitetura do software é melhorada para facilitar mudanças incrementais futuras Nova Baseline Atualizar o repositório do software como novo código, atualizar a documentação e lançar a nova versão para os clientes ◦ Podem ser necessárias várias rodadas de IC até terminar uma user story ou requisito ◦ Check-in no sistema de controle de versões ◦ Melhorar documentação (comentários de código, javadoc, documentação externa) ◦ Suporte ferramental facilita atualização de documentação Testes Testar o software ao longo do processo ◦ Testes de regressão depois da pré- e pósrefatoração para assegurar a não introdução de erros ◦ Criar casos de teste como parte da atualização para testar a nova funcionalidade ◦ Quando conceitos foram extraídos de uma classe, pode ser necessário mover testes de um caso de teste existente para o novo Referências Febbraro, N. and Rajlich,V. 2007. The Role of Incremental Change in Agile Software Processes. In Proceedings of the AGILE 2007 (August 13 - 17, 2007). AGILE. IEEE Computer Society, Washington, DC, 92-103. Petrenko, M., Poshyvanyk, D., Rajlich, V., and Buchta, J. 2007. Teaching Software Evolution in Open Source. Computer 40, 11 (Nov. 2007), 25-31. Rajlich, V. and Gosavi, P. 2004. Incremental Change in Object-Oriented Programming. IEEE Softw. 21, 4 (Jul. 2004), 62-69.