Refatoração de código com Capitão Nascimento versão completa

267
Eduardo Bregaida Refatoração com Capitão Nascimento

description

Palestra apresentada no FISL 12 Edição.

Transcript of Refatoração de código com Capitão Nascimento versão completa

Page 1: Refatoração de código com Capitão Nascimento versão completa

Eduardo Bregaida

Refatoração com Capitão Nascimento

Page 2: Refatoração de código com Capitão Nascimento versão completa

Eduardo Bregaida

•http://javawora.blogspot.com

•@bregaida

[email protected]

Page 3: Refatoração de código com Capitão Nascimento versão completa
Page 4: Refatoração de código com Capitão Nascimento versão completa
Page 5: Refatoração de código com Capitão Nascimento versão completa

O Conceito de Refatoração

Por Martin Fowler...

Page 6: Refatoração de código com Capitão Nascimento versão completa
Page 7: Refatoração de código com Capitão Nascimento versão completa
Page 8: Refatoração de código com Capitão Nascimento versão completa

É o processo de reescrever um programa

de computador para melhorar sua estrutura ou legibilidade, preservando

assim seu comportamento.

Page 9: Refatoração de código com Capitão Nascimento versão completa
Page 10: Refatoração de código com Capitão Nascimento versão completa
Page 11: Refatoração de código com Capitão Nascimento versão completa

Teve sua origem nos anos 80/90 com Smalltalk...

Page 12: Refatoração de código com Capitão Nascimento versão completa
Page 13: Refatoração de código com Capitão Nascimento versão completa
Page 14: Refatoração de código com Capitão Nascimento versão completa

Desenvolveu-se formalmente na

Universidade de Illinois em Urbana-Champaign.

Grupo do Prof. Ralph Johnson...

Page 15: Refatoração de código com Capitão Nascimento versão completa
Page 16: Refatoração de código com Capitão Nascimento versão completa
Page 17: Refatoração de código com Capitão Nascimento versão completa

Capitão?

Page 18: Refatoração de código com Capitão Nascimento versão completa
Page 19: Refatoração de código com Capitão Nascimento versão completa

Pois não?

Page 20: Refatoração de código com Capitão Nascimento versão completa
Page 21: Refatoração de código com Capitão Nascimento versão completa

Seu 05 está dormindo

Page 22: Refatoração de código com Capitão Nascimento versão completa
Page 23: Refatoração de código com Capitão Nascimento versão completa
Page 24: Refatoração de código com Capitão Nascimento versão completa

Seu 05

Page 25: Refatoração de código com Capitão Nascimento versão completa
Page 26: Refatoração de código com Capitão Nascimento versão completa

Senhor?

Page 27: Refatoração de código com Capitão Nascimento versão completa
Page 28: Refatoração de código com Capitão Nascimento versão completa
Page 29: Refatoração de código com Capitão Nascimento versão completa

Tenha a bondade de segurar isto.

Page 30: Refatoração de código com Capitão Nascimento versão completa
Page 31: Refatoração de código com Capitão Nascimento versão completa
Page 32: Refatoração de código com Capitão Nascimento versão completa
Page 33: Refatoração de código com Capitão Nascimento versão completa

Seu 05 se o senhor dormir o senhor vai se explodir, vai me explodir...

Page 34: Refatoração de código com Capitão Nascimento versão completa
Page 35: Refatoração de código com Capitão Nascimento versão completa

E vai explodir a todos seus companheiros do FISL.

Page 36: Refatoração de código com Capitão Nascimento versão completa
Page 37: Refatoração de código com Capitão Nascimento versão completa

O senhor vai dormir seu 05?

Page 38: Refatoração de código com Capitão Nascimento versão completa
Page 39: Refatoração de código com Capitão Nascimento versão completa

Não Senhor!

Page 40: Refatoração de código com Capitão Nascimento versão completa
Page 41: Refatoração de código com Capitão Nascimento versão completa

Estamos todos confiando no senhor.

Page 42: Refatoração de código com Capitão Nascimento versão completa
Page 43: Refatoração de código com Capitão Nascimento versão completa
Page 44: Refatoração de código com Capitão Nascimento versão completa

Vamos analisar a motivação de refatorar

Page 45: Refatoração de código com Capitão Nascimento versão completa
Page 46: Refatoração de código com Capitão Nascimento versão completa
Page 47: Refatoração de código com Capitão Nascimento versão completa

Por que refatorar?

Page 48: Refatoração de código com Capitão Nascimento versão completa
Page 49: Refatoração de código com Capitão Nascimento versão completa

Mudará algo na geração dos bytecodes?

Page 50: Refatoração de código com Capitão Nascimento versão completa
Page 51: Refatoração de código com Capitão Nascimento versão completa

Mudará algo para o computador?

Page 52: Refatoração de código com Capitão Nascimento versão completa
Page 53: Refatoração de código com Capitão Nascimento versão completa

Mudará algo para o cliente?

Page 54: Refatoração de código com Capitão Nascimento versão completa
Page 55: Refatoração de código com Capitão Nascimento versão completa

Não!

Page 56: Refatoração de código com Capitão Nascimento versão completa
Page 57: Refatoração de código com Capitão Nascimento versão completa

Facilitará para o senhor no caso de uma

manutenção lembrar facilmente do código

Page 58: Refatoração de código com Capitão Nascimento versão completa
Page 59: Refatoração de código com Capitão Nascimento versão completa

Facilitará para outros desenvolvedores entender o

