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

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

Embed Size (px)

DESCRIPTION

Palestra apresentada no FISL 12 Edição.

Citation preview

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