Buscar

10 - praticas_ageis

Prévia do material em texto

W W W. D OMI NAND OTI .COM.B R WWW.DOMINANDOTI .COM.BR 
Práticas Ágeis 
IC, TDD e Refactoring 
Professor Marcelo Pacote – @professorpacote 
W W W. D OMI NAND OTI .COM.B R 
Acesse nosso site em 
WWW.DOMINANDOTI.COM.BR 
Curta o Dominando TI no 
e receba nossas dicas sobre concursos! 
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 
W W W. D OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 
4 Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.B R 
Integração Contínua - Roteiro 
5 
 
1. 
Desenvolvimento 
+ compilação+ 
testes unitários 
2. Obter token 
3. Update 
4. Compilação + testes unitários 
5. Commit 
6. update 
7. Compilação e 
 testes 
Servidor de IC 
7. [Opciona]Deploy 
Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.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 
 6 Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.B R 
Integração Contínua - Exemplo 
7 Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.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 
 
8 Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.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. 
9 Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.B R WWW.DOMINANDOTI .COM.BR 
Desenvolvimento Orientado a Testes 
 TDD 
Professor Marcelo Pacote – @professorpacote 
W W W. D OMI NAND OTI .COM.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 
 
11 Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.B R 
TDD – Passos para utilização 
1. Pense 
Pequenos incrementos por vez 
2. Vermelho (falha) 
 Escreva um teste que falha 
3. Verde (sucesso) 
 Escreva código para passar nos testes 
4. Refatore 
 Revise e código e faça melhorias 
5. Repita 
 Reinicie o ciclo. O segredo são os pequenos incrementos. 
 12 
Novo 
teste 
Falha 
Sucesso 
Refatore 
Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.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 
13 Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.B R 
TDD – Exemplo (passos 1 e 2) 
14 
 0! é 1 
Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.B R 
TDD – Exemplo (passo 3, 4 e 5) 
15 Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.B R 
TDD – Exemplo (segunda iteração) 
16 
 1! é 1 
Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.B R 
TDD – Exemplo (terceira iteração) (1/2) 
17 
 2! é 2 
Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.B R 
TDD – Exemplo (terceira iteração) (2/2) 
18 
 Corrigir teste com erro 
 
 
 
 “limpar” o código 
Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.B R 
TDD – Exemplo (quarta iteração) 
19 
 Escrever o teste 
 
 
 
 Corrigir o teste com erro 
 
 
Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.B R 
TDD – Exemplo (quinta iteração) 
20 
 Teste 
 
 
 
 Corrigir o teste com erro 
 
Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.B R 
TDD – Ferramentas de Testes 
 xUnit 
 nome genérico para qualquer estrutura de testes 
automáticos unitários. 
 
 Junit (java) 
 Nunit (.net) 
 TestNG 
 
21 Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.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. 
 
 
22 Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.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 
 
 23 Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.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 
adequadoo suficiente para ter sucesso nesse teste. 
24 Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.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. 
25 Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.B R WWW.DOMINANDOTI .COM.BR 
Refatoração 
Professor Marcelo Pacote – @professorpacote 
W W W. D OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 OMI NAND OTI .COM.B R 
Refatoração – Extrair classe 
30 
 Criar uma nova classe e mover atributos e métodos 
relevantes para ela. 
Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.B R 
Refatoração – Mover método 
31 
 Criar novo método com funcionalidade similar na classe que 
mais a utiliza. 
 
 
 
 
 
 
 A refatoração mover campo é análoga. 
Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.B R 
Refatoração – Internalizar Classe 
32 
 É o contrário de Extrair Classe 
 
 
 
 
 
Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.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 OMI NAND OTI .COM.B R 
Refatoração – Preservar o Objeto Inteiro 
34 
 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 
W W W. D OMI NAND OTI .COM.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 OMI NAND OTI .COM.B R 
Refatoração – Encapsular Coleção 
36 
 Um método retorna uma coleção. Torná-la read-only e 
fornecer métodos de inclusão/remoção. 
 
 
 
 
 
Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.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 OMI NAND OTI .COM.B R 
Refatoração – Substituir Algoritmo 
38 
 Alterar o corpo 
de um método 
com um novo 
algoritmo. 
 
 
 
 
 
Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.B R 
Refatoração – Introduzir objeto parâmetro 
39 
 Substituir grupos de parâmetros por um objeto. 
Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.B R 
Refatoração – Extrair método 
40 
 Transformar um fragmento de código em um método cujo 
nome explica seu propósito. 
Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 OMI NAND OTI .COM.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. 
 
44 Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.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. 
 
45 Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.B R 
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. 
46 
(Bacen/2010/Cesgranrio/Desv ) 
Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.B R 47 
(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 
W W W. D OMI NAND OTI .COM.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 
 
48 Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.B R WWW.DOMINANDOTI .COM.BR 
Maven 
Professor Marcelo Pacote – @professorpacote 
W W W. D OMI NAND OTI .COM.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 
50 Professor Marcelo Pacote - @professorpacote 
Item Padrão 
Código fonte /src/main/java 
Recursos (arquivos conf.) /src/main/resources 
Testes /src/test 
Código compilado /target/classes 
W W W. D OMI NAND OTI .COM.B R 
POM – Project Object Model (pom.xml) 
 Contém metadados do projeto 
 
 
 
 
 
 Super POM 
 Todos os POMs herdam de algum outro 
51 Professor Marcelo Pacote - @professorpacote 
<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> 
W W W. D OMI NAND OTI .COM.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. 
 
52 Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.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 
 
 
53 Professor Marcelo Pacote - @professorpacote 
local interno - proxy 
(opcional) 
central 
remoto 
remoto 
c:\users\mpacote\.m2 http://repo1.maven.org/maven2/ 
W W W. D OMI NAND OTI .COM.B R 
Gerenciamento de Dependências 
 Descoberta de dependências transitivas 
 
 
54 Professor Marcelo Pacote - @professorpacote 
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. 
W W W. D OMI NAND OTI .COM.B R WWW.DOMINANDOTI .COM.BR 
Anexo I 
Mais sobre Refatoração 
Professor Marcelo Pacote – @professorpacote 
W W W. D OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 
68 Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.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 OMI NAND OTI .COM.B R 70 
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 
W W W. D OMI NAND OTI .COM.B R 
Simplificando Expressões Condicionais - 
Simplifying Conditional Expressions 
71 
 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 
W W W. D OMI NAND OTI .COM.B R 
Simplificando Expressões Condicionais - 
Simplifying Conditional Expressions 
72 
 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 
W W W. D OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 82 
W W W. D OMI NAND OTI .COM.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 OMI NAND OTI .COM.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. 
84 Professor Marcelo Pacote - @professorpacote 
W W W. D OMI NAND OTI .COM.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 OMI NAND OTI .COM.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 OMI NAND OTI .COM.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. 
87 Professor Marcelo Pacote - @professorpacote

Continue navegando