Você está na página 1de 87

Práticas Ágeis

IC, TDD e Refactoring


Professor Marcelo Pacote – @professorpacote

W W W. D O M I N A N D OT I .CO M . B R W W W. D O M I N A N D OT I .CO M . B R
Acesse nosso site em
WWW.DOMINANDOTI.COM.BR

Cursos Turmas em Brasília, na sua cidade, e cursos online


Livros Edições publicadas, lançamentos e promoções
Fórum Interação direta entre estudantes e com os professores

Simulados Questões inéditas, ranking de notas e correções em vídeo

Blog Dicas e macetes de estudo, indicações de bibliografia, etc.

Materiais Versões atualizadas de notas de aula e listas de exercícios

Curta o Dominando TI no
e receba nossas dicas sobre concursos!

W W W. D O M I N A N D OT I .CO M . B R
Integração Contínua - Conceito

 Abordagem para manter todo código integrado

 Implantar software a qualquer momento


 Software tecnologicamente pronto para o lançamento, ainda
que não esteja funcionalmente concluído.

 Ciclos curtos de integração


 Intervalos de algumas horas tornam o processo menos
doloroso.

Professor Marcelo Pacote - @professorpacote 3 W W W. D O M I N A N D OT I .CO M . B R


Integração Contínua

 Reduzir escopo de possíveis erros


 Apenas o código incluído desde o últimobuild pode ter inserido
erro no software.
 Evita caçar bugs gerados por outros ou culpar a equipe por
erros gerados pelo desenvolvedor
 “Estava funcionando em minha máquina!”
 A cada integração
 Gerar um CD
 Armazenar em um repositório
 Implantar em um servidor

Professor Marcelo Pacote - @professorpacote 4 W W W. D O M I N A N D OT I .CO M . B R


Integração Contínua - Roteiro

2. Obter token

7. [Opciona]Deploy

4. Compilação + testes unitários

7. Compilação e
testes
3. Update

5. Commit

Servidor de IC

1.
Desenvolvimento 6. update
+ compilação+
testes unitários

Professor Marcelo Pacote - @professorpacote 5 W W W. D O M I N A N D OT I .CO M . B R


Integração Contínua - servidores

 CruiseControl (open-source)
 Hudson X Jenkins
 Team Foundation (comercial – Micro$oft)
 TeamCity (comecial - Jetbrains)
 Rational Team Concert (comercial)
 AntHill (comercial)
 Continuum (open-source – Apache Foundation)
 Bamboo (comercial)
 LuntBuild (open-source) X QuickBuild
Professor Marcelo Pacote - @professorpacote 6 W W W. D O M I N A N D OT I .CO M . B R
Integração Contínua - Exemplo

Professor Marcelo Pacote - @professorpacote 7 W W W. D O M I N A N D OT I .CO M . B R


Integração Contínua – considerações

 Ten-minute build
 Integração em vários estágios
 Necessário: compilação, testes de unidade, integração
 Secundário: testes de desempenho, carga e estabilidade
 Elementos essenciais para IC
 Sistema de controle de versão
 Construção em dez minutos
 Por que um servidor de integração contínua?
 Prova que o sistema funciona em qualquer ambiente
 Exemplo: commit de um arquivo é esquecido

Professor Marcelo Pacote - @professorpacote 8 W W W. D O M I N A N D OT I .CO M . B R


(TJ-PI/2009/FCC/Analista/An. Sistemas)

XP (eXtreme Programming) é uma metodologia ágil para equipes pequenas e


médias que desenvolverão software com requisitos vagos e em constante
mudança. Para isso, adota a estratégia de constante acompanhamento e
realização de vários pequenos ajustes durante o desenvolvimento de software.
Para aplicar os valores e princípios durante o desenvolvimento de software, a XP
propõe uma série de práticas, sendo uma delas: sempre que produzir uma nova
funcionalidade, nunca esperar uma semana para integrar à versão atual do
sistema a fim de evitar o aumento da possibilidade de conflitos e da possibilidade
de erros no código fonte. Tal prática é denominada
A - Refatoração. B - Integração Contínua.
C - Desenvolvimento Orientado a Testes.
D - Ritmo Sustentável. E - Time Coeso.

Professor Marcelo Pacote - @professorpacote 9 W W W. D O M I N A N D OT I .CO M . B R


Desenvolvimento Orientado a Testes
TDD
Professor Marcelo Pacote – @professorpacote

W W W. D O M I N A N D OT I .CO M . B R W W W. D O M I N A N D OT I .CO M . B R
TDD – Motivação

 Trata-se de um ciclo rápido de testes, codificação e


refatoração.

 Código de testes é escrito antes do código de produção.

 Os testes são escritos em função de uma interface pública


 Foco no comportamento e não na implementação

Professor Marcelo Pacote - @professorpacote 11 W W W. D O M I N A N D OT I .CO M . B R


TDD – Passos para utilização

1. Pense
Novo
Pequenos incrementos por vez teste

2. Vermelho (falha)
Escreva um teste que falha Refatore Falha

