O documento resume técnicas de refactoring de código, apresentando um exemplo de extração de método onde fragmentos de código são agrupados em métodos com nomes explicativos para tornar a lógica mais clara.
Certificações
Formação Acadêmica
Ciências daComputação – UFSC
Gerenciamento de Projetos - FGV
SCJA, SCJP, SCJD, SCWCD, SCBCD, PMP, MCP e CSM
Experiência
Há mais de 12 anos desenvolvendo software na
plataforma Java com as empresas: EDS, HP, NET,
Citibank, GM, Dígitro, Softplan, OnCast, Senai,
VALE, RBS, Unimed, Globalcode, V.Office, Suntech,
WPlex e Gennera.
5.
• Há maisde 5 anos liderando pessoas.
• Mais de 2000 horas em sala de aula.
• Mais de 100 apresentações em eventos.
• 6 artigos escritos para revistas.
• 1 livro.
• Mais de 500 profissionais treinados.
• Criação de 22 palestras.
• Criação de 10 treinamentos.
• Criação de mais de 3.000 slides.
Existe um fragmentode código que
poderia ser agrupado para tornar a
lógica mais fácil de ser entendida.
Transforme esse fragmento em um
método cujo nome explique o
propósito do mesmo.
Você tem umavariável temporária
que recebe uma única atribuição de
uma expressão simples.
Substitua todas as referências a
essa variável temporária pela
expressão.
Você está lendodiverso valores de um
objeto e passando esses valores como
parâmetros em uma chamada de
método.
Em vez de fazer isso, envie o
objeto inteiro.
92.
1. public classBoletim {
2. public void renderizarMedia() {
3. int nota1 = notasParciais.getNota1();
4. int nota2 = notasParciais.getNota2();
5. int nota3 = notasParciais.getNota3();
6. int nota4 = notasParciais.getNota4();
7. double media = calcularMedia(nota1, nota2, nota3, nota4);
8. }
9. }
93.
E se houveruma modificação que
solicita a inclusão de mais uma nota?
94.
1. public classBoletim {
2. public void renderizarMedia() {
3. int nota1 = notasParciais.getNota1();
4. int nota2 = notasParciais.getNota2();
5. int nota3 = notasParciais.getNota3();
6. int nota4 = notasParciais.getNota4();
7. double media = calcularMedia(nota1, nota2, nota3, nota4);
8. }
9. }
95.
1. public classBoletim {
2. public void renderizarMedia() {
3. int nota1 = notasParciais.getNota1();
4. int nota2 = notasParciais.getNota2();
5. int nota3 = notasParciais.getNota3();
6. int nota4 = notasParciais.getNota4();
7. int nota5 = notasParciais.getNota5();
8. double media = calcularMedia(nota1, nota2, nota3, nota4,
nota5);
9. }
10. }
96.
1. public classBoletim {
2. public void renderizarMedia() {
3. int nota1 = notasParciais.getNota1();
4. int nota2 = notasParciais.getNota2();
5. int nota3 = notasParciais.getNota3();
6. int nota4 = notasParciais.getNota4();
7. int nota5 = notasParciais.getNota5();
8. int nota6 = notasParciais.getNota6();
9. double media = calcularMedia(nota1, nota2, nota3, nota4,
nota5, nota6);
10. }
11. }
Você tem umcomando condicional que
seleciona diferentes comportamentos
de acordo com o tipo de objeto.
Mova cada ramificação do comando
condicional para um método de
sobrescrita em uma subclasse. Torne
abstrato o método original.
178.
1. public voidemitirExtrato(String tipo) {
2. if(tipo.equals(“SimplificadoMensal”)) {
3. // Código para emissão do extrato simplificado mensal.
4. } else if(tipo.equals(“SimplificadoQuinzenal”)) {
5. // Código para emissão do extrato simplificado quinzenal.
6. } else if(tipo.equals(“SimplificadoSemanal”)) {
7. // Código para emissão do extrato simplificado semanal.
8. } else if(tipo.equals(“Completo”)) {
9. // Código para emissão do extrato completo.
10. }
11. }
Você tem umaclasse, perdendo
coesão, fazendo um trabalho que
poderia ser feito por duas ou mais
classes.
Crie uma nova classe e mova os
campos e métodos pertinentes.
202.
1. public classSecurity {
2. private static final String RULES_PATH = “/usr/rules.xml”;
3.
4. public Security() {
5. this.loadRules(RULES_PATH);
6. }
7.
8. private void loadRules(String rulesPath) {
9. // Código que carrega as regras.
10. }
11.
12. public boolean verifyUser(User user) {
13. // Código que valida o usuário.
14. }
15. }
203.
1. public classSecurity {
2. private static final String RULES_PATH = “/usr/rules.xml”;
3.
4. public Security() {
5. this.loadRules(RULES_PATH);
6. }
7.
8. private void loadRules(String rulesPath) {
9. // Código que carrega as regras.
10. }
11.
12. public boolean verifyUser(User user) {
13. // Código que valida o usuário.
14. }
15. }
204.
1. public classSecurity {
2.
3. public Security() {
4. }
5.
6. public boolean verifyUser(User user) {
7. // Código que valida o usuário.
8. }
9. }
205.
1. public classSecurity {
2.
3. public Security() {
4.
5. }
6.
7. public boolean verifyUser(User user) {
8. // Código que valida o usuário.
9. }
10. }
206.
1. public classSecurity {
2.
3. public Security() {
4. SecurityRulesLoader.loadRules();
5. }
6.
7. public boolean verifyUser(User user) {
8. // Código que valida o usuário.
9. }
10. }
207.
1. public classSecurityRulesLoader {
2. private static final String RULES_PATH = “/usr/rules.xml”;
3.
4. public static void loadRules() {
5. // Código que carrega as regras.
6. }
7.
8. }
Você tem doismétodos em subclasses
diferentes que executam passos
semelhantes na mesma ordem, mas
esses passos são diferentes.
Utilize um Template Method para
eliminar a duplicação.
237.
1. public classCafe {
2. public void fazerCafe() {
3. ferverAgua();
4. passarCafe();
5. colocarNaXicara();
6. colocarAcucar();
7. }
8. public void ferverAgua() {
9. System.out.println(“Fervendo a água...”);
10. }
11. public void passarCafe() {
12. System.out.println(“Passando o café...”);
13. }
14. public void colocaNaXicara() {
15. System.out.println(“Colocando na xícara...”);
16. }
17. public void colocarAcucar() {
18. System.out.println(“Colocando açucar...”);
19. }
20. }
238.
1. public classCha {
2. public void fazerCha() {
3. ferverAgua();
4. mergulharCha();
5. colocarNaXicara();
6. colocarLimao();
7. }
8. public void ferverAgua() {
9. System.out.println(“Fervendo a água...”);
10. }
11. public void mergulharCha() {
12. System.out.println(“Mergulhando o chá...”);
13. }
14. public void colocaNaXicara() {
15. System.out.println(“Colocando na xícara...”);
16. }
17. public void colocarLimao() {
18. System.out.println(“Colocando limão...”);
19. }
20. }
239.
1. public classCafe {
2. public void fazerCafe() {
3. ferverAgua();
4. passarCafe();
5. colocarNaXicara();
6. colocarAcucar();
7. }
8. public void ferverAgua() {
9. System.out.println(“Fervendo a água...”);
10. }
11. public void passarCafe() {
12. System.out.println(“Passando o café...”);
13. }
14. public void colocaNaXicara() {
15. System.out.println(“Colocando na xícara...”);
16. }
17. public void colocarAcucar() {
18. System.out.println(“Colocando açucar...”);
19. }
20. }
240.
1. public classCha {
2. public void fazerCha() {
3. ferverAgua();
4. mergulharCha();
5. colocarNaXicara();
6. colocarLimao();
7. }
8. public void ferverAgua() {
9. System.out.println(“Fervendo a água...”);
10. }
11. public void mergulharCha() {
12. System.out.println(“Mergulhando o chá...”);
13. }
14. public void colocaNaXicara() {
15. System.out.println(“Colocando na xícara...”);
16. }
17. public void colocarLimao() {
18. System.out.println(“Colocando limão...”);
19. }
20. }
241.
1. public abstractclass BebidaQuente {
2. public void prepararBebida() {
3. ferverAgua();
4. infusao();
5. colocarNaXicara();
6. condimentar();
7. }
8. public void ferverAgua() {
9. System.out.println(“Fervendo a água...”);
10. }
11. public abstract void infusao();
12. public void colocaNaXicara() {
13. System.out.println(“Colocando na xícara...”);
14. }
15. public abstract void condimentar();
16. }
242.
1. public classCafé extends BebidaQuente {
2. public void infusao() {
3. System.out.println(“Passando o café...”);
4. }
5. public void condimentar() {
6. System.out.println(“Colocando açucar...”);
7. }
8. }
243.
1. public classCha extends BebidaQuente {
2. public void infusao() {
3. System.out.println(“Mergulhando o chá...”);
4. }
5. public void condimentar() {
6. System.out.println(“Colocando limão...”);
7. }
8. }
Você está lançandouma exceção
genérica
Tente lançar exceções específicas
269.
1. public voidcalcularImposto(int salario) throws Exception {
2. if(salario < 0) {
3. throw new Exception(“Salário não pode ser negativo”);
4. }
5. // Código de cálculo do imposto retido na fonte
6. }
270.
1. public voidcalcularImposto(int salario) throws Exception {
2. if(salario < 0) {
3. throw new Exception(“Salário não pode ser negativo”);
4. }
5. // Código de cálculo do imposto retido na fonte
6. }
271.
1. public voidcalcularImposto(int salario) {
2. if(salario < 0) {
3. throw new (“Salário não pode ser negativo”);
4. }
5. // Código de cálculo do imposto retido na fonte
6. }
272.
1. public voidcalcularImposto(int salario) {
2. if(salario < 0) {
3. throw new IllegalArgumentException(“Salário não pode ser
negativo”);
4. }
5. // Código de cálculo do imposto retido na fonte
6. }
Você pode utilizaruma das exceção
padrão da linguagem para tratar
um cenário específico
Substitua a exceção customizada
pela padrão da linguagem
323.
1. public voidconverterVideo(Video video) {
2. if(video == null) {
3. throw new VideoInvalidoException();
4. }
5. // Código da conversão do video
6. }
324.
Principais exceções dalinguagem:
IllegalArgumentException
IllegalStateException
NullPointerException
IndexOutOfBoundsException
UnsupportedOperationException
325.
1. public voidconverterVideo(Video video) {
2. if(video == null) {
3. throw new VideoInvalidoException();
4. }
5. // Código da conversão do video
6. }
326.
1. public voidconverterVideo(Video video) {
2. if(video == null) {
3. throw new ();
4. }
5. // Código da conversão do video
6. }
327.
1. public voidconverterVideo(Video video) {
2. if(video == null) {
3. throw new IllegalArgumentException();
4. }
5. // Código da conversão do video
6. }
Exceções de camadasinferiores
estão sendo tratadas em camadas
superiores, fora de seu nível de
abstração
Trate a exceção em sua camada de
forma correta
330.
1. public classCadastroGUI {
2. CadastroBusiness cadastroBusiness;
3.
4. public void mostrarCliente(int id) {
5. Cliente cliente;
6. try {
7. cliente = cadastroBusiness.buscarCliente(id);
8. } catch (SQLException e) {
9. // Código de tratamento da exceção
10. }
11. // Código de exibição do cliente
12. }
13. }
331.
1. public classCadastroGUI {
2. CadastroBusiness cadastroBusiness;
3.
4. public void mostrarCliente(int id) {
5. Cliente cliente;
6. try {
7. cliente = cadastroBusiness.buscarCliente(id);
8. } catch (e) {
9. // Código de tratamento
10. }
11. // Código de exibição do cliente
12. }
13. }
332.
1. public classCadastroGUI {
2. CadastroBusiness cadastroBusiness;
3.
4. public void mostrarCliente(int id) {
5. Cliente cliente;
6. try {
7. cliente = cadastroBusiness.buscarCliente(id);
8. } catch (ClienteNaoEncontradoException e) {
9. // Código de tratamento de clientes não encontrados
10. }
11. // Código de exibição do cliente
12. }
13. }
333.
1. public classCadastroGUI {
2. CadastroBusiness cadastroBusiness;
3.
4. public void mostrarCliente(int id) {
5. Cliente cliente;
6. try {
7. cliente = cadastroBusiness.buscarCliente(id);
8. } catch (ClienteNaoEncontradoException e) {
9. // Código de tratamento de clientes não encontrados
10. } catch (ClienteDesatualizadoException e) {
11. // Código de tratamento de clientes desatualizados
12. }
13. // Código de exibição do cliente
14. }
15. }
Você está tratandoexceções
verificadas (checked) em casos
onde não existe recuperação
Substitua a exceção verificada por
um wrapper que trate as exceções
como tempo de execução (Runtime)
336.
1. public voidtratarConteudoDoArquivo(String path) {
2. File arquivo = new File(path);
3. try {
4. FileInputStream input = new FileInputStream(arquivo);
5. byte[] conteudo = new byte[input.available()];
6. input.read(conteudo);
7. for (byte eachByte : conteudo) {
8. // Código de tratamento do conteúdo
9. }
10. } catch(FileNotFoundException e) {
11. // Fazer o que???
12. } catch (IOException e) {
13. // Fazer o que???
14. }
15. }