SlideShare uma empresa Scribd logo
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 1
Evolução de Software
e Refatoração
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 2
Mudança de software

Mudança de software é inevitável
• Novos requisitos surgem quando o software é usado
• O ambiente de negócio muda
• Erros devem ser reparados
• Novos computadores e equipamentos são adicionados ao
sistema
• O desempenho ou a confiabilidade do sistema deve ser
melhorada

Um problema-chave para as organizações é a
implementação e o gerenciamento de mudanças em
seus sistemas
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 3
Importância da evolução

As organizações fazem grandes investimentos
em seus sistemas de software – eles são ativos
críticos de negócios

Para manter o valor desses ativos de negócio,
eles devem ser mudados e atualizados

A maior parte do orçamento de software nas
grandes organizações é voltada para evolução,
ao invés do desenvolvimento de sistemas novos
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 4

Dinâmica de evolução de programas é o estudo
dos processos de mudança de sistema

Lehman e Belady propuseram que havia uma
série de ‘leis’ que se aplicavam a todos os
sistemas quando eles evoluiam

Na prática, são observáveis, de fato, mas com
ressalvas
• Aplicáveis principalmente a sistemas de grande porte
Dinâmica da evolução de programas
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 5
Leis de Lehman
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 6
Aplicabilidade das leis de Lehman

As leis de Lehman parecem ser aplicáveis a sistemas
customizados de grande porte desenvolvidos por
grandes organizações
• Confirmado em trabalho de Lehman sobre o projeto FEAST
(veja leitura adicional no Website do livro)

Não está claro como elas devem ser modificadas para
• Sistemas que incorporam um número significativo de
componentes COTS
• Pequenas organizações
• Sistemas de tamanho médio
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 7

É a modificação de um programa após ter sido
colocado em uso

A manutenção normalmente não envolve
mudanças consideráveis na arquitetura do
sistema

As mudanças são implementadas pela
modificação de componentes existentes e pela
adição de novos componentes ao sistema
Manutenção de software
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 8

Os sistemas estão fortemente acoplados ao
seu ambiente
• Quando um sistema é instalado em um
ambiente, ele muda esse ambiente e, portanto,
muda os requisitos de sistema

Portanto, os sistemas DEVEM ser mantidos
se forem úteis em um ambiente
A Manutenção é Inevitável
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 9

Manutenção para reparar defeitos de software
• Mudança em um sistema para corrigir deficiências de maneira
a atender seus requisitos

Manutenção para adaptar o software a um ambiente
operacional diferente
• Mudança de um sistema de tal maneira que ele opere em um
ambiente diferente (computador, OS, etc.) a partir de sua
implementação inicial

Manutenção para adicionar funcionalidade ao sistema
ou modificá-lo
• Modificação do sistema para satisfazer a novos requisitos
Tipos de manutenção
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 10
Distribuição de esforços de
manutenção
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 11

Geralmente, são maiores que os custos de
desenvolvimento (de 2 a 100 vezes, dependendo da
aplicação)

São afetados por fatores técnicos e não técnicos

A manutenção corrompe a estrutura do software,
tornando a manutenção posterior mais difícil
• Design Erosion

Software em envelhecimento pode ter altos custos de
suporte (por exemplo, linguagens antigas, compiladores,
etc.)
Custos de manutenção
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 12

Estabilidade da equipe
• Os custos de manutenção são reduzidos se o mesmo
pessoal estiver envolvido por algum tempo

Responsabilidade contratual
• Os desenvolvedores de um sistema podem não ter
responsabiidade contratual pela manutenção, portanto, não
há incentivo para projetar para mudanças futuras

Habilidade do pessoal
• O pessoal da manutenção geralmente é inexperiente e tem
conhecimento limitado de domínio

Idade e estrutura do programa
• À medida que os programas envelhecem, sua estrutura é
degradada e se torna mais difícíl de ser compreendida e
modificada
Fatores de custo de manutenção
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 13
Previsão de manutenção

Avaliação de quais partes do sistema podem
causar problemas e ter altos custos de
manutenção
• A aceitação de mudança depende da facilidade de
manutenção dos componentes afetados por ela
• A implementação de mudanças degrada o sistema e
reduz a sua facilidade de manutenção
• Os custos de manutenção dependem do número de
mudanças, e os custos de mudança dependem da
facilidade de manutenção
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 14
Processos de evolução