3. Verde (sucesso)
Escreva código para passar nos testes Sucesso
4. Refatore
Revise e código e faça melhorias
5. Repita
Reinicie o ciclo. O segredo são os pequenos incrementos.
Professor Marcelo Pacote - @professorpacote 12 W W W. D O M I N A N D OT I .CO M . B R
TDD – Exemplo

 Tarefa:
 Cálculo de Fatorial

 Exemplos:
 0! = 1 1! = 1
 2! = 2 x 1 = 2 3! = 3 x 2 x 1 = 6

 JUnit
 assertEquals(“Teste”,”test”); //falha
 assertEquals(32, 32); //sucesso

Professor Marcelo Pacote - @professorpacote 13 W W W. D O M I N A N D OT I .CO M . B R


TDD – Exemplo (passos 1 e 2)

 0! é 1

Professor Marcelo Pacote - @professorpacote 14 W W W. D O M I N A N D OT I .CO M . B R


TDD – Exemplo (passo 3, 4 e 5)

Professor Marcelo Pacote - @professorpacote 15 W W W. D O M I N A N D OT I .CO M . B R


TDD – Exemplo (segunda iteração)

 1! é 1

Professor Marcelo Pacote - @professorpacote 16 W W W. D O M I N A N D OT I .CO M . B R


TDD – Exemplo (terceira iteração) (1/2)

 2! é 2

Professor Marcelo Pacote - @professorpacote 17 W W W. D O M I N A N D OT I .CO M . B R


TDD – Exemplo (terceira iteração) (2/2)

 Corrigir teste com erro

 “limpar” o código

Professor Marcelo Pacote - @professorpacote 18 W W W. D O M I N A N D OT I .CO M . B R


TDD – Exemplo (quarta iteração)

 Escrever o teste

 Corrigir o teste com erro

Professor Marcelo Pacote - @professorpacote 19 W W W. D O M I N A N D OT I .CO M . B R


TDD – Exemplo (quinta iteração)

 Teste

 Corrigir o teste com erro

Professor Marcelo Pacote - @professorpacote 20 W W W. D O M I N A N D OT I .CO M . B R


TDD – Ferramentas de Testes

 xUnit
 nome genérico para qualquer estrutura de testes
automáticos unitários.

 Junit (java)
 Nunit (.net)
 TestNG

Professor Marcelo Pacote - @professorpacote 21 W W W. D O M I N A N D OT I .CO M . B R


TDD – Teste de unidade

 Os testes devem ser rápidos


 Menos de 10 segundos
 Requisitos
 Não se comunicam com bases de dados
 Não se comunicam por meio de uma rede
 Não acessa sistema de arquivos
 Não é necessário configurar ambiente para executá-los
 Se não cumprem estes requisitos, são testes de integração.

Professor Marcelo Pacote - @professorpacote 22 W W W. D O M I N A N D OT I .CO M . B R


TDD – Objetos falsos (Mock Objects)

 Mock Objects isolam classes para testes de unidades


 Evitam comunicação demorada com bases de dados, web
services, sistemas de arquivos.
 Adicionam complexidade ao teste

 Exemplos de ferramentas
 Mockito
 EasyMock
 JMock

Professor Marcelo Pacote - @professorpacote 23 W W W. D O M I N A N D OT I .CO M . B R


(Basa/2012/Cespe/An. Sistemas)

( ) Metodologias de desenvolvimento XP contam com o


desenvolvimento orientado a testes, que engloba duas etapas:
escrever um teste automatizado e desenvolver um código
adequado o suficiente para ter sucesso nesse teste.

Professor Marcelo Pacote - @professorpacote 24 W W W. D O M I N A N D OT I .CO M . B R


(TRE/SP/2012/FCC/Prog. Sistemas)

Sobre desenvolvimento baseado em testes, considere:


I. Este processo requer que desenvolvedores criem unidades de testes para definir
os requisitos que um determinado código deve conter. Estes testes devem ser
criados assim que uma pequena parte funcional do código esteja disponível.
II. Frequentemente são utilizados frameworks de teste pelos desenvolvedores
como o xUnit ou jUnit para a criação de casos de teste automatizados.
III. É importante que o código escrito seja apenas projetado para passar o teste
específico. Nenhuma outra funcionalidade deve ser prevista ou permitida fora do
escopo do teste em nenhum estágio do processo.
Está correto o que consta em
A - I, apenas. B - II, apenas. C - I e III, apenas.
D - II e III, apenas. E - I, II e III.

Professor Marcelo Pacote - @professorpacote 25 W W W. D O M I N A N D OT I .CO M . B R


Refatoração

Professor Marcelo Pacote – @professorpacote

W W W. D O M I N A N D OT I .CO M . B R W W W. D O M I N A N D OT I .CO M . B R
Refatoração

 Refatoração: alteração feita na estrutura interna do software


para torná-lo mais fácil de ser entendido e menos custoso de
ser modificado sem alterar seu comportamento observável.
 O que o software faz permanece inalterado. Apenas o como é
modificado.

 Identificar melhorias por meio dos “cheiros” do código


 Sintomas de um design ruim

 Cada refatoração é como fazer um movimento com cubo mágico.