que o código faz

Page 60: Refatoração de código com Capitão Nascimento versão completa
Page 61: Refatoração de código com Capitão Nascimento versão completa

Manutenibilidade

Page 62: Refatoração de código com Capitão Nascimento versão completa
Page 63: Refatoração de código com Capitão Nascimento versão completa

Um exemplo de código senhores

Page 64: Refatoração de código com Capitão Nascimento versão completa
Page 65: Refatoração de código com Capitão Nascimento versão completa
Page 66: Refatoração de código com Capitão Nascimento versão completa

Dado um array de N elementos, calcular a seguinte operações:

Page 67: Refatoração de código com Capitão Nascimento versão completa

Dado um array de N elementos, calcular a seguinte operações:

* Primeiro item menos o último

Page 68: Refatoração de código com Capitão Nascimento versão completa

Dado um array de N elementos, calcular a seguinte operações:

* Primeiro item menos o último* O resultado dessa subtração elevado ao quadrado somado ao segundo item menos o penúltimo

Page 69: Refatoração de código com Capitão Nascimento versão completa

Dado um array de N elementos, calcular a seguinte operações:

* Primeiro item menos o último* O resultado dessa subtração elevado ao quadrado somado ao segundo item menos o penúltimo

* O resultado dessa subtração elevado ao quadrado.

Page 70: Refatoração de código com Capitão Nascimento versão completa

Dado um array de N elementos, calcular a seguinte operações:

* Primeiro item menos o último* O resultado dessa subtração elevado ao quadrado somado ao segundo item menos o penúltimo

* O resultado dessa subtração elevado ao quadrado.* uma seqüência com N elementos

Page 71: Refatoração de código com Capitão Nascimento versão completa

Dado um array de N elementos, calcular a seguinte operações:

* Primeiro item menos o último* O resultado dessa subtração elevado ao quadrado somado ao segundo item menos o penúltimo

* O resultado dessa subtração elevado ao quadrado.* uma seqüência com N elementos

* (1o - N) ^2 + (2o - (N-1)) ^2 + ... + (N/2 - N/2)^2

Page 72: Refatoração de código com Capitão Nascimento versão completa

Dado um array de N elementos, calcular a seguinte operações:

* Primeiro item menos o último* O resultado dessa subtração elevado ao quadrado somado ao segundo item menos o penúltimo

* O resultado dessa subtração elevado ao quadrado.* uma seqüência com N elementos

* (1o - N) ^2 + (2o - (N-1)) ^2 + ... + (N/2 - N/2)^2* Retornar essa soma ou "-1" caso a entrada seja inválida

Page 73: Refatoração de código com Capitão Nascimento versão completa

public class Calcula{ // contador do array static int count=-1;

// método que faz o calculo solicitado public int somaSerie (int array []) { if(null == array) return -1; else if(++count>=array.length/2) // se chegou na metade, retorna zero return 0; // aplica a fórmula com chamada recursiva return ((array[count]-array[array.length-(count+1)])* (array[count]-array[array.length-(count+1)])) + somaSerie(array); }

// Teste aqui? public static void main(String args[]) { int ar[] = {1,2,3,4,5,6,7,8,9,10,11}; System.out.println("Resultado=" + new Calcula().somaSerie(ar)); }}

Page 74: Refatoração de código com Capitão Nascimento versão completa
Page 75: Refatoração de código com Capitão Nascimento versão completa

Fácil de entender senhores?

Page 76: Refatoração de código com Capitão Nascimento versão completa
Page 77: Refatoração de código com Capitão Nascimento versão completa

Não...

Page 78: Refatoração de código com Capitão Nascimento versão completa
Page 79: Refatoração de código com Capitão Nascimento versão completa

Vamos ver como a refatoração o melhora

Page 80: Refatoração de código com Capitão Nascimento versão completa
Page 81: Refatoração de código com Capitão Nascimento versão completa

public class CalculaRef { //Constante do valor Metade private static final int VALOR_METADE = 2; // contador do array static int count = -1; private int[] array; private int tamanho = 0;

// retorno para array nulo final int ENTRADA_INVALIDA = -1;

public CalculaRef(int[] array) { this.array = array; tamanho = array.length; }

// mesmo cálculo efetuado na classe Calcula // mas as operações difíceis de ler // foram transformadas em métodos public int somaSerie() { if (array.length == 0) return ENTRADA_INVALIDA; else if (isMaiorQueMetade(++count)) return 0;

int subtracaoValores = getPrimeiroItemArrayMenosUltimo(); return (getPotenciaQuadrado(subtracaoValores) + somaSerie()); }

public int getPotenciaQuadrado(int numeroOperacao) { return numeroOperacao * numeroOperacao; }

public int getPrimeiroItemArrayMenosUltimo() { return array[count] - array[tamanho - (count + 1)]; }

public boolean isMaiorQueMetade(int indice) { return indice >= tamanho / VALOR_METADE; }

}

Page 82: Refatoração de código com Capitão Nascimento versão completa

