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
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.
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.
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;
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.
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.
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
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
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
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.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Classe CrudDaoImpl
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.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Classe CrudDaoImpl
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.
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.
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>
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.
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.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Classe PedidoDaoImpl
• Com a classe PedidoDaoImpl se realiza o mesmo
procedimento.
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/
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Geração do JAR para o
cliente
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
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.
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”.

Programação Orientada a Objetos - Pós Graduação - Aula 4 - refactoring com hook method

  • 1.
    Programação Orientada aObjetos 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 EduardoDantas – 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 EduardoDantas – 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 EduardoDantas – 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 EduardoDantas – 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 EduardoDantas – 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 EduardoDantas – 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 EduardoDantas – 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 EduardoDantas – 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 EduardoDantas – 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 EduardoDantas – carloseduardodantas@iftm.edu.br Classe CrudDaoImpl
  • 12.
    Prof Carlos EduardoDantas – 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 EduardoDantas – carloseduardodantas@iftm.edu.br Classe CrudDaoImpl
  • 14.
    Prof Carlos EduardoDantas – 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 EduardoDantas – 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 EduardoDantas – 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 EduardoDantas – 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 EduardoDantas – 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 EduardoDantas – carloseduardodantas@iftm.edu.br Classe PedidoDaoImpl • Com a classe PedidoDaoImpl se realiza o mesmo procedimento.
  • 20.
    Prof Carlos EduardoDantas – carloseduardodantas@iftm.edu.br SerialversionUID • Este link esclarece dúvidas sobre o SerialVersionUID • http://blog.caelum.com.br/entendendo- o-serialversionuid/
  • 21.
    Prof Carlos EduardoDantas – carloseduardodantas@iftm.edu.br Geração do JAR para o cliente
  • 22.
    Prof Carlos EduardoDantas – 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 EduardoDantas – 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 EduardoDantas – 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”.