Professor Marcelo Pacote - @professorpacote 27 W W W. D O M I N A N D OT I .CO M . B R


Refatoração

 Vantagens:
 Melhora o projeto de software.
 Torna o software mais fácil de entender.
 Ajuda a encontrar falhas.
 Ajuda a programar mais rapidamente.
 Momento:
 Quando acrescentar funções.
 Quando corrigir uma falha.
 Quando revisar código.

Professor Marcelo Pacote - @professorpacote 28 W W W. D O M I N A N D OT I .CO M . B R


Refatoração – “Cheiros”

 Alteração divergente (divergent change):


 “Uma classe é frequentemente alterada de diferentes maneiras por
diferentes razões”.
 Exemplo: necessidade de alterar três métodos quando da inclusão de um
novo banco de dados.
 Refatoração: extrair classe
 Cirurgia com rifle ou cirurgia imposta (shotgun surgery):
 Oposto da alteração divergente.
 Pequenas alterações em muitas classes.
 Refatoração: mover método, mover campo e internalizar classe.

Professor Marcelo Pacote - @professorpacote 29 W W W. D O M I N A N D OT I .CO M . B R


Refatoração – Extrair classe

 Criar uma nova classe e mover atributos e métodos


relevantes para ela.

Professor Marcelo Pacote - @professorpacote 30 W W W. D O M I N A N D OT I .CO M . B R


Refatoração – Mover método

 Criar novo método com funcionalidade similar na classe que


mais a utiliza.

 A refatoração mover campo é análoga.

Professor Marcelo Pacote - @professorpacote 31 W W W. D O M I N A N D OT I .CO M . B R


Refatoração – Internalizar Classe

 É o contrário de Extrair Classe

Professor Marcelo Pacote - @professorpacote 32 W W W. D O M I N A N D OT I .CO M . B R


Refatoração – “Cheiros”

 Obsessão Primitiva (Primitive Obsession):


 Exemplo: um decimal representando moeda ou string representando CEP.
 Solução é encapsular conceito em uma classe
 Refatoração: Substituir Atributo por Objeto, introduzir Objeto Parâmetro,
Extrair Classe, entre outros.
 Agrupamento de Dados (Data Clumps):
 Vários primitivos representam um conceito como um grupo
 Exemplo: várias strings poderiam representar um endereço. Em vez de
estarem encapsuladas em uma classe, os dados ficam agrupados.
 Refatoração: Extrair Classe, Introduzir Objeto Parâmetro e Preservar o
Objeto Inteiro

Professor Marcelo Pacote - @professorpacote 33 W W W. D O M I N A N D OT I .CO M . B R


Refatoração – Preservar o Objeto Inteiro

 Várias informações são recuperadas de um objeto e


repassadas como parâmetro em uma chamada de método.

Professor Marcelo Pacote - @professorpacote 34 W W W. D O M I N A N D OT I .CO M . B R


Refatoração – “Cheiros”

 Classes de Dados (Data Class):


 Erro comum: dados e código em classes separadas.
 Uma classe apenas com métodos get/set é uma Classe de Dados.
 Refatoração: Mover Método, Encapsular Campo e Encapsular Coleção.
 Comentários (Comments):
 Pode indicar código mal estruturado
 Refatoração: Extrair Método, Renomear Método e Introduzir Asserções

Professor Marcelo Pacote - @professorpacote 35 W W W. D O M I N A N D OT I .CO M . B R


Refatoração – Encapsular Coleção

 Um método retorna uma coleção. Torná-la read-only e


fornecer métodos de inclusão/remoção.

Professor Marcelo Pacote - @professorpacote 36 W W W. D O M I N A N D OT I .CO M . B R


Refatoração – “Cheiros”

 Código duplicado:
 Resultado de copy and paste programming.
 Principal problema gerado é a dificuldade de manutenção: alteração em
vários pontos de código.
 Também pode ocorrer por duplicação de funcionalidade
 Refatoração: extrair classe, extrair método, substituir algoritmo (e outros ...)
 Lista de parâmetros longa
 Baixa legibilidade
 Refatoração: Substituir parâmetros por método, preservar objeto inteiro e
introduzir objeto parâmetro

Professor Marcelo Pacote - @professorpacote 37 W W W. D O M I N A N D OT I .CO M . B R


Refatoração – Substituir Algoritmo

 Alterar o corpo
de um método
com um novo
algoritmo.

Professor Marcelo Pacote - @professorpacote 38 W W W. D O M I N A N D OT I .CO M . B R


Refatoração – Introduzir objeto parâmetro

 Substituir grupos de parâmetros por um objeto.

Professor Marcelo Pacote - @professorpacote 39 W W W. D O M I N A N D OT I .CO M . B R


Refatoração – Extrair método

 Transformar um fragmento de código em um método cujo


nome explica seu propósito.

Professor Marcelo Pacote - @professorpacote 40 W W W. D O M I N A N D OT I .CO M . B R


Refatoração – “Cheiros”

 Inveja de dados (Feature Envy):


 Ocorre quando um método faz muitas chamadas a outras classes para