/** * Classe de Teste */public class CalculaRefTeste { public static void main(String args[]) { int ar[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; CalculaRef refTeste = new CalculaRef(ar); System.out.println("Resultado=" + refTeste.somaSerie()); }}

Page 83: Refatoração de código com Capitão Nascimento versão completa
Page 84: Refatoração de código com Capitão Nascimento versão completa

Podemos melhorar mais...

Page 85: Refatoração de código com Capitão Nascimento versão completa
Page 86: Refatoração de código com Capitão Nascimento versão completa

public class CalculaRefDois {

// contador deixou de ser estático e passou a ser um atributo private int count = -1;

// array possui agora uma classe para efetuar suas operações específicas private ArrayUtil arrayUtil; final int ENTRADA_INVALIDA = -1;

public CalculaRefDois(int[] array) { // inicializa classe do array this.arrayUtil = new ArrayUtil(array); }

// ficou quase igual ao método da classe CalculaRefHum a diferença // é que o IF e o ELSE IF chamam métodos da classe nova a ArrayUtils public int somaSerie() { if (arrayUtil.getTamanho() == 0) return ENTRADA_INVALIDA; else if (arrayUtil.isMaiorQueMetade(++count)) return 0;

int subtracaoValores = getPrimeiroItemArrayMenosUltimo(); return (getPotenciaQuadrado(subtracaoValores) + somaSerie()); }

public int getPotenciaQuadrado(int valorSubtracao) { // Utilizando a lib Math do Java na qual já cálcula um valor passado e seu expoente //Cast de int pois pow retorna double return (int) Math.pow(valorSubtracao,EXPOENTE_QUADRADO); }

public int getPrimeiroItemArrayMenosUltimo() { return arrayUtil.getItem(count) - arrayUtil.getItemIndiceInverso(count); }}

Page 87: Refatoração de código com Capitão Nascimento versão completa

public class ArrayUtil {

private int array[]; private int tamanho = 0;

private static final int VALOR_HUM = 1; //Constante do valor Metade private static final int VALOR_METADE = 2;

public ArrayUtil(int array[]) { this.array = array; if (null == array) this.array = new int[] {}; tamanho = this.array.length; }

public int getIndiceIntermediario() { return tamanho / VALOR_METADE; }

public int getTamanho() { return tamanho; }

public int getItem(int indice) { return array[indice]; }

public int getItemIndiceInverso(int indice) { return array[tamanho - (indice + VALOR_HUM)]; }

public boolean isMaiorQueMetade(int indice) { return indice >= getIndiceIntermediario(); }}

Page 88: Refatoração de código com Capitão Nascimento versão completa
Page 89: Refatoração de código com Capitão Nascimento versão completa

Senhor, o que é preciso para refatorar?

Page 90: Refatoração de código com Capitão Nascimento versão completa
Page 91: Refatoração de código com Capitão Nascimento versão completa
Page 92: Refatoração de código com Capitão Nascimento versão completa

Xerife, o senhor precisa testar o código

Page 93: Refatoração de código com Capitão Nascimento versão completa
Page 94: Refatoração de código com Capitão Nascimento versão completa

Xerife, o senhor precisa sentir o “mau cheiro” do

código!

Page 95: Refatoração de código com Capitão Nascimento versão completa
Page 96: Refatoração de código com Capitão Nascimento versão completa
Page 97: Refatoração de código com Capitão Nascimento versão completa

O que seria sentir o “mau cheiro” do código senhor?

Page 98: Refatoração de código com Capitão Nascimento versão completa
Page 99: Refatoração de código com Capitão Nascimento versão completa
Page 100: Refatoração de código com Capitão Nascimento versão completa

Classes com muitas responsabilidades

Page 101: Refatoração de código com Capitão Nascimento versão completa
Page 102: Refatoração de código com Capitão Nascimento versão completa

Um código sem padrão algum

Page 103: Refatoração de código com Capitão Nascimento versão completa
Page 104: Refatoração de código com Capitão Nascimento versão completa
Page 105: Refatoração de código com Capitão Nascimento versão completa

Sistemas sem alta coesão e baixo acoplamento

Page 106: Refatoração de código com Capitão Nascimento versão completa
Page 107: Refatoração de código com Capitão Nascimento versão completa
Page 108: Refatoração de código com Capitão Nascimento versão completa

Ah, mas isso dá muito trabalho senhor

Page 109: Refatoração de código com Capitão Nascimento versão completa
Page 110: Refatoração de código com Capitão Nascimento versão completa
Page 111: Refatoração de código com Capitão Nascimento versão completa

Xerife

Page 112: Refatoração de código com Capitão Nascimento versão completa
Page 113: Refatoração de código com Capitão Nascimento versão completa

O senhor é um fanfarrão seu Xerife

Page 114: Refatoração de código com Capitão Nascimento versão completa
Page 115: Refatoração de código com Capitão Nascimento versão completa
Page 116: Refatoração de código com Capitão Nascimento versão completa

Os senhores têm que refatorar sempre

Page 117: Refatoração de código com Capitão Nascimento versão completa
Page 118: Refatoração de código com Capitão Nascimento versão completa

public class PontoHandler { private Ponto ponto = new Ponto(); private Session session; private DAO<Ponto> dao; public void salvar() { session = HibernateUtil.getCurrentSession(); dao = new DAO<Ponto>(session, Ponto.class); if (ponto.getId() == 0) { dao.salveOrUpdate(this.ponto); } else { session.merge(this.ponto); } this.ponto = new Ponto();

}

public void carregar(ActionEvent event) { UIComponent comandLink = event.getComponent(); UIParameter parameter = (UIParameter) comandLink .findComponent("editId"); Long id = (Long) parameter.getValue(); session = HibernateUtil.getCurrentSession(); dao = new DAO<Ponto>(session, Ponto.class); this.ponto = dao.load(id);

}

public void excluir(ActionEvent event) { UIComponent comandLink = event.getComponent(); UIParameter parameter = (UIParameter) comandLink .findComponent("editId"); Long id = (Long) parameter.getValue(); session = HibernateUtil.getCurrentSession(); DAO<Ponto> dao = new DAO<Ponto>(session, Ponto.class); this.ponto = dao.load(id); dao.deleta(ponto); this.ponto = new Ponto();

}

//Outros métodos

}

Page 119: Refatoração de código com Capitão Nascimento versão completa
Page 120: Refatoração de código com Capitão Nascimento versão completa

Eliminem a duplicidade

Page 121: Refatoração de código com Capitão Nascimento versão completa
Page 122: Refatoração de código com Capitão Nascimento versão completa

Dêem nomes decentes aos métodos e os

parâmetros

Page 123: Refatoração de código com Capitão Nascimento versão completa
Page 124: Refatoração de código com Capitão Nascimento versão completa

public class PontoHandler { private Ponto ponto = new Ponto(); private PontoBusiness negocio = new PontoBusiness(); private Long id ; public void salvar() { if (ponto.getId() == 0) { negocio.salvar(this.ponto); } else { negocio.merge(this.ponto); } this.ponto = new Ponto();

}

public void carregar(ActionEvent event) { id = populaDados(event); this.ponto = negocio.carregar(id); }

public void excluir(ActionEvent event) { id = populaDados(event); this.ponto = negocio.carregar(id); negocio.excluir(ponto); this.ponto = new Ponto(); } public List<Ponto> getAllPonto() { return negocio.getAllPontos(); }

/** * Popula os dados dos componentes JSF * @param event * @return id */ private Long populaDados(ActionEvent event) { UIComponent comandLink = event.getComponent(); UIParameter parameter = (UIParameter) comandLink.findComponent("editId"); Long id = (Long) parameter.getValue(); return id; }

//Outros métodos}

Page 125: Refatoração de código com Capitão Nascimento versão completa
Page 126: Refatoração de código com Capitão Nascimento versão completa

Os nomes dos métodos e parâmetros

tem que ser condizentes com o que eles fazem

Page 127: Refatoração de código com Capitão Nascimento versão completa
Page 128: Refatoração de código com Capitão Nascimento versão completa

public class PontoHandler {

private Ponto ponto = new Ponto();

private Session session;

private DAO<Ponto> dao; public void salvar() { //Implementação }

public void carregar(ActionEvent event) { //Implementação }

public void excluir(ActionEvent event) { //Implementação }

}

Page 129: Refatoração de código com Capitão Nascimento versão completa
Page 130: Refatoração de código com Capitão Nascimento versão completa

Os métodos e classes devem ser pequenos

Page 131: Refatoração de código com Capitão Nascimento versão completa
Page 132: Refatoração de código com Capitão Nascimento versão completa

public class PontoHandler { private Ponto ponto = new Ponto(); private Session session; private DAO<Ponto> dao; public void salvar() { session = HibernateUtil.getCurrentSession(); dao = new DAO<Ponto>(session, Ponto.class); if (ponto.getId() == 0) { dao.salveOrUpdate(this.ponto); } else { session.merge(this.ponto); } this.ponto = new Ponto();

}

public void carregar(ActionEvent event) { UIComponent comandLink = event.getComponent(); UIParameter parameter = (UIParameter) comandLink .findComponent("editId"); Long id = (Long) parameter.getValue(); session = HibernateUtil.getCurrentSession(); dao = new DAO<Ponto>(session, Ponto.class); this.ponto = dao.load(id);

}

public void excluir(ActionEvent event) { UIComponent comandLink = event.getComponent(); UIParameter parameter = (UIParameter) comandLink .findComponent("editId"); Long id = (Long) parameter.getValue(); session = HibernateUtil.getCurrentSession(); DAO<Ponto> dao = new DAO<Ponto>(session, Ponto.class); this.ponto = dao.load(id); dao.deleta(ponto); this.ponto = new Ponto();

}

//Outros métodos

}

Page 133: Refatoração de código com Capitão Nascimento versão completa

public class PontoHandler { private Ponto ponto = new Ponto(); private PontoBusiness negocio = new PontoBusiness(); private Long id ; public void salvar() { if (ponto.getId() == 0) { negocio.salvar(this.ponto); } else { negocio.merge(this.ponto); } this.ponto = new Ponto();

}

public void carregar(ActionEvent event) { id = populaDados(event); this.ponto = negocio.carregar(id); }

public void excluir(ActionEvent event) { id = populaDados(event); this.ponto = negocio.carregar(id); negocio.excluir(ponto); this.ponto = new Ponto(); } /** * Popula os dados dos componentes JSF * @param event * @return id */ private Long populaDados(ActionEvent event) { UIComponent comandLink = event.getComponent(); UIParameter parameter = (UIParameter) comandLink.findComponent("editId"); Long id = (Long) parameter.getValue(); return id; }

//Outros métodos}

Page 134: Refatoração de código com Capitão Nascimento versão completa
Page 135: Refatoração de código com Capitão Nascimento versão completa

Crie comentários no

código

Page 136: Refatoração de código com Capitão Nascimento versão completa
Page 137: Refatoração de código com Capitão Nascimento versão completa

Utilize o JavaDoc

Page 138: Refatoração de código com Capitão Nascimento versão completa
Page 139: Refatoração de código com Capitão Nascimento versão completa

/** * @author eduardobregaida * PontoHandler * ManagedBean para fazer a ponte entre a View e o Controller */public class PontoHandler { // Classe de Ponto do ônibus private Ponto ponto = new Ponto();

// Classe da Linha do ônibus private Linha linha = new Linha(); // Método para Salvar um Ponto public void salvar() { if (ponto.getId() == 0) { negocio.salvar(this.ponto); } else { negocio.merge(this.ponto); } this.ponto = new Ponto();

}

// Método para excluir um ponto recebe um evento do componente public void excluir(ActionEvent event) { id = populaDados(event); this.ponto = negocio.carregar(id); negocio.excluir(ponto); this.ponto = new Ponto(); }

}

Page 140: Refatoração de código com Capitão Nascimento versão completa
Page 141: Refatoração de código com Capitão Nascimento versão completa

Tire as responsabilidades a mais nas classes

Page 142: Refatoração de código com Capitão Nascimento versão completa
Page 143: Refatoração de código com Capitão Nascimento versão completa

public class PontoHandler { private Ponto ponto = new Ponto(); private Session session; private DAO<Ponto> dao; public void salvar() { session = HibernateUtil.getCurrentSession(); dao = new DAO<Ponto>(session, Ponto.class); if (ponto.getId() == 0) { dao.salveOrUpdate(this.ponto); } else { session.merge(this.ponto); } this.ponto = new Ponto();

}

public void carregar(ActionEvent event) { UIComponent comandLink = event.getComponent(); UIParameter parameter = (UIParameter) comandLink .findComponent("editId"); Long id = (Long) parameter.getValue(); session = HibernateUtil.getCurrentSession(); dao = new DAO<Ponto>(session, Ponto.class); this.ponto = dao.load(id);

}

public void excluir(ActionEvent event) { UIComponent comandLink = event.getComponent(); UIParameter parameter = (UIParameter) comandLink .findComponent("editId"); Long id = (Long) parameter.getValue(); session = HibernateUtil.getCurrentSession(); DAO<Ponto> dao = new DAO<Ponto>(session, Ponto.class); this.ponto = dao.load(id); dao.deleta(ponto); this.ponto = new Ponto();

}

//Outros métodos

}

Page 144: Refatoração de código com Capitão Nascimento versão completa

public class PontoBusiness{ private Session session; private DAO<Ponto> dao; private Ponto ponto; public void salvar(Ponto ponto) { session = HibernateUtil.getCurrentSession(); dao = new DAO<Ponto>(session, Ponto.class); dao.salveOrUpdate(ponto); } public void merge(Ponto ponto) { session = HibernateUtil.getCurrentSession(); dao = new DAO<Ponto>(session, Ponto.class); session.merge(ponto); }

public Ponto carregar(Long id) { ponto = new Ponto(); session = HibernateUtil.getCurrentSession(); dao = new DAO<Ponto>(session, Ponto.class); ponto = dao.load(id); return ponto; }

public void excluir(Ponto ponto) { session = HibernateUtil.getCurrentSession(); DAO<Ponto> dao = new DAO<Ponto>(session, Ponto.class); dao.deleta(ponto); } //Outros métodos}

Page 145: Refatoração de código com Capitão Nascimento versão completa
Page 146: Refatoração de código com Capitão Nascimento versão completa

Não exponha o interior dos seus

objetos, encapsulem seus métodos

Page 147: Refatoração de código com Capitão Nascimento versão completa
Page 148: Refatoração de código com Capitão Nascimento versão completa

Esta classe apenas deve saber que o método soma recebe dois valores

public class CalculadoraTeste {

int valorA = 1; int valorB = 2;//Exemplo de DRY (Don't repeat yourself) public static void main(String[] args) { Calculadora calculadora = new Calculadora(); int resultado = calculadora.soma(valorA, valorB); System.out.println("Resultado: " + resultado); }

}

Page 149: Refatoração de código com Capitão Nascimento versão completa

O Método está em outra classe deixando invisível para classe acima

public class Calculadora {

public int soma(int valorA, int valorB) { return valorA + valorB; }}

Page 150: Refatoração de código com Capitão Nascimento versão completa
Page 151: Refatoração de código com Capitão Nascimento versão completa

Quando usar números crie constantes

Page 152: Refatoração de código com Capitão Nascimento versão completa
Page 153: Refatoração de código com Capitão Nascimento versão completa

public class Calcula { // retorno para array nulo final int ENTRADA_INVALIDA = -1; final int VALOR_ZERO = 0;

public int somaSerie() { if (array.length == VALOR_ZERO) return ENTRADA_INVALIDA; else if (isMaiorQueMetade(++count)) return VALOR_ZERO; }

// Outros métodos da classe

}

Page 154: Refatoração de código com Capitão Nascimento versão completa
Page 155: Refatoração de código com Capitão Nascimento versão completa

Utiliza a Herança quando necessário

Page 156: Refatoração de código com Capitão Nascimento versão completa
Page 157: Refatoração de código com Capitão Nascimento versão completa

public class Funcionario {

private String nome; private double salario; private int idade; private int tempoRegistro; protected String cpf;

// Getters e Setters

}

Page 158: Refatoração de código com Capitão Nascimento versão completa

public class Gerente extends Funcionario { private int senha; private int numeroDeFuncionariosGerenciados;

// Getters e Setters

}

Page 159: Refatoração de código com Capitão Nascimento versão completa

public class GerenteTeste {

public static void main(String[] args) { Funcionario funcionario = new Funcionario(); funcionario.setNome("Carlos Bergamasco"); funcionario.setSalario(5000.0); System.out.println(funcionario.getNome()+" "+funcionario.getBonificacao()); Gerente gerente = new Gerente(); // podemos chamar metodos do Funcionario: gerente.setNome("Eduardo Bregaida"); // e tambem metodos do Gerente! gerente.setSenha(4231); gerente.autentica(gerente.getSenha()); gerente.setSalario(5000.0); System.out.println(gerente.getNome()+" "+gerente.getBonificacao());

}}

Page 160: Refatoração de código com Capitão Nascimento versão completa
Page 161: Refatoração de código com Capitão Nascimento versão completa

Utilize e prefira Polimorfismo

Page 162: Refatoração de código com Capitão Nascimento versão completa
Page 163: Refatoração de código com Capitão Nascimento versão completa

public abstract class Funcionario {

private String nome; private double salario; private int idade; private int tempoRegistro; protected String cpf; private int senha;

// Getters e Setters

}

Page 164: Refatoração de código com Capitão Nascimento versão completa

public class Gerente extends Funcionario { private int numeroDeFuncionariosGerenciados;

// Getters e Setters

}

Page 165: Refatoração de código com Capitão Nascimento versão completa

public class Vendedor extends Funcionario { private long quantidadesVenda;

// Getters e Setters}

Page 166: Refatoração de código com Capitão Nascimento versão completa

public class PolimorfismoTeste {

public static void main(String[] args) {

Gerente gerente = new Gerente(); gerente.setNome("Eduardo Bregaida"); gerente.setSenha(4231); gerente.autentica(gerente.getSenha()); gerente.setSalario(5000.0); System.out.println("Gerente "+gerente.getNome()+" "+gerente.getBonificacao()); Vendedor vendedor = new Vendedor(); vendedor.setNome("Consani"); vendedor.setSalario(52); System.out.println("Vendedor "+vendedor.getNome()+" "+vendedor.getSalario());

Funcionario funcionario = new Gerente(); funcionario.setNome("Carlos Bergamasco"); funcionario.getBonificacao(); funcionario.setSalario(44.0); System.out.println("Funcionario Gerente "+funcionario.getNome()+" "+funcionario.getSalario());

funcionario = new Vendedor(); funcionario.setNome("Carlos Bergamasco"); funcionario.getBonificacao(); funcionario.setSalario(44.0); System.out.println("Funcionario Vendedor "+funcionario.getNome()+" "+funcionario.getSalario());

}}

Page 167: Refatoração de código com Capitão Nascimento versão completa
Page 168: Refatoração de código com Capitão Nascimento versão completa

Utilize a Interface

Page 169: Refatoração de código com Capitão Nascimento versão completa
Page 170: Refatoração de código com Capitão Nascimento versão completa

public abstract class Funcionario {

private String nome; private double salario; private int idade; private int tempoRegistro; protected String cpf;

// Getters e Setters

}

Page 171: Refatoração de código com Capitão Nascimento versão completa

public interface Autenticavel { public boolean autentica(int senha);}

Page 172: Refatoração de código com Capitão Nascimento versão completa

public class Gerente extends Funcionario implements Autenticavel {

private int senha;

// assinatura do contrato pela interface public boolean autentica(int senha) { if (this.senha != senha) { System.out.println("Acesso Permitido!"); return true; } else { System.out.println("Acesso Negado!"); return false; }

}}

Page 173: Refatoração de código com Capitão Nascimento versão completa
Page 174: Refatoração de código com Capitão Nascimento versão completa

Façam testes unitários

Page 175: Refatoração de código com Capitão Nascimento versão completa
Page 176: Refatoração de código com Capitão Nascimento versão completa

public class StringUtil { public static String recuperaNomeAtributo(String nomeMetodo){ if(nomeMetodo==null) throw new IllegalArgumentException("Agurmento não pode ser nulo"); return nomeMetodo; } public static String recuperaNomeAtributoNaoPodeSerVazio(String nomeMetodo){ if(nomeMetodo.equals("")) throw new IllegalArgumentException("Agurmento não pode ser vazio"); return nomeMetodo; } public static String recuperaNomeAtributoNaoPodeSerMenorQue4(String nomeMetodo){ if(nomeMetodo.length()<4) throw new IllegalArgumentException("Agurmento não pode ser menor do que 4 caracteres"); return nomeMetodo; } public static String recuperaNomeAtributoNaoPodeTerLetraMaiuscula(String nomeMetodo){ String maiuscula="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; for(int i=0; i<nomeMetodo.length(); i++){ if (maiuscula.indexOf(nomeMetodo.charAt(i),0)!=-1){ throw new IllegalArgumentException("Agurmento não pode ser nulo"); } } return nomeMetodo; }

}

Page 177: Refatoração de código com Capitão Nascimento versão completa

import junit.framework.TestCase;import br.com.cb.jUnitTes2.StringUtil;

public class StringUtilTest extends TestCase{

public void testRecuperaNomeAtributoNaoPodeSerNulo() throws Exception{ assertEquals("nome", StringUtil.recuperaNomeAtributo("nome")); } public void testRecuperaNomeAtributoNaoPodeSerVazio()throws Exception{ assertEquals("XPTO", StringUtil.recuperaNomeAtributoNaoPodeSerVazio("XPTO")); } public void testRecuperaNomeAtributoNaoPodeSerMenorQue4()throws Exception{ assertEquals("Abcd", StringUtil.recuperaNomeAtributoNaoPodeSerMenorQue4("Abcd")); } public void testRecuperaNomeAtributoNaoPodeTerLetraMaiuscula()throws Exception{ assertEquals("teste funfando", StringUtil.recuperaNomeAtributoNaoPodeTerLetraMaiuscula("teste funfando"));

}}

Page 178: Refatoração de código com Capitão Nascimento versão completa
Page 179: Refatoração de código com Capitão Nascimento versão completa

TDD - Test Driven Development

Page 180: Refatoração de código com Capitão Nascimento versão completa
Page 181: Refatoração de código com Capitão Nascimento versão completa
Page 182: Refatoração de código com Capitão Nascimento versão completa

import static org.junit.Assert.assertEquals;import org.junit.Test;import br.com.cb.tdd.junit.Calculadora;

public class CalculadoraTeste { Calculadora calculadora = new Calculadora();

@Test public void deveriaSomarDoisValoresPassados() throws Exception { assertEquals(3, calculadora.soma(1, 2)); }

}

Page 183: Refatoração de código com Capitão Nascimento versão completa

public class Calculadora {

public int soma(int valorA, int valorB) { return valorA + valorB; }

}

Page 184: Refatoração de código com Capitão Nascimento versão completa
Page 185: Refatoração de código com Capitão Nascimento versão completa

import static org.junit.Assert.assertEquals;import org.junit.Test;import br.com.cb.tdd.junit.Calculadora;

public class CalculadoraTeste { Calculadora calculadora = new Calculadora();

@Test public void deveriaSomarDoisValoresPassados() throws Exception { assertEquals(3, calculadora.soma(1, 2)); }

@Test public void deveriaSubtrairDoisValoresPassados() throws Exception { assertEquals(2, calculadora.subtracao(5, 3)); }

}

Page 186: Refatoração de código com Capitão Nascimento versão completa

public class Calculadora {

public int soma(int valorA, int valorB) { return valorA + valorB; }

public int subtracao(int valorA, int valorB) { return valorA - valorB; }

}

Page 187: Refatoração de código com Capitão Nascimento versão completa
Page 188: Refatoração de código com Capitão Nascimento versão completa

import static org.junit.Assert.assertEquals;import org.junit.Test;import br.com.cb.tdd.junit.Calculadora;

public class CalculadoraTeste { Calculadora calculadora = new Calculadora();

@Test public void deveriaSomarDoisValoresPassados() throws Exception { assertEquals(3, calculadora.soma(1, 2)); }

@Test public void deveriaSubtrairDoisValoresPassados() throws Exception { assertEquals(2, calculadora.subtracao(5, 3)); }

@Test public void deveriaMultiplicarDoisValoresPassados() throws Exception { assertEquals(15, calculadora.multiplicacao(5, 3)); }}

Page 189: Refatoração de código com Capitão Nascimento versão completa

public class Calculadora {

public int soma(int valorA, int valorB) { return valorA + valorB; }

public int subtracao(int valorA, int valorB) { return valorA - valorB; }

public int multiplicacao(int valorA, int valorB) { return valorA * valorB; }

}

Page 190: Refatoração de código com Capitão Nascimento versão completa
Page 191: Refatoração de código com Capitão Nascimento versão completa

import static org.junit.Assert.assertEquals;import org.junit.Test;import br.com.cb.tdd.junit.Calculadora;

public class CalculadoraTeste { Calculadora calculadora = new Calculadora();

@Test public void deveriaSomarDoisValoresPassados() throws Exception { assertEquals(3, calculadora.soma(1, 2)); }

@Test public void deveriaSubtrairDoisValoresPassados() throws Exception { assertEquals(2, calculadora.subtracao(5, 3)); }

@Test public void deveriaMultiplicarDoisValoresPassados() throws Exception { assertEquals(15, calculadora.multiplicacao(5, 3)); } @Test public void deveriaDividirDoisValoresPassados() throws Exception { assertEquals(3, calculadora.divisao(9, 3)); }}

Page 192: Refatoração de código com Capitão Nascimento versão completa

public class Calculadora {

public int soma(int valorA, int valorB) { return valorA + valorB; }

public int subtracao(int valorA, int valorB) { return valorA - valorB; }

public int multiplicacao(int valorA, int valorB) { return valorA * valorB; }

public int divisao(int valorA, int valorB) { return valorA / valorB; }}

Page 193: Refatoração de código com Capitão Nascimento versão completa
Page 194: Refatoração de código com Capitão Nascimento versão completa
Page 195: Refatoração de código com Capitão Nascimento versão completa

Esse negócio aí de testar é chato

demais e demora

Page 196: Refatoração de código com Capitão Nascimento versão completa
Page 197: Refatoração de código com Capitão Nascimento versão completa
Page 198: Refatoração de código com Capitão Nascimento versão completa

O senhor seu Xerife é um fraco

Page 199: Refatoração de código com Capitão Nascimento versão completa
Page 200: Refatoração de código com Capitão Nascimento versão completa

Seu lugar não é aqui com

profissionais

Page 201: Refatoração de código com Capitão Nascimento versão completa
Page 202: Refatoração de código com Capitão Nascimento versão completa

Eu desisto senhor!

Page 203: Refatoração de código com Capitão Nascimento versão completa
Page 204: Refatoração de código com Capitão Nascimento versão completa
Page 205: Refatoração de código com Capitão Nascimento versão completa

Os senhores estão deixando seu

capitão muito feliz

Page 206: Refatoração de código com Capitão Nascimento versão completa
Page 207: Refatoração de código com Capitão Nascimento versão completa
Page 208: Refatoração de código com Capitão Nascimento versão completa
Page 209: Refatoração de código com Capitão Nascimento versão completa

Testes mostram qualidade

Page 210: Refatoração de código com Capitão Nascimento versão completa
Page 211: Refatoração de código com Capitão Nascimento versão completa

Qualidade mostra que irá funcionar

Page 212: Refatoração de código com Capitão Nascimento versão completa
Page 213: Refatoração de código com Capitão Nascimento versão completa

Teste é o que diferencia

programadores de crianças

Page 214: Refatoração de código com Capitão Nascimento versão completa
Page 215: Refatoração de código com Capitão Nascimento versão completa

Estude Mocks

Page 216: Refatoração de código com Capitão Nascimento versão completa
Page 217: Refatoração de código com Capitão Nascimento versão completa

Há diversos frameworks que

facilitam o uso de mocks

Page 218: Refatoração de código com Capitão Nascimento versão completa
Page 219: Refatoração de código com Capitão Nascimento versão completa

Estude teste de Integração

Page 220: Refatoração de código com Capitão Nascimento versão completa
Page 221: Refatoração de código com Capitão Nascimento versão completa
Page 222: Refatoração de código com Capitão Nascimento versão completa

Quer subir seu código no controle de

versão?

Page 223: Refatoração de código com Capitão Nascimento versão completa
Page 224: Refatoração de código com Capitão Nascimento versão completa

Sem teste?

Page 225: Refatoração de código com Capitão Nascimento versão completa
Page 226: Refatoração de código com Capitão Nascimento versão completa
Page 227: Refatoração de código com Capitão Nascimento versão completa

Não vai subir ninguém

Page 228: Refatoração de código com Capitão Nascimento versão completa
Page 229: Refatoração de código com Capitão Nascimento versão completa

Vai todo mundo ficar quietinho aí e

testar

Page 230: Refatoração de código com Capitão Nascimento versão completa
Page 231: Refatoração de código com Capitão Nascimento versão completa
Page 232: Refatoração de código com Capitão Nascimento versão completa

Se não testar...

Page 233: Refatoração de código com Capitão Nascimento versão completa
Page 234: Refatoração de código com Capitão Nascimento versão completa

Já avisei

Page 235: Refatoração de código com Capitão Nascimento versão completa
Page 236: Refatoração de código com Capitão Nascimento versão completa

Isso vai dar merda

Page 237: Refatoração de código com Capitão Nascimento versão completa
Page 238: Refatoração de código com Capitão Nascimento versão completa
Page 239: Refatoração de código com Capitão Nascimento versão completa

Se os senhores não fizerem isso...

Page 240: Refatoração de código com Capitão Nascimento versão completa
Page 241: Refatoração de código com Capitão Nascimento versão completa

Bota ele no saco

Page 242: Refatoração de código com Capitão Nascimento versão completa
Page 243: Refatoração de código com Capitão Nascimento versão completa
Page 244: Refatoração de código com Capitão Nascimento versão completa
Page 245: Refatoração de código com Capitão Nascimento versão completa

Se persistir no erro...

Page 246: Refatoração de código com Capitão Nascimento versão completa
Page 247: Refatoração de código com Capitão Nascimento versão completa
Page 248: Refatoração de código com Capitão Nascimento versão completa

Pede pra sair

Page 249: Refatoração de código com Capitão Nascimento versão completa
Page 250: Refatoração de código com Capitão Nascimento versão completa

Pede pra sair

Page 251: Refatoração de código com Capitão Nascimento versão completa
Page 252: Refatoração de código com Capitão Nascimento versão completa
Page 253: Refatoração de código com Capitão Nascimento versão completa

Tira essa roupa preta, porque você não merece usar

Page 254: Refatoração de código com Capitão Nascimento versão completa
Page 255: Refatoração de código com Capitão Nascimento versão completa
Page 256: Refatoração de código com Capitão Nascimento versão completa

Se não sair e não mudar

Page 257: Refatoração de código com Capitão Nascimento versão completa
Page 258: Refatoração de código com Capitão Nascimento versão completa

Bota na conta do papa

Page 259: Refatoração de código com Capitão Nascimento versão completa
Page 260: Refatoração de código com Capitão Nascimento versão completa
Page 261: Refatoração de código com Capitão Nascimento versão completa
Page 262: Refatoração de código com Capitão Nascimento versão completa
Page 263: Refatoração de código com Capitão Nascimento versão completa

Dúvidas?

Page 265: Refatoração de código com Capitão Nascimento versão completa

• http://www.caelum.com.br/apostilas/

• http://martinfowler.com/books.html

• http://www.slideshare.net/jeveaux/testes-e-refatorao

• http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882

• http://www.slideshare.net/cassiomarques/refatorao-design-patterns-em-rubyhttp://compare.buscape.com.br/refatoracao-aperfeicoando-o-projeto-de-codigo-existente-martin-fowler-8536303956.html

• http://www.ime.usp.br/~kon/presentations/

• http://ccsl.ime.usp.br/pt-br/palestras

• http://www.slideshare.net/guestd37c23/refactory-worshop

Para Estudar

Page 266: Refatoração de código com Capitão Nascimento versão completa

• Agradecimentos

• Carlos Daniel Bergamasco

• Braulio Consani

• Christian Reichel

• Marcelo L. Z. Ingarano

• Adriana A. Gutierre

• Rogério Ap. Bregaida Junior