4. Certificações
Formação Acadêmica
Ciências da Computaçã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á mais de 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.
8. Existe um fragmento de 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.
32. Você tem uma variá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.
91. Você está lendo diverso 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 class Boletim {
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 houver uma modificação que
solicita a inclusão de mais uma nota?
94. 1. public class Boletim {
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 class Boletim {
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 class Boletim {
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. }
98. 1. public class Boletim {
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. }
99. 1. public class Boletim {
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();
8. }
9. }
100. 1. public class Boletim {
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(notasParciais);
8. }
9. }
101. 1. public class Boletim {
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(notasParciais);
8. }
9. }
102. 1. public class Boletim {
2. public void renderizarMedia() {
3. double media = calcularMedia(notasParciais);
4. }
5. }
103. 1. public class Boletim {
2. public void renderizarMedia() {
3. double media = calcularMedia(notasParciais);
4. }
5. }
177. Você tem um comando 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 void emitirExtrato(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. }
184. 1. public void emitirExtrato(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. }
185. 1. public abstract class Extrato {
2. public abstract void emitir();
3. }
4.
5. public class ExtratoSimplificadoMensal extends Extrato {
6. public void emitir() {
7. // Código para emissão do extrato simplificado mensal.
8. }
9. }
10.
11. public class ExtratoCompleto extends Extrato {
12. public void emitir() {
13. // Código para emissão do extrato completo.
14. }
15. }
201. Você tem uma classe, 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 class Security {
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 class Security {
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 class Security {
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 class Security {
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 class Security {
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 class SecurityRulesLoader {
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. }
209. Uma classe referencia uma outra
classe delegada por um objeto.
Crie métodos no servidor para ocultar
a delegação.
210. 1. // Código da classe PaperBoy…
2. double valorAPagar = 2.00;
3. if (cliente.getCarteira().getTotal() > valorAPagar) {
4. cliente.getCarteira().retirarDinheiro(valorAPagar);
5. } else {
6. // Volte quando tiver dinheiro para pagar…
7. }
211. 1. // Código da classe PaperBoy…
2. double valorAPagar = 2.00;
3. if (cliente.getCarteira().getTotal() > valorAPagar) {
4. cliente.getCarteira().retirarDinheiro(valorAPagar);
5. } else {
6. // Volte quando tiver dinheiro para pagar…
7. }
212. 1. // Código da classe PaperBoy…
2. double valorAPagar = 2.00;
3. if () {
4.
5. } else {
6. // Volte quando tiver dinheiro para pagar…
7. }
213. 1. // Código da classe PaperBoy…
2. double valorAPagar = 2.00;
3. if (cliente.pagar(valorAPagar)) {
4. // Agradecemos a preferência…
5. } else {
6. // Volte quando tiver dinheiro para pagar…
7. }
236. Você tem dois mé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 class Cafe {
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 class Cha {
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 class Cafe {
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 class Cha {
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 abstract class 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 class Café 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 class Cha 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. }
245. Você tem um switch ou aninhamento
de condicional e não quer criar um
conjunto de classes.
Utilize um enum com strategy
para absorver o polimorfismo.
246. 1. public class Banco {
2.
3. public void emitirExtrato(String tipo) {
4. if(tipo.equals(“SimplificadoMensal”)) {
5. // Código para emissão do extrato simplificado mensal.
6. } else if(tipo.equals(“SimplificadoQuinzenal”)) {
7. // Código para emissão do extrato simplificado quinzenal.
8. } else if(tipo.equals(“SimplificadoSemanal”)) {
9. // Código para emissão do extrato simplificado semanal.
10. } else if(tipo.equals(“Completo”)) {
11. // Código para emissão do extrato completo.
12. }
13. }
14.
15. }
254. Você tem construtores que
recebem muitos parâmetros e
alguns deles são opcionais.
Utilize uma Fluent Interface para
flexibilizar a criação dos objetos.
255. 1. new EmailMessage()
2. .from(“rodrigo.branas@gmail.com”)
3. .to(“contato@globo.com”)
4. .withSubject(“Fluent API - Demo”)
5. .withMessage(“Message…”)
6. .send();
268. Você está lançando uma exceção
genérica
Tente lançar exceções específicas
269. 1. public void calcularImposto(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 void calcularImposto(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 void calcularImposto(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 void calcularImposto(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. }
322. Você pode utilizar uma 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 void converterVideo(Video video) {
2. if(video == null) {
3. throw new VideoInvalidoException();
4. }
5. // Código da conversão do video
6. }
324. Principais exceções da linguagem:
IllegalArgumentException
IllegalStateException
NullPointerException
IndexOutOfBoundsException
UnsupportedOperationException
325. 1. public void converterVideo(Video video) {
2. if(video == null) {
3. throw new VideoInvalidoException();
4. }
5. // Código da conversão do video
6. }
326. 1. public void converterVideo(Video video) {
2. if(video == null) {
3. throw new ();
4. }
5. // Código da conversão do video
6. }
327. 1. public void converterVideo(Video video) {
2. if(video == null) {
3. throw new IllegalArgumentException();
4. }
5. // Código da conversão do video
6. }
329. Exceções de camadas inferiores
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 class CadastroGUI {
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 class CadastroGUI {
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 class CadastroGUI {
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 class CadastroGUI {
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. }
335. Você está tratando exceçõ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 void tratarConteudoDoArquivo(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. }