obter dados ou funcionalidade.
 Refatoração: extrair método, mover método e mover campo
 Classes grandes
 Classes com excesso de responsabilidades
 Tipicamente contém grande número de atributos
 Refatoração: extrair classe, extrair subclasse, extrair interface

Professor Marcelo Pacote - @professorpacote 41 W W W. D O M I N A N D OT I .CO M . B R


Refatoração

 Métodos longos
 Comandos Switch:
 Use polimorfismo.
 Hierarquias paralelas de herança.
 Ao criar uma subclasse em uma hierarquia é obrigatório a criação de outra
subclasse em outra hierarquia.
 Classe ociosa.
 Generalidade especulativa.
 Atributo temporário.
 Cadeia de mensagens .

Professor Marcelo Pacote - @professorpacote 42 W W W. D O M I N A N D OT I .CO M . B R


Refatoração

 Intermediário:
 Um objeto recorre a outro objeto para responde a uma requisição.
 Intimidade inadequada.
 Classes alternativas com interfaces diferentes:
 Métodos que façam a mesma coisa, mas que tenham assinaturas diferentes.
 Biblioteca de classes incompleta.
 Introduzir um método em uma classe da biblioteca.
 Herança recusada:
 Métodos e atributos herdados ficam sem uso

Professor Marcelo Pacote - @professorpacote 43 W W W. D O M I N A N D OT I .CO M . B R


(PEFOCE/CE /2012/Cespe/Perito)

( ) Na manutenção preventiva por refatoração em determinado


software, novas funcionalidades devem ser adicionadas para
diminuir sua degradação.

Professor Marcelo Pacote - @professorpacote 44 W W W. D O M I N A N D OT I .CO M . B R


(Petrobras/2007/Cespe/An. Sistemas)

( ) Um exemplo de refatoração, técnica que pode ser


empregada para melhorar o projeto de um software, é organizar
as classes em hierarquias visando usar polimorfismo em vez de
enunciados condicionais para escolher entre comportamentos
que dependam dos tipos dos objetos.

Professor Marcelo Pacote - @professorpacote 45 W W W. D O M I N A N D OT I .CO M . B R


(Bacen/2010/Cesgranrio/Desv )

Um programador inexperiente gerou, em determinado sistema, código-


fonte de baixa qualidade que foi analisado e reprovado por ferramentas
automatizadas de auditoria de código. Considerando-se que existem
muitos códigos duplicados nesse sistema, que técnicas de refatoração
são indicadas nessa situação?
(A) Introduce Parameter Object e Move Method.
(B) Duplicate Observed Data e Replace Inheritance with Delegation.
(C) Move Method e Move Field.
(D) Extract Method e Substitute Algorithm.
(E) Remove Double Negative e Introduce Parameter Object.

Professor Marcelo Pacote - @professorpacote 46 W W W. D O M I N A N D OT I .CO M . B R


(Petro/2010/Cesgranrio/Proc. Negócio)

É comum, na Engenharia de Software, o uso de ferramentas de software que


auxiliam na realização de diversas atividades do desenvolvimento. Nesse contexto,
ferramentas de
(A) refatoração auxiliam a modificação de uma região do código-fonte de um
sistema, com o objetivo de alterar comportamento externo deste último.
(B) análise estática do código permitem obter métricas de qualidade de um
produto de software, tais como o grau de dependência entre seus componentes.
(C) integração contínua são destinadas a automatizar a implantação do produto de
software no ambiente de produção.
(D) engenharia reversa são destinadas ao controle das diversas versões de um
produto de software.
(E) cobertura de código determinam em que grau o código-fonte de um sistema
corresponde aos seus requisitos não funcionais.

Professor Marcelo Pacote - @professorpacote 47 W W W. D O M I N A N D OT I .CO M . B R


Gabarito

(TJ-PI/2009/FCC/Analista/An. Sistemas) B
(Basa/2012/Cespe/An. Sistemas) certo
(TRE/SP/2012/FCC/Prog. Sistemas) D
(PEFOCE/CE /2012/Cespe/Perito) errado
(Petrobras/2007/Cespe/An. Sistemas) certo
(Bacen/2010/Cesgranrio/Desv ) D
(Petro/2010/Cesgranrio/Proc. Negócio) B

Professor Marcelo Pacote - @professorpacote 48 W W W. D O M I N A N D OT I .CO M . B R


Maven

Professor Marcelo Pacote – @professorpacote

W W W. D O M I N A N D OT I .CO M . B R W W W. D O M I N A N D OT I .CO M . B R
Maven

 Padroniza e simplifica o processo de construção (build) de


um projeto de software.
 trata compilação, distribuição, documentação, gerenciamento de
dependências, gerenciamento de configuração (SCM)

 Convention over Configuration


Item Padrão
Código fonte /src/main/java
Recursos (arquivos conf.) /src/main/resources
Testes /src/test
Código compilado /target/classes

Professor Marcelo Pacote - @professorpacote 50 W W W. D O M I N A N D OT I .CO M . B R


POM – Project Object Model (pom.xml)

 Contém metadados do projeto