Os processos de evolução dependem
• Do tipo de software que está sendo mantido
• Dos processos de desenvolvimento usados
• Das habilidades e das experiências do pessoal
envolvido

Propostas para mudança são os direcionadores
para a evolução do sistema

Metodologias mais novas não costumam ter um
processo separado
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 15
O processo de evolução de sistema
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 16
Solicitações de mudança urgentes

Mudanças urgentes podem ter de ser implementadas
sem passar por todos os estágios do processo de
desenvolvimento de software
• Se um defeito sério de sistema tem de ser reparado
• Se mudanças no ambiente do sistema (por exemplo,
atualização do OS) têm efeitos inesperados
• Se existem mudanças de negócio que necessitam de uma
resposta muito rápida (e.g.mudança de lei)

POP – Patch-Oriented Programming
• Podem resultar em problemas ainda piores
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 17
Reengenharia de sistema

É a reestruturação ou reescrita de parte ou de todo
um sistema sem mudar sua funcionalidade
• Importante ressaltar: reestruturação de grande porte!

Aplicável onde partes de um sistema de grande
porte necessitam de manutenção frequente

Envolve a adição de esforço para tornar o sistema
mais fácil de manter
• Simplicidade é um objetivo complexo
18
Refatoração:
Melhorando a Qualidade de
Código Pré-Existente
Prof. Dr. Fabio Kon Prof. Dr. Alfredo Goldman
Departamento de Ciência da Computação
IME / USP
Laboratório de Programação eXtrema
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 19
Refatoração (Refactoring)

Uma [pequena] modificação no sistema que
não altera o seu comportamento funcional,
mas que melhora alguma qualidade não-
funcional:
• simplicidade
• flexibilidade
• clareza
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 20
Exemplos de Refatoração

Mudança do nome de variáveis

Mudanças nas interfaces dos objetos

Pequenas mudanças arquiteturais

Encapsular código repetido em um novo método

Generalização de métodos
• raizQuadrada(float x)raiz(float x,int n)
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 21
Aplicações
1. Melhorar código antigo e/ou feito por
outros programadores
2. Desenvolvimento incremental à la XP

Em geral, um passo de refatoração é tão
simples que parece pouco útil

Mas quando se juntam 50 passos, bem
escolhidos, em seqüência, o código melhora
radicalmente
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 22
Passos de Refatoração

Cada passo é trivial

Demora pouco tempo para ser realizado

É uma operação sistemática e óbvia

Os passos, individualmente, podem mudar o
comportamento do programa
• A sequência de passos que forma a refatoração
garante a preservação do comportamento

Atualmente, muitas refatorações são
automatizadas por ferramentas
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 23
Quando Usar Refatoração

Sempre há duas possibilidades:
1. Melhorar o código existente
2. Jogar fora e começar do 0

É sua responsabilidade avaliar a situação e
decidir optar por um ou por outro

Refatoração é importante para
desenvolvimento e evolução!
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 24
Catálogo de Refatorações

[Fowler, 1999] contém 72 refatorações

Análogo aos padrões de projeto orientado a
objetos [Gamma et al. 1995] (GoF)

Vale a pena gastar algumas horas com [Fowler,
1999]

(GoF é obrigatório, não tem opção)

[Fowler, 1999] Martin Fowler. Refactoring: Improving the Design of Existing
Code, Addison-Wesley, 1999.
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 25
Dica
Quando você tem que adicionar uma
funcionalidade a um programa e o código do
programa não está estruturado de uma forma
que torne a implementação desta
funcionalidade conveniente, primeiro refatore de
modo a facilitar a implementação da
funcionalidade e, só depois, implemente-a.
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 26
O Primeiro Passo em Qualquer
Refatoração

Antes de começar a refatoração, verifique se
você tem um conjunto sólido de testes para
verificar a funcionalidade do código a ser
refatorado

Refatorações podem adicionar erros
• Até mesmo as automatizadas

Os testes vão ajudá-lo a detectar erros se eles
forem criados.
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 27
Formato de Cada Entrada no
Catálogo

Nome da refatoração

Resumo da situação na qual ela é necessária
e o que ela faz

