Padrões de Reengenharia Orientada a Objetos Nome: Gewerton J. Gomes da Cruz Silva Prof: Fabio Kon 1 Contexto O software é um produto que evolui constantemente. São realizadas diversas atividades de manutenção: Degradando o código fonte. Tornando-o difícil de mantê-lo. Normalmente a documentação não é atualizada. Estes são os chamados sistemas legados. Única documentação acaba sendo o próprio código fonte. 2 Qual a importância dos sistemas legados nas empresas? É grande o interesse da empresa em manter estes softwares em funcionamento, pois: São considerados propriedades. Agregam lógicas do negócio codificadas. Investimento realizado. Anos de desenvolvimento e testes. Experiências. Estratégias empresariais. 3 Atividades de manutenção Geralmente são realizadas quando é necessário: Adicionar novas funcionalidades: Adaptar o sistema a novas tecnologias emergentes: Satisfazer novas regras do negócio. Adaptar a novas políticas governamentais. Software Hardware Corrigir erros que foram introduzidos em manutenções anteriores do sistema. Adicionar melhorias no sistema: Facilitar manutenções futuras. Melhorar a confiabilidade. 4 Termos relacionados a Reengenharia de Software Engenharia avante Engenharia reversa Redocumentação Recuperação do projeto Reestruturação Reengenharia 5 Engenharia reversa Processo de análise de um sistema legado. Identifica seus componentes e relacionamentos, e os representa em um nível mais alto de abstração. Pode ser classificada como: Redocumentação – Criação ou revisão da representação da abstração semântica do sistema. Recuperação do projeto – Considera domínio do conhecimento e informações externas para identificar no sistema abstrações de alto nível. O que o sistema faz? Como? Por que? 7 Reestruturação Transformação de uma maneira de representação do sistema para outra no mesmo nível de abstração. É preservado o comportamento externo: Funcionalidade Semântica Este termo também é conhecido como Refatoração. 8 Reengenharia Consiste na análise e alteração do sistema para reconstruí-lo em uma nova forma. Também conhecida como Renovação. Geralmente inclui Engenharia Reversa seguida por Engenharia Avante ou Reconstrução. Transforma uma implementação concreta em outra implementação concreta. Custo efetivo e menos riscos do que desenvolver um novo sistema. 9 Representação dos conceitos 10 Riscos associados à Reengenharia Diversos riscos devem ser evitados no processo de reengenharia: Não cumprimento de prazo e custo estipulados. Ausência de garantia de qualidade do sistema resultante. Grande extensão e alto custo da documentação. Dificuldade de recuperar o projeto e requisitos a partir do código fonte. Perda do conhecimento do negócio embutido no código fonte. Dificuldade na migração dos dados existentes. Ausência de conhecimento e experiência dos envolvidos no projeto. 11 Padrões de Reengenharia Codificam a gravam informações sobre as modificações do software legado. Ajudam a diagnosticar problemas. Detectam fraquezas. Facilita futuros desenvolvimentos adicionais do sistema. Ajuda a encontrar as soluções mais apropriadas para as novas exigências. Determina os problemas existentes no atual sistema, reparando-os. A Refatoração do código é apenas o último estágio deste processo. 12 Mapa de padrões de Reengenharia 13 Iniciação do sistema legado Agrupa os padrões que mostram o que fazer quando se tem o primeiro contato com o sistema de software. Alguns padrões desta etapa: Ler todo o código em uma hora. Estudar superficialmente a documentação. Entrevistar o usuário durante o sistema em execução. 14 Ler todo código em uma hora Intuito – Fazer avaliação inicial da condição interna do Problema – Precisa-se desta avaliação para planejar Contexto: sistema. esforços da engenharia reversa. A condição interna do sistema varia muito. Alguns sistemas possuem muitas linhas de código. Falta de familiaridade do engenheiro de software com o sistema. Tem-se o código fonte disponível como informação confiável. O engenheiro têm boa habilidade com a linguagem usada no sistema legado. 15 Ler todo o código em uma hora (cont.) Solução: Ler o código fonte sem ser interrompido. Anote pouca coisa, maximizando o contato com o código. Gaste mais uma hora criando um relatório: Entidades importantes (classes, packages). Estilo de código de difícil interpretação. Dê nome as entidades de acordo como são mencionadas no código fonte. Padrões relacionados – Juntamente com o padrão Estudar Superficialmente a Documentação, eles maximizam a chance de se obter uma visão coerente do sistema. 16 Estudar Superficialmente a Documentação Intuito – Supor a funcionalidade do sistema por meio da leitura da documentação existente. Problema – Planejar os esforços necessários para a realização da engenharia reversa a a partir da idéia inicial do sistema. Contexto: A funcionalidade do sistema muda com o tempo. Alguns sistemas possuem muitas linhas de código. A falta de familiaridade do engenheiro com o sistema. Tem-se a documentação disponível. O engenheiro é capaz de interpretar especificações formais do sistema. 17 Estudar Superficialmente a Documentação (cont.) Solução: Ler a documentação sem ser interrompido. Faça pouca anotação para facilitar o contato com a documentação. Utilize mais uma hora para montar um relatório: Requisitos importantes. Características importantes. Limitações importantes. Referências para informações relevantes do projeto. Padrões relacionados – O padrão Entrevistar o Usuário Durante o Sistema em Operação pode ajudar a coletar uma lista de entidades que se deseja analisar na documentação. 18 Entrevistar o Usuário Durante o Sistema em Operação Intuito – Obter a idéia inicial da funcionalidade do sistema observando-o em operação. Problema – Dimensionar os esforços necessários para realizar a engenharia reversa através: Cenários típicos de uso. Funcionalidades do sistema. Contexto: Variação do uso de cenários entre diferentes usuários. É difícil obter a partir do usuário o que há de errado no sistema. O engenheiro de software tem acesso a pessoas chaves na organização (usuários, gerentes, técnicos). 19 Entrevistar o Usuário Durante o Sistema em Operação (cont.) Solução: Observar o sistema em operação através da sua demonstração e entrevistar o usuário. Produzir um relatório contendo suas constatações: Alguns cenários típicos. Características principais (apreciadas ou não). Componentes (encapsulamento) do sistema e suas responsabilidades. Padrões relacionados – Dependendo da complexidade do sistema, pode-se exercitar esse padrão antes, depois ou durante o uso dos padrões Ler Todo Código em Uma Hora e Estudar Superficialmente a Documentação. 20 Entendimento Inicial Agrupa os padrões que descrevem como obter um entendimento inicial de um sistema de software documentado, principalmente, com diagramas de classes. Alguns padrões desta etapa: Presumir prováveis objetos. Examinar o banco de dados. Inspecionar as maiores construções. Explorar possíveis modificações. 21 Presumir Prováveis Objetos Intuito – Refinar, progressivamente um modelo de objetos de acordo com o código fonte. Problema – Não se sabe como os conceitos de negócio estão mapeados em classes no código. Contexto: Existem muitos conceitos no sistema, assim há várias maneiras de representá-los na linguagem utilizada. Entende-se a funcionalidade do sistema. Devido a experiência do engenheiro ele pode imaginar como modelar o sistema. Muito das linhas de código não tem relação com a representação dos conceitos do sistema, mas sim com a solução. 22 Presumir Prováveis Objetos (cont.) Solução: Idealizar um modelo hipotético de classes do sistema. Refinar o modelo verificando se os nomes das classes ocorrem no código fonte e adaptando-o. Repita o processo até que o modelo se estabilize. Modelo de classes que sirva de hipótese inicial. Relacionar os nomes num diagrama de classes tentando encontrá-los no código fonte. Anotar nomes que aparecem ou não no código. Adaptar o modelo de classes baseado nas discordâncias. Padrões relacionados – Todos os padrões de Iniciação ao Sistema Legado auxiliam na construção deste modelo hipotético de classes. 23 Examinar o banco de dados Intuito – Adequar o modelo de objetos, obtido no padrão anterior, com o banco de dados do sistema. Problema – Não se conhece quais os objetos que são críticos para a funcionalidade do sistema. Contexto – Reconstruir o modelo de classes a partir das tabelas do banco de dados relacional. 24 Examinar o Banco de Dados (cont.) Solução: Derivar um modelo de classes representando as entidades que estão armazenadas em tabelas no banco. Os seguintes passos devem ser aplicados; Construir um modelo de classes (cada tabela = classe) Selecionar como atributos o nome das colunas da tabela. Selecionar relacionamentos entre tabelas considerando associação entre classes. Verificar relacionamentos um-para-um como herança. Padrões relacionados – Este padrão requer um entendimento inicial do sistema, o qual é obtido com o padrão Presumir Prováveis Objetos. 25 Inspecionar as maiores construções Intuito – Identificar trechos importantes de código inspecionando as maiores construções. Problema – Não se sabe onde está implementada uma funcionalidade importante em milhares linhas de código. Contexto: Não é fácil saber o que é mais ou menos importante no código. Muitas linhas de código torna difícil uma avaliação correta. Utilizando ferramentas de determinação de métricas é possível quantificar o tamanho das entidades. 26 Inspecionar as Maiores Construções (cont.) Solução: Usar ferramentas de determinação de métricas para coletar um conjunto limitado de medidas sobre as entidades. Represente os resultados de forma que seja fácil avaliar diferentes medidas para uma mesma entidade. Padrões relacionados – O padrão Explorar Possíveis Modificações pode ser usado para focar nas partes do sistema que mudaram nas diferentes versões. 27 Explorar Possíveis Modificações Intuito – Reconstruir o processo iterativo da construção do sistema, pela comparação de versões. Problema – Recuperar o que os desenvolvedores do sistema alteraram no desenvolvimento e manutenções. Contexto: O sistema tem sido modificado através de novas atualizações de versões. Comparar diversas versões é muito trabalhoso. Algumas ferramentas mostram as alterações realizadas em cada versão, a partir da análise do código. Devido a experiência do engenheiro ele pode inferir porque certas modificações foram aplicadas. 28 Explorar Possíveis Modificações (cont.) Solução – Usar ferramentas de determinação de métricas para comparar medidas das versões (aumentaram ou diminuíram). Padrões relacionados - O padrão Inspecionar as Maiores Construções pode ser usado para descobrir as partes do sistema que mudaram entre as versões. 29 Detalhamento do sistema Agrupa os padrões que mostram como obter um entendimento detalhado de um determinado componente em seu sistema de software. Alguns padrões desta etapa: Verificar as Invocações de Métodos. Observar a Execução dos Componentes. 30 Verificar as Invocações de Métodos Intuito – Saber como uma classe está relacionada com outra. Problema – Obter relacionamento entre classes. Contexto: Neste estágio tem-se uma visão global da funcionalidade do sistema. Com uma ferramenta adequada pode-se identificar onde o método está definido a partir de sua chamada. Solução – Através da inspeção de uma chamada do método, encontrar a definição do mesmo. Padrões relacionados – Os padrões Inspecionar as Maiores Construções e Explorar Possíveis Modificações pode ajudar a descobrir funcionalidades importantes. 31 Observar a Execução dos Componentes Intuito – Obter um entendimento detalhado do comportamento de uma parte do sistema, executando seus componentes. Problema – É preciso obter um entendimento detalhado sobre uma parte encapsulada do código. Contexto: Baseado no entendimento do do sistema pode-se selecionar trechos de código para inspeção. Com um depurador é possível se interagir com a execução. 32 Observar a Execução dos Componentes (cont.) Solução: Alimentar a entrada do pedaço de código fonte para se obter uma seqüência normal de operações. Usar um depurador para acompanhar a execução passo a passo. Inspecionar o estado interno do pedaço de código. Padrões relacionados – Os padrões Inspecionar as Maiores Construções e Explorar Possíveis Modificações podem ser usados para descobrir funcionalidade importante a ser avaliada. 33 Preparação da Reengenharia Possui um padrão que ajuda a preparar os passos subseqüentes da reengenharia. Padrão desta etapa: Refazer para entender. 34 Refazer Para Entender Intuito – Obter um melhor entendimento de uma parte específica do código fonte, refazendo-a. Problema – Compreender um particular trecho de código que aparenta ser importante mas é muito difícil de analisá-lo. Contexto: Código sem documentação é difícil de se ler. Alterar código se documentação pode causar efeitos colaterais. 35 Refazer Para Entender (cont.) Solução: Renomear interativamente e refazer o código. Remover código duplicado (criando métodos). Substituir trechos condicionais por métodos. Substituir trechos de código longo por métodos. Renomear atributos com nome significativos. Renomear métodos com intuitos significativos. Renomear classes com propósitos significativos. Padrões relacionados – Para ajudar a entender a funcionalidade, pode-se usar o padrão Observar a Execução dos Componentes. 36 FIM 37