<project>
<modelVersion>4.0.0</modelVersion>
<groupId>br.com.dominandoti</groupId>
<artifactId>projetocurso-api</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<dependencies/>
<build/>
</project>

 Super POM
 Todos os POMs herdam de algum outro

Professor Marcelo Pacote - @professorpacote 51 W W W. D O M I N A N D OT I .CO M . B R


Características

 Ciclos de vida
 Sequência de fases que definem a ordem que goals são executados.
 Ciclos de vida: clean, default (build) e site

 Plugins
 Profiles
 Configurações que sobrescrevem comportamentos padrão do Maven.

Professor Marcelo Pacote - @professorpacote 52 W W W. D O M I N A N D OT I .CO M . B R


Repositórios

 Trata-se do local onde são armazenados os artefatos (jars,


plugins) utilizados pelo maven.
 Há três tipos: local, central e remoto

remoto

local interno - proxy central


(opcional)
c:\users\mpacote\.m2 http://repo1.maven.org/maven2/

remoto

Professor Marcelo Pacote - @professorpacote 53 W W W. D O M I N A N D OT I .CO M . B R


Gerenciamento de Dependências

 Descoberta de dependências transitivas

Há dependência transitiva entre A e C

Escopo Descrição
compile (default) indica que a dependência está disponível no classpath do
projeto
provided dependência provida pelo JDK ou Container em tempo de execução.
test dependência utilizada apenas por testes (compilação e execução)
runtime Não é necessário para compilação, apenas para execução.

Professor Marcelo Pacote - @professorpacote 54 W W W. D O M I N A N D OT I .CO M . B R


Anexo I
Mais sobre Refatoração
Professor Marcelo Pacote – @professorpacote

W W W. D O M I N A N D OT I .CO M . B R W W W. D O M I N A N D OT I .CO M . B R
Compondo Métodos (Composing Methods)

 Internalizar Método - Inline Method


 Internalizar Variável Temporária - Inline Temp
 Substituir Variável Temporária por Consulta - Replace Temp with Query
 Introduzir Variável Explicativa - Introduce Explaining Variable
 Dividir Variável Temporária - Split Temporary Variable
 Remover Atribuições a Parâmetros - Remove Assignments to Parameters
 Substituir Método por objeto Método - Replace Method with Method Object:
 Consiste em transformar o método em seu próprio objeto de modo que todas as
variáveis locais se tornem campos desse objeto.
 Substituir Algoritmo - Substitute Algorithm:
 Substituir o corpo do método por um novo algoritmo.

Professor Marcelo Pacote - @professorpacote 56 W W W. D O M I N A N D OT I .CO M . B R


Internalizar Método - Inline Method

int getRating() {
return (moreThanFiveLateDeliveries()) ? 2 : 1;
}
boolean moreThanFiveLateDeliveries() {
return _numberOfLateDeliveries > 5;
}

int getRating() {
return (_numberOfLateDeliveries > 5) ? 2 : 1;
}

Professor Marcelo Pacote - @professorpacote 57 W W W. D O M I N A N D OT I .CO M . B R


Internalizar Variável Temporária - Inline Temp

double basePrice = anOrder.basePrice();


return (basePrice > 1000);

return (anOrder.basePrice() > 1000);

Professor Marcelo Pacote - @professorpacote 58 W W W. D O M I N A N D OT I .CO M . B R


Substituir Variável Temporária por Consulta -
Replace Temp with Query
double basePrice = _quantity * _itemPrice;
if (basePrice > 1000) return basePrice * 0.95;
else return basePrice * 0.98;

if (basePrice() > 1000)


return basePrice() * 0.95;
else return basePrice() * 0.98; ...
double basePrice() {
return _quantity * _itemPrice;
}
Professor Marcelo Pacote - @professorpacote 59 W W W. D O M I N A N D OT I .CO M . B R
Variável Explicativa – Introduce Explaining Variable