Motivação para usá-la (e quando não usá-la)

Mecânica, i.e., descrição passo a passo

Exemplos para ilustrar o uso
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 28
Extract Method (110)

Nome: Extract Method

Resumo: Você tem um fragmento de código que
poderia ser agrupado. Mude o fragmento para um novo
método e escolha um nome que explique o que ele faz.

Motivação: é uma das refatorações mais comuns.
Se um método é longo demais ou difícil de entender e
exige muitos comentários, extraia trechos do método e
crie novos métodos para eles. Isso vai melhorar as
chances de reutilização do código e vai fazer com que
os métodos que o chamam fiquem mais fáceis de
entender. O código fica parecendo comentário.
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 29
Extract Method (110)
Mecânica:
• Crie um novo método e escolha um nome que
explicite a sua intenção
• Copie o código do método original para o novo
• Procure por variáveis locais e parâmetros utilizados
pelo código extraído
• Se variáveis locais forem usadas apenas pelo código
extraído, passe-as para o novo método
• Caso contrário, veja se o seu valor é apenas atualizado pelo
código. Neste caso substitua o código por uma atribuição
• Se é tanto lido quando atualizado, passe-a como parâmetro
• Compile e teste
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 30
Extract Method (110)
Exemplo Sem Variáveis Locais
void imprimeDivida () {
Enumerate e = _pedidos.elementos ();
double divida = 0.0;
// imprime cabeçalho
System.out.println (“***************************”);
System.out.println (“*** Dívidas do Cliente ****”);
System.out.println (“***************************”);
// calcula dívidas
while (e.temMaisElementos ()){
Pedido cada = (Pedido) e.proximoElemento ();
divida += cada.valor ();
}
// imprime detalhes
System.out.println (“nome: ” + _nome);
System.out.println (“divida total: ” + divida);
}
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 31
Extract Method (110)
Exemplo Com Variáveis Locais
void imprimeDivida () {
Enumerate e = _pedidos.elementos ();
double divida = 0.0;
imprimeCabecalho ();
// calcula dívidas
while (e.temMaisElementos ()){
Pedido cada = (Pedido) e.proximoElemento ();
divida += cada.valor ();
}
//imprime detalhes
System.out.println(“nome: ” + _nome);
System.out.println(“divida total: ” + divida);
}
void imprimeCabecalho () {
System.out.println (“***************************”);
System.out.println (“*** Dívidas do Cliente ****”);
System.out.println (“***************************”);
}
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 32
Extract Method (110)
Exemplo COM Variáveis Locais
void imprimeDivida () {
Enumerate e = _pedidos.elementos ();
double divida = 0.0;
imprimeCabecalho ();
// calcula dívidas
while (e.temMaisElementos ()){
Pedido cada = (Pedido) e.proximoElemento ();
divida += cada.valor ();
}
imprimeDetalhes (divida);
}
void imprimeDetalhes (double divida)
{
System.out.println(“nome: ” + _nome);
System.out.println(“divida total: ” + divida);
}
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 33
Extract Method (110)
com atribuição
void imprimeDivida () {
imprimeCabecalho ();
double divida = calculaDivida ();
imprimeDetalhes (divida);
}
double calculaDivida ()
{
Enumerate e = _pedidos.elementos ();
double divida = 0.0;
while (e.temMaisElementos ()){
Pedido cada = (Pedido) e.proximoElemento ();
divida += cada.valor ();
}
return divida;
}
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 34
Extract Method (110)
depois de compilar e testar
void imprimeDivida () {
imprimeCabecalho ();
double divida = calculaDivida ();
imprimeDetalhes (divida);
}
double calculaDivida ()
{
Enumerate e = _pedidos.elementos ();
double resultado = 0.0;
while (e.temMaisElementos ()){
Pedido cada = (Pedido) e.proximoElemento ();
resultado += cada.valor ();
}
return resultado;
}
©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 35
Extract Method (110)
depois de compilar e testar

dá para ficar mais curto ainda:
void imprimeDivida () {
imprimeCabecalho ();
imprimeDetalhes (calculaDivida ());
}

mas não é necessariamente melhor pois é um pouco
menos claro.

Mais conteúdo relacionado

