1. Programação Orientada a Objetos
Refactoring com Hook
Method
Pós Graduação em Análise e Desenvolvimento de Sistemas
Aplicados à Gestão Empresarial
INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA
TRIÂNGULO MINEIRO – Campus Uberlândia Centro
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
2. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Introdução
• Com a criação de novas telas, surgem
muitas linhas de código duplicadas;
• É necessário aplicar um refactoring no
projeto.
3. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refactoring
• Segundo Martin Fowler, Refactoring é o
processo de reestruturar o sistema sem
mudar suas funcionalidades, tornando-o
mais fácil de entender e modificar.
4. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refactoring
• Quanto mais cedo a necessidade de
refactoring for identificada, melhor;
• Muitas classes envolvidas no refactoring
resulta em muito tempo de alteração;
5. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Herança - Diagrama de
Classes
• Será utilizada uma estratégia de Herança,
onde a classe CrudDaoImpl terá o código
genérico, e as classes filhas injetarão os
parâmetros.
6. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Interface CrudDao
• Crie uma interface chamada de CrudDao;
• O código <E extends Serializable>
caracteriza o uso de genéricos.
7. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Genéricos
• A idéia por detrás dos genéricos é evitar
redundância, ocultando o tipo da classe
que será usada, para que instâncias filhas
injetem o real tipo.
• Mais detalhes em:
http://www.devmedia.com.br/usando-
generics-em-java/28981
8. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Genéricos
• A idéia por detrás dos genéricos é evitar
redundância, ocultando o tipo da classe
que será usada, para que instâncias filhas
injetem o real tipo.
• Mais detalhes em:
http://www.devmedia.com.br/usando-
generics-em-java/28981
9. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Genéricos
• A idéia por detrás dos genéricos é evitar
redundância, ocultando o tipo da classe
que será usada, para que instâncias filhas
injetem o real tipo.
• Mais detalhes em:
http://www.devmedia.com.br/usando-
generics-em-java/28981
10. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Classe CrudDaoImpl
• Deve ser criada a classe CrudDaoImpl,
implementando a Interface CrudDao.
• Ao clicar no erro, os métodos da interface
serão mostrados para que sejam
implementados.
11. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Classe CrudDaoImpl
12. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Classe CrudDaoImpl
• Os métodos podem ser preenchidos com o
código de uma das classes filhas, como
por exemplo, ClienteDaoImpl.
• A idéia agora é preservar o que é genérico,
e retirar o que é particular de cada filho.
13. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Classe CrudDaoImpl
14. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Classe CrudDaoImpl
• Observa-se que os métodos salvar e pesquisar
ainda possuem falhas, pois nestes casos, não tem
como abstrair completamente o comportamento
das classes filhas apenas usando genéricos.
• Para isso, é necessário criar métodos abstratos,
delegando a implementação para as classes
filhas;
• Também foi criado uma nova classe genérica,
chamada I, para representar o tipo da chave.
15. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Classe CrudDaoImpl
• Desta forma, delegou-se para os filhos
entregarem os parâmetros específicos que a
classe CrudDao precisa para concluir o método;
• Esta abordagem é chamada de Hook Method (ou
métodos gancho), utilizando um padrão de
projeto chamado Template Method.
16. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Interfaces ClienteDao e
PedidoDao
• Implementa-se as interfaces ClienteDao e
PedidoDao, extendendo de CrudDao e
injetando a classe que substitui a classe
genérica <E extends Serializable>
17. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Classe ClienteDaoImpl
• A classe deve ser filha da classe CrudDaoImpl, e
deve-se clicar no erro para implementar os
métodos abstratos que CrudDaoImpl definiu, ou
seja, os métodos abstratos que ClienteDaoImpl
irá implementar serão como ganchos para que
CrudDaoImpl execute seus métodos.
18. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Classe ClienteDaoImpl
• Implementa-se os métodos gancho, e remove os
métodos salvarAtualizar(),excluir() e
pesquisar(), pois já estão implementados na
classe pai.
19. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Classe PedidoDaoImpl
• Com a classe PedidoDaoImpl se realiza o mesmo
procedimento.
20. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
SerialversionUID
• Este link esclarece dúvidas sobre o
SerialVersionUID
• http://blog.caelum.com.br/entendendo-
o-serialversionuid/
21. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Geração do JAR para o
cliente
22. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Execução
• Subir o servidor no Eclipse;
• Subir o banco de dados no NetBeans;
• Executar o comando limpar e construir
clicando com o botão direito no projeto
23. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Conclusões
• Houve uma considerável melhoria no
projeto, levando-se em consideração o
reaproveitamento de código;
• Herança possui desvantagens, pois a
quebra de encapsulamento é sempre uma
ameaça;
• Na próxima aula, será demonstrada a
estratégia de hook class, ou composição.
24. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Referências
• ANICHE, Maurício. Orientação a objetos e
SOLID para Ninjas. Casa do Código, 2015;
• GUERRA, Eduardo. Design Patterns com Java.
Casa do Código, 2014;
• “LARMAN, Craig – Utilizando UML e Padrões
3ª Edição. Bookman, 2007”.