if ( (platform.toUpperCase().indexOf("MAC") > -1) &&


(browser.toUpperCase().indexOf("IE") > -1) &&
wasInitialized() && resize > 0 )
{ // código }

final boolean isMacOs = platform.toUpperCase().indexOf("MAC") > -1;


final boolean isIEBrowser = browser.toUpperCase().indexOf("IE") > -1;
final boolean wasResized = resize > 0;
if (isMacOs && isIEBrowser && wasInitialized() && wasResized)
{ // código }

Professor Marcelo Pacote - @professorpacote 60 W W W. D O M I N A N D OT I .CO M . B R


Dividir Variável Temporária – Split Temporary
Variable
double temp = 2 * (_height + _width);
System.out.println (temp);
temp = _height * _width;
System.out.println (temp);

final double perimeter = 2 * (_height + _width);


System.out.println (perimeter);
final double area = _height * _width;
System.out.println (area);
Professor Marcelo Pacote - @professorpacote 61 W W W. D O M I N A N D OT I .CO M . B R
Remover Atribuições a Parâmetros – Remove
Assignments to Parameters
int discount (int inputVal, int quantity, int yearToDate)
{
if (inputVal > 50) inputVal -= 2;
}

int discount (int inputVal, int quantity, int yearToDate)


{
int result = inputVal;
if (inputVal > 50) result -= 2;
}
Professor Marcelo Pacote - @professorpacote 62 W W W. D O M I N A N D OT I .CO M . B R
Movendo Recursos entre Objetos – Moving
Features Between Objects (1/2)
 Mover Método - Move Method
 Move o método de uma classe para outra.
 Mover Campo - Move Field
 Move o campo de uma classe para outra.
 Extrair Classe - Extract Class
 Divide uma classe quando a mesma faz o trabalho de
duas.
 Internalizar Classes - Inline Class
 Move uma classe para dentro de outra quando a mesma
não está fazendo muita coisa.

Professor Marcelo Pacote - @professorpacote 63 W W W. D O M I N A N D OT I .CO M . B R


Movendo Recursos entre Objetos – Moving
Features Between Objects (2/2)
 Ocultar Delegações - Hide Delegate
 Omite a delegação através da criação de método em uma
classe intermediária.
 Remover Intermediário - Remove Middle Man
 Diminui delegação.
 Introduzir Método Externo - Introduce Foreign Method
 Uma classe servidora precisa de um método adicional, mas
não pode ser modificada. Então, cria-se um método na classe
cliente com um parâmetro to tipo da classe servidora.
 Introduzir Extensão Local - Introduce Local Extension
 Estender uma classe que não pode ser modificada.

Professor Marcelo Pacote - @professorpacote 64 W W W. D O M I N A N D OT I .CO M . B R


Organizando Dados - Organizing Data

 Auto-Encapsular Campo - Self Encapsulate Field


 Atributos privados e métodos públicos.
 Substituir Atributo por Objeto - Replace Data Value with Object
 Transforma o dado em um objeto.
 Mudar de Valor para Referência - Change Value to Reference
 Mudar de Referência para Valor - Change Reference to Value
 Substituir Vetor por objeto - Replace Array with Object
 Duplicar Dados Observados - Duplicate Observed Data
 Cria GUI com classe interna.
 Transformar Associação Unidirecional em Biderecional - Change
Unidirectional Association to Bidirectional
 Transformar Associação Biderecional em Unidirecional - Change Bidirectional
Association to Unidirectional
Professor Marcelo Pacote - @professorpacote 65 W W W. D O M I N A N D OT I .CO M . B R
Organizando Dados - Organizing Data

 Substituir Números Mágicos por Constantes Simbólicas - Replace Magic


Number with Symbolic Constant
 Encapsular Campo - Encapsulate Field
 Encapsular Coleção - Encapsulate Collection
 Substituir Registro por Classe de Dados - Replace Record with Data Class
 Substituir Enumeração por Classes - Replace Type Code with Class
 Substituir Enumeração por Subclasses - Replace Type Code with Subclasses
 Substituir Enumeração pelo Padrão Strategy - Type Code with State/Strategy
 Substituir Subclasses por Campos - Replace Subclass with Fields

Professor Marcelo Pacote - @professorpacote 66 W W W. D O M I N A N D OT I .CO M . B R


Simplificando Expressões Condicionais -
Simplifying Conditional Expressions (1/2)
 Decompor Condicional - Decompose Conditional
 Simplifica uma estrutura condicional complicada.
if (date.before (SUMMER_START) || date.after(SUMMER_END))
charge = quantity * _winterRate + _winterServiceCharge;
else charge = quantity * _summerRate;

if (notSummer(date))
charge = winterCharge(quantity);
else charge = summerCharge (quantity);

Professor Marcelo Pacote - @professorpacote 67 W W W. D O M I N A N D OT I .CO M . B R


Simplificando Expressões Condicionais -
Simplifying Conditional Expressions (2/2)
 Consolidar Expressão Condicional - Consolidate Conditional Expression
 Simplifica uma sequencia de testes condicionais com o mesmo resultado.
double disabilityAmount() {
if (_seniority < 2) return 0;
if (_monthsDisabled > 12) return 0;
if (_isPartTime) return 0;
// executa algo

double disabilityAmount() {
if (isNotEligableForDisability()) return 0;
// executa algo

Professor Marcelo Pacote - @professorpacote 68 W W W. D O M I N A N D OT I .CO M . B R


Simplificando Expressões Condicionais -
Simplifying Conditional Expressions
 Consolidar Fragmentos Condicionais Duplicados - Consolidate Duplicate Conditional Fragments
 Quando o mesmo fragmento de código aparecer em todos os ramos de uma expressão condicional, mova-o para fora
da expressão.
if (isSpecialDeal()) {
total = price * 0.95;
send();
} else {
total = price * 0.98;
send();
}

if (isSpecialDeal()) total = price * 0.95;


else total = price * 0.98;
send();
 Remover Flag de Controle - Remove Control Flag
 Use um break ou return ao invés de flags em expressões booleanas.

Professor Marcelo Pacote - @professorpacote 69 W W W. D O M I N A N D OT I .CO M . B R


Simplificando Expressões Condicionais -
Simplifying Conditional Expressions
 Substituir Condição Aninhada por cláusula de Guarda- Replace Nested Conditional with Guard Clauses
double getPayAmount() {
double result;
if (_isDead) result = deadAmount();
else { if (_isSeparated) result = separatedAmount();
else { if (_isRetired) result = retiredAmount();
else result = normalPayAmount(); }; } return result;
};

double getPayAmount() {
if (_isDead) return deadAmount();
if (_isSeparated) return separatedAmount();
if (_isRetired) return retiredAmount();
return normalPayAmount();
};

Professor Marcelo Pacote - @professorpacote 70 70 M . B R


W W W. D O M I N A N D OT I .CO
Simplificando Expressões Condicionais -
Simplifying Conditional Expressions
 Substituir Comando Condicional por Polimorfismo - Replace Conditional with
Polymorphism
double getSpeed() {
switch (_type) {
case EUROPEAN:
return getBaseSpeed();
case AFRICAN:
return getBaseSpeed() - getLoadFactor() * _numberOfCoconuts;
case NORWEGIAN_BLUE:
return (_isNailed) ? 0 : getBaseSpeed(_voltage);
}
throw new RuntimeException ("Should be unreachable");
}

Professor Marcelo Pacote - @professorpacote 71 W W W. D O M I N A N D OT I .CO M . B R


Simplificando Expressões Condicionais -
Simplifying Conditional Expressions
 Introduzir Objeto Nulo - Introduce Null Object
if (customer == null) plan = BillingPlan.basic();
else plan = customer.getPlan();

 Introduzir Asserção - Introduce Assertion


 Torna uma suposição explícita.

Professor Marcelo Pacote - @professorpacote 72 W W W. D O M I N A N D OT I .CO M . B R


Tornando as Chamadas de Métodos mais Simples -
Making Method Calls Simpler
 Renomear Método - Rename Method
 Quando o nome do método não revela seu propósito basta alterar o nome do método.
 Adicionar Parâmetro - Add Parameter
 Quando um método precisa de mais informações de quem o chama.
 Remover Parâmetro - Remove Parameter
 Quando um método não precisa mais de um parâmetro.
 Separar a Pesquisa do Modificador - Separate Query from Modifier
 Quando um método retorna um valor e altera o estado de um objeto, decompor em dois métodos.
 Parametrizar Método - Parameterize Method
 Nome de método detalhado, obrigando a criação de vários métodos:
 aumentaCincoPorCento()
 aumentaDezPorCento()
 Substituir por:
 aumentar(porcentagem).

Professor Marcelo Pacote - @professorpacote 73 W W W. D O M I N A N D OT I .CO M . B R


Tornando as Chamadas de Métodos mais Simples -
Making Method Calls Simpler
 Substituir Parâmetros por métodos Explícitos - Replace Parameter with Explicit
Methods
 Cria um método para cada parâmetro.
void setValue (String name, int value) {
if (name.equals("height")) _height = value;
if (name.equals("width")) _width = value;
Assert.shouldNeverReachHere();
}

void setHeight(int arg) {


_height = arg;
}
void setWidth (int arg) {
_width = arg;
}

Professor Marcelo Pacote - @professorpacote 74 W W W. D O M I N A N D OT I .CO M . B R


Tornando as Chamadas de Métodos mais Simples -
Making Method Calls Simpler
 Preservar o Objeto Inteiro - Preserve Whole Object
 Envia o objeto inteiro ao invés de seus atributos.
 Substituir Parâmetro por Método - Replace Parameter with Method
 Um objeto chama um método e depois passa o resultado como parâmetropara um método.
O destinatário também pode chamar esse método.
int basePrice = _quantity * _itemPrice;
discountLevel = getDiscountLevel();
double finalPrice = discountedPrice (basePrice, discountLevel);

int basePrice = _quantity * _itemPrice;


double finalPrice = discountedPrice (basePrice);
// método “discountedPrice (basePrice)” chama “getDiscountLevel()”;

Professor Marcelo Pacote - @professorpacote 75 W W W. D O M I N A N D OT I .CO M . B R


Tornando as Chamadas de Métodos mais Simples -
Making Method Calls Simpler
 Introduzir Objeto Parâmetro - Introduce Parameter Object
 Quando um grupo de parâmetros sempre são usados juntos,
substitua por um objeto.
 Remover Método de Gravação - Remove Setting Method
 Quando um campo é gravado na sua criação e nunca mais é
modificado.
 Ocultar Método - Hide Method
 Métodos que só são usados internamente devem ser declarados
privados.
 Substituir Construtor por um Método Fábrica - Replace Constructor
with Factory Method
 Quando a contruçãodo objeto deve ser mais complexa.

Professor Marcelo Pacote - @professorpacote 76 W W W. D O M I N A N D OT I .CO M . B R


Tornando as Chamadas de Métodos mais Simples -
Making Method Calls Simpler
 Encapsular Downcast - Encapsulate Downcast
Object lastReading() {
return readings.lastElement();
}

Reading lastReading() {
return (Reading) readings.lastElement();
}

 Substituir Código de Erro por Exceção - Replace Error Code with Exception
int withdraw(int amount) {
if (amount > _balance) return -1;
else {
_balance -= amount;
return 0;
}
}
Professor Marcelo Pacote - @professorpacote 77 W W W. D O M I N A N D OT I .CO M . B R
Tornando as Chamadas de Métodos mais Simples -
Making Method Calls Simpler
 Substituir Exceção por Teste - Replace Exception with Test
double getValueForPeriod (int periodNumber) {
try {
return _values[periodNumber];
} catch (ArrayIndexOutOfBoundsException e) {
return 0;
}
}

double getValueForPeriod (int periodNumber) {


if (periodNumber >= _values.length) return 0;
return _values[periodNumber];
}
Professor Marcelo Pacote - @professorpacote 78 W W W. D O M I N A N D OT I .CO M . B R
Lidando com Generalização - Dealing with
Generalization
 Subir Campo na Hierarquia - Pull Up Field
 Quando duas subclasses possuem o mesmo campo, mova-o para a superclasse.
 Subir Método na Hierarquia - Pull Up Method
 Quando duas subclasses possuem o mesmo método, mova-o para a superclasse.
 Subir Corpo do Construtor na Hierarquia - Pull Up Constructor Body
 Quando duas subclasses possuem construtores com várias partes em comum,
mova-as para a superclasse e chame o “super()”.
 Descer Método na Hierarquia - Push Down Method
 Quando algum comportamento na superclasse é relevante apenas para algumas
de suas subclasses, mova-o para essas subclasses.
 Descer Campo na Hierarquia - Push Down Field
 Quando algum atributo na superclasse é relevante apenas para algumas de suas
subclasses, mova-o para essas subclasses.

Professor Marcelo Pacote - @professorpacote 79 W W W. D O M I N A N D OT I .CO M . B R


Lidando com Generalização - Dealing with
Generalization (1/2)
 Extrair Subclasses - Extract Subclass
 Quando uma classe tem características que são usadas
apenas em algumas instâncias, crie uma subclassse para
esse subconjunto de características.
 Extrair Superclasses - Extract Superclass
 Quando duas ou mais classe possuem um conjunto de
características semelhantes, crie uma superclasse e mova
essas características para ela.
 Extrair Interface - Extract Interface
 Quando duas ou mais classe possuem um conjunto de
operações iguais, com implementações diferentes, crie uma
interface para facilitar a chamada desses métodos.

Professor Marcelo Pacote - @professorpacote 80 W W W. D O M I N A N D OT I .CO M . B R


Lidando com Generalização - Dealing with
Generalization (2/2)
 Condensar Hierarquia - Collapse Hierarchy
 Quando uma superclasse e uma subclassse não são muito
diferentes junte-as.
 Substituir Herança por Delegação - Replace Inheritance with
Delegation
 Quando uma classe usa apenas uma parte da interface de uma
superclasse ou não deseja herdar dados, substitua a herança
por delegação.
 Substituir Delegação por Herança - Replace Delegation with
Inheritance
 Quando houver a necessidade de escrever freqüentemente
muitas delegações simples para toda a interface, torne a classe
que está delegando uma subclasse da delegada.

Professor Marcelo Pacote - @professorpacote 81 W W W. D O M I N A N D OT I .CO M . B R


Lidando com Generalização - Dealing with
Generalization
 Criar um Método Padrão - Form Template Method
 Quando métodos em subclasse diferentes executam passos
semelhantes na mesma ordem, mas esses passos são diferentes.

Professor Marcelo Pacote - @professorpacote 82 W W W. D O M I N A N D OT I .CO M . B R


Refatorações Grandes - Big Refactorings

 Desembaraçar Herança - Tease Apart Inheritance


 Converter Projeto Procedural em Objeto - Convert Procedural
Design to Objects
 Separar o Domínio da Apresentação - Separate Domain from
Presentation
 Extrair Hierarquia - Extract Hierarchy

Professor Marcelo Pacote - @professorpacote 83 W W W. D O M I N A N D OT I .CO M . B R


Desembaraçar Herança – Tease Apart Inheritance

 Uma hierarquia de herança pode estar executando dois


trabalhos de uma vez só.
 Criar duas hierarquias através de delegação pode-se invocar
uma a partir da outra.

Professor Marcelo Pacote - @professorpacote 84 W W W. D O M I N A N D OT I .CO M . B R


Converter Projeto Procedural em Objeto – Convert
Procedural Design to Objects
 Código escrito em um estilo procedural.
 Transformar registro de dados em objetos, dividir o
comportamento e mover para os objetos.

Professor Marcelo Pacote - @professorpacote 85 W W W. D O M I N A N D OT I .CO M . B R


Separar o Domínio da Apresentação – Separate
Domain from Presentation
 Classes GUI com lógica do domínio.
 Separar a lógica do domínio em classes do domínio
separados.

Professor Marcelo Pacote - @professorpacote 86 W W W. D O M I N A N D OT I .CO M . B R


Extrair Hierarquia – Extract Hierarchy

 Uma classe que excuta várias atividades, pelo menos parte dele
através de declarações condicionais.
 Criar uma hierarquia de classes na qual cada subclasse
represente um caso.

Professor Marcelo Pacote - @professorpacote 87 W W W. D O M I N A N D OT I .CO M . B R

Você também pode gostar