PPT
02_Processos_SW de Softwares aplicados a Engenharia de Software
PPT
02_Processos_SW de Softwares aplicados a Engenharia
PDF
E evolução de sw e seus conceitos e tudo o mais
PDF
09 gerenciamento de_configuracao_e_mudanca
PPT
07_slides de Estilos_Arquiteturais sommerville.ppt
PPT
10_ slides de Reuso sommerville cap 10.ppt
PPT
01_slides livro sommerville Introducao_ES.ppt
PPT
Engenharia de software introdução e engenharia
02_Processos_SW de Softwares aplicados a Engenharia de Software
02_Processos_SW de Softwares aplicados a Engenharia
E evolução de sw e seus conceitos e tudo o mais
09 gerenciamento de_configuracao_e_mudanca
07_slides de Estilos_Arquiteturais sommerville.ppt
10_ slides de Reuso sommerville cap 10.ppt
01_slides livro sommerville Introducao_ES.ppt
Engenharia de software introdução e engenharia

Semelhante a 09_Evolucao de software e_Refatoracao.ppt (20)

PDF
Aula 02 - Processo de Software I.pdf
PPTX
Modelo incremental
PPT
Introdução à Engenharia de Software
PDF
Capitulo 02 sommerville
PPTX
Aula 2 modelo de processo de software1
PPTX
Eng de soft. ciclo de vida PARTE(2)
PPTX
Es capítulo 2 - processos de software
PDF
Modelos de Processo de Software - INCREMENTAL
PDF
Aula 3 - Processos de Software.pdf
PPT
Rejuvenescimento Software
PPT
TDC 2013 7 Dicas para acelerar os testes
PPTX
Aula - Revisão.pptx fundamentos de engenharia de sw
PDF
Aula 2 - Processos de Software
PPTX
Eng.ª do Software - 4. Processos de software
PDF
Modelos e Padrões de Engenharia de Software
PPT
Analise sistemas 06
PPS
Manutenção de Software
PDF
Ciclo de Vida Clássico da Engenharia de Software
PDF
Implementando Entrega Contínua - Marco Valtas
Aula 02 - Processo de Software I.pdf
Modelo incremental
Introdução à Engenharia de Software
Capitulo 02 sommerville
Aula 2 modelo de processo de software1
Eng de soft. ciclo de vida PARTE(2)
Es capítulo 2 - processos de software
Modelos de Processo de Software - INCREMENTAL
Aula 3 - Processos de Software.pdf
Rejuvenescimento Software
TDC 2013 7 Dicas para acelerar os testes
Aula - Revisão.pptx fundamentos de engenharia de sw
Aula 2 - Processos de Software
Eng.ª do Software - 4. Processos de software
Modelos e Padrões de Engenharia de Software
Analise sistemas 06
Manutenção de Software
Ciclo de Vida Clássico da Engenharia de Software
Implementando Entrega Contínua - Marco Valtas
Anúncio

Último (8)

PDF
SLIDES - AULA 3 - CLASSES E OBJETOS EM JAVA - Material de Cleyton Souza - IFPB
PPT
05_slide especificacao de sistemas de software e a uml UML.ppt
PDF
SLIDES - AULA 7 - SWING - Cleyton Souza - IFPB
PDF
SLIDES - AULA 5 - HERANÇA - Material de Cleyton Souza - IFPB
PPT
06_slide de Arquitetura_de_Software .ppt
PDF
SLIDES - AULA 2 - INTRODUÇÃO - Material de Cleyton Souza - IFPB
PDF
SLIDES - AULA 1 - APRESENTAÇÃO - Material de Cleyton Souza - IFPB
PPT
03_slide de Gerenciamento de Projetos .ppt
SLIDES - AULA 3 - CLASSES E OBJETOS EM JAVA - Material de Cleyton Souza - IFPB
05_slide especificacao de sistemas de software e a uml UML.ppt
SLIDES - AULA 7 - SWING - Cleyton Souza - IFPB
SLIDES - AULA 5 - HERANÇA - Material de Cleyton Souza - IFPB
06_slide de Arquitetura_de_Software .ppt
SLIDES - AULA 2 - INTRODUÇÃO - Material de Cleyton Souza - IFPB
SLIDES - AULA 1 - APRESENTAÇÃO - Material de Cleyton Souza - IFPB
03_slide de Gerenciamento de Projetos .ppt
Anúncio

09_Evolucao de software e_Refatoracao.ppt

  • 1. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 1 Evolução de Software e Refatoração
  • 2. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 2 Mudança de software  Mudança de software é inevitável • Novos requisitos surgem quando o software é usado • O ambiente de negócio muda • Erros devem ser reparados • Novos computadores e equipamentos são adicionados ao sistema • O desempenho ou a confiabilidade do sistema deve ser melhorada  Um problema-chave para as organizações é a implementação e o gerenciamento de mudanças em seus sistemas
  • 3. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 3 Importância da evolução  As organizações fazem grandes investimentos em seus sistemas de software – eles são ativos críticos de negócios  Para manter o valor desses ativos de negócio, eles devem ser mudados e atualizados  A maior parte do orçamento de software nas grandes organizações é voltada para evolução, ao invés do desenvolvimento de sistemas novos
  • 4. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 4  Dinâmica de evolução de programas é o estudo dos processos de mudança de sistema  Lehman e Belady propuseram que havia uma série de ‘leis’ que se aplicavam a todos os sistemas quando eles evoluiam  Na prática, são observáveis, de fato, mas com ressalvas • Aplicáveis principalmente a sistemas de grande porte Dinâmica da evolução de programas
  • 5. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 5 Leis de Lehman
  • 6. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 6 Aplicabilidade das leis de Lehman  As leis de Lehman parecem ser aplicáveis a sistemas customizados de grande porte desenvolvidos por grandes organizações • Confirmado em trabalho de Lehman sobre o projeto FEAST (veja leitura adicional no Website do livro)  Não está claro como elas devem ser modificadas para • Sistemas que incorporam um número significativo de componentes COTS • Pequenas organizações • Sistemas de tamanho médio
  • 7. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 7  É a modificação de um programa após ter sido colocado em uso  A manutenção normalmente não envolve mudanças consideráveis na arquitetura do sistema  As mudanças são implementadas pela modificação de componentes existentes e pela adição de novos componentes ao sistema Manutenção de software
  • 8. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 8  Os sistemas estão fortemente acoplados ao seu ambiente • Quando um sistema é instalado em um ambiente, ele muda esse ambiente e, portanto, muda os requisitos de sistema  Portanto, os sistemas DEVEM ser mantidos se forem úteis em um ambiente A Manutenção é Inevitável
  • 9. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 9  Manutenção para reparar defeitos de software • Mudança em um sistema para corrigir deficiências de maneira a atender seus requisitos  Manutenção para adaptar o software a um ambiente operacional diferente • Mudança de um sistema de tal maneira que ele opere em um ambiente diferente (computador, OS, etc.) a partir de sua implementação inicial  Manutenção para adicionar funcionalidade ao sistema ou modificá-lo • Modificação do sistema para satisfazer a novos requisitos Tipos de manutenção
  • 10. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 10 Distribuição de esforços de manutenção
  • 11. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 11  Geralmente, são maiores que os custos de desenvolvimento (de 2 a 100 vezes, dependendo da aplicação)  São afetados por fatores técnicos e não técnicos  A manutenção corrompe a estrutura do software, tornando a manutenção posterior mais difícil • Design Erosion  Software em envelhecimento pode ter altos custos de suporte (por exemplo, linguagens antigas, compiladores, etc.) Custos de manutenção
  • 12. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 12  Estabilidade da equipe • Os custos de manutenção são reduzidos se o mesmo pessoal estiver envolvido por algum tempo  Responsabilidade contratual • Os desenvolvedores de um sistema podem não ter responsabiidade contratual pela manutenção, portanto, não há incentivo para projetar para mudanças futuras  Habilidade do pessoal • O pessoal da manutenção geralmente é inexperiente e tem conhecimento limitado de domínio  Idade e estrutura do programa • À medida que os programas envelhecem, sua estrutura é degradada e se torna mais difícíl de ser compreendida e modificada Fatores de custo de manutenção
  • 13. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 13 Previsão de manutenção  Avaliação de quais partes do sistema podem causar problemas e ter altos custos de manutenção • A aceitação de mudança depende da facilidade de manutenção dos componentes afetados por ela • A implementação de mudanças degrada o sistema e reduz a sua facilidade de manutenção • Os custos de manutenção dependem do número de mudanças, e os custos de mudança dependem da facilidade de manutenção
  • 14. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 14 Processos de evolução  Os processos de evolução dependem • Do tipo de software que está sendo mantido • Dos processos de desenvolvimento usados • Das habilidades e das experiências do pessoal envolvido  Propostas para mudança são os direcionadores para a evolução do sistema  Metodologias mais novas não costumam ter um processo separado
  • 15. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 15 O processo de evolução de sistema
  • 16. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 16 Solicitações de mudança urgentes  Mudanças urgentes podem ter de ser implementadas sem passar por todos os estágios do processo de desenvolvimento de software • Se um defeito sério de sistema tem de ser reparado • Se mudanças no ambiente do sistema (por exemplo, atualização do OS) têm efeitos inesperados • Se existem mudanças de negócio que necessitam de uma resposta muito rápida (e.g.mudança de lei)  POP – Patch-Oriented Programming • Podem resultar em problemas ainda piores
  • 17. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 17 Reengenharia de sistema  É a reestruturação ou reescrita de parte ou de todo um sistema sem mudar sua funcionalidade • Importante ressaltar: reestruturação de grande porte!  Aplicável onde partes de um sistema de grande porte necessitam de manutenção frequente  Envolve a adição de esforço para tornar o sistema mais fácil de manter • Simplicidade é um objetivo complexo
  • 18. 18 Refatoração: Melhorando a Qualidade de Código Pré-Existente Prof. Dr. Fabio Kon Prof. Dr. Alfredo Goldman Departamento de Ciência da Computação IME / USP Laboratório de Programação eXtrema
  • 19. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 19 Refatoração (Refactoring)  Uma [pequena] modificação no sistema que não altera o seu comportamento funcional, mas que melhora alguma qualidade não- funcional: • simplicidade • flexibilidade • clareza
  • 20. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 20 Exemplos de Refatoração  Mudança do nome de variáveis  Mudanças nas interfaces dos objetos  Pequenas mudanças arquiteturais  Encapsular código repetido em um novo método  Generalização de métodos • raizQuadrada(float x)raiz(float x,int n)
  • 21. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 21 Aplicações 1. Melhorar código antigo e/ou feito por outros programadores 2. Desenvolvimento incremental à la XP  Em geral, um passo de refatoração é tão simples que parece pouco útil  Mas quando se juntam 50 passos, bem escolhidos, em seqüência, o código melhora radicalmente
  • 22. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 22 Passos de Refatoração  Cada passo é trivial  Demora pouco tempo para ser realizado  É uma operação sistemática e óbvia  Os passos, individualmente, podem mudar o comportamento do programa • A sequência de passos que forma a refatoração garante a preservação do comportamento  Atualmente, muitas refatorações são automatizadas por ferramentas
  • 23. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 23 Quando Usar Refatoração  Sempre há duas possibilidades: 1. Melhorar o código existente 2. Jogar fora e começar do 0  É sua responsabilidade avaliar a situação e decidir optar por um ou por outro  Refatoração é importante para desenvolvimento e evolução!
  • 24. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 24 Catálogo de Refatorações  [Fowler, 1999] contém 72 refatorações  Análogo aos padrões de projeto orientado a objetos [Gamma et al. 1995] (GoF)  Vale a pena gastar algumas horas com [Fowler, 1999]  (GoF é obrigatório, não tem opção)  [Fowler, 1999] Martin Fowler. Refactoring: Improving the Design of Existing Code, Addison-Wesley, 1999.
  • 25. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 25 Dica Quando você tem que adicionar uma funcionalidade a um programa e o código do programa não está estruturado de uma forma que torne a implementação desta funcionalidade conveniente, primeiro refatore de modo a facilitar a implementação da funcionalidade e, só depois, implemente-a.
  • 26. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 26 O Primeiro Passo em Qualquer Refatoração  Antes de começar a refatoração, verifique se você tem um conjunto sólido de testes para verificar a funcionalidade do código a ser refatorado  Refatorações podem adicionar erros • Até mesmo as automatizadas  Os testes vão ajudá-lo a detectar erros se eles forem criados.
  • 27. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 27 Formato de Cada Entrada no Catálogo  Nome da refatoração  Resumo da situação na qual ela é necessária e o que ela faz  Motivação para usá-la (e quando não usá-la)  Mecânica, i.e., descrição passo a passo  Exemplos para ilustrar o uso
  • 28. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 28 Extract Method (110)  Nome: Extract Method  Resumo: Você tem um fragmento de código que poderia ser agrupado. Mude o fragmento para um novo método e escolha um nome que explique o que ele faz.  Motivação: é uma das refatorações mais comuns. Se um método é longo demais ou difícil de entender e exige muitos comentários, extraia trechos do método e crie novos métodos para eles. Isso vai melhorar as chances de reutilização do código e vai fazer com que os métodos que o chamam fiquem mais fáceis de entender. O código fica parecendo comentário.
  • 29. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 29 Extract Method (110) Mecânica: • Crie um novo método e escolha um nome que explicite a sua intenção • Copie o código do método original para o novo • Procure por variáveis locais e parâmetros utilizados pelo código extraído • Se variáveis locais forem usadas apenas pelo código extraído, passe-as para o novo método • Caso contrário, veja se o seu valor é apenas atualizado pelo código. Neste caso substitua o código por uma atribuição • Se é tanto lido quando atualizado, passe-a como parâmetro • Compile e teste
  • 30. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 30 Extract Method (110) Exemplo Sem Variáveis Locais void imprimeDivida () { Enumerate e = _pedidos.elementos (); double divida = 0.0; // imprime cabeçalho System.out.println (“***************************”); System.out.println (“*** Dívidas do Cliente ****”); System.out.println (“***************************”); // calcula dívidas while (e.temMaisElementos ()){ Pedido cada = (Pedido) e.proximoElemento (); divida += cada.valor (); } // imprime detalhes System.out.println (“nome: ” + _nome); System.out.println (“divida total: ” + divida); }
  • 31. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 31 Extract Method (110) Exemplo Com Variáveis Locais void imprimeDivida () { Enumerate e = _pedidos.elementos (); double divida = 0.0; imprimeCabecalho (); // calcula dívidas while (e.temMaisElementos ()){ Pedido cada = (Pedido) e.proximoElemento (); divida += cada.valor (); } //imprime detalhes System.out.println(“nome: ” + _nome); System.out.println(“divida total: ” + divida); } void imprimeCabecalho () { System.out.println (“***************************”); System.out.println (“*** Dívidas do Cliente ****”); System.out.println (“***************************”); }
  • 32. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 32 Extract Method (110) Exemplo COM Variáveis Locais void imprimeDivida () { Enumerate e = _pedidos.elementos (); double divida = 0.0; imprimeCabecalho (); // calcula dívidas while (e.temMaisElementos ()){ Pedido cada = (Pedido) e.proximoElemento (); divida += cada.valor (); } imprimeDetalhes (divida); } void imprimeDetalhes (double divida) { System.out.println(“nome: ” + _nome); System.out.println(“divida total: ” + divida); }
  • 33. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 33 Extract Method (110) com atribuição void imprimeDivida () { imprimeCabecalho (); double divida = calculaDivida (); imprimeDetalhes (divida); } double calculaDivida () { Enumerate e = _pedidos.elementos (); double divida = 0.0; while (e.temMaisElementos ()){ Pedido cada = (Pedido) e.proximoElemento (); divida += cada.valor (); } return divida; }
  • 34. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 34 Extract Method (110) depois de compilar e testar void imprimeDivida () { imprimeCabecalho (); double divida = calculaDivida (); imprimeDetalhes (divida); } double calculaDivida () { Enumerate e = _pedidos.elementos (); double resultado = 0.0; while (e.temMaisElementos ()){ Pedido cada = (Pedido) e.proximoElemento (); resultado += cada.valor (); } return resultado; }
  • 35. ©Ian Sommerville 2006 Engenharia de Software, 8ª. edição. Capítulo 21 Slide 35 Extract Method (110) depois de compilar e testar  dá para ficar mais curto ainda: void imprimeDivida () { imprimeCabecalho (); imprimeDetalhes (calculaDivida ()); }  mas não é necessariamente melhor pois é um pouco menos claro.