Programação Orientada a Objetos
Refactoring com Hook
Class
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
• Estratégias baseadas em herança são como cartas
que só podem ser usadas uma única vez;
• Qualquer nova implementação na classe
CrudDaoImpl naturalmente será propagada
para as classes filhas;
• Em casos de métodos duplicados entre os filhos,
é natural desejar que subam para a classe pai,
contudo, podem existir outros filhos que não
usem tal método, quebrando o encapsulamento.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Hook Class vs Hook Methods
• Hook methods e Hook classes se tratam de uma
classe principal que chama um método cuja
implementação pode variar;
• Em hook methods, esse método está na mesma
classe, podendo a implementação variar de
acordo com a subclasse;
• Em hook classes, esse método está em um objeto
que compõe a classe, fazendo com que a
implementação varie com a instância.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Hook Class vs Hook Methods
Hook Method Hook Class
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Hook Class vs Hook Methods
• Reaproveitamento de código é importante,
mas mais importante é a flexibilidade e
fácil manutenibilidade que o código-fonte
OO pode proporcionar, por isso é
preferível composição à herança;
• Joshua Block diz: “Crie suas classes
pensando em herança, ou então proíba-a”
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Hook Class vs Hook Methods
• Reaproveitamento de código é importante,
mas mais importante é a flexibilidade e
fácil manutenibilidade que o código-fonte
OO pode proporcionar, por isso é
preferível composição à herança;
• Joshua Block diz: “Crie suas classes
pensando em herança, ou então proíba-a”
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refatorando para Hook Class
– Criação da interface
Crudavel
• Crie a interface e coloque todos os
métodos abstratos da classe CrudDaoImpl
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refatorando para Hook Class
– Alterando a classe
CrudDaoImpl
• A classe deixa de ser abstrata, de extender
objetos do RMI, e passa a ter uma
instância da interface Crudavel, injetada
via construtor
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refatorando para Hook Class
– Alterando a classe
CrudDaoImpl
• A classe deixa de ser abstrata, de extender
objetos do RMI, e passa a ter uma
instância da interface Crudavel, injetada
via construtor
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refatorando para Hook Class
– Alterando a classe
CrudDaoImpl
• Desse modo, os métodos da interface
passam a ser invocados, deixando a classe
CrudDaoImpl coesa.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refatorando para Hook Class
– classes ClienteDaoImpl e
PedidoDaoImpl
• Estas classes passam a implementar
Crudavel, e os métodos precisam ser
públicos
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refatorando para Hook Class
– pacote service
• A estrutura DAO está praticamente
pronta. Contudo, é necessário publicar
estes serviços via RMI, para que a
aplicação cliente os consuma;
• É desaconselhável exportar serviços na
camada DAO, já que a mesma precisa ser
genérica tanto para chamadas locais
quanto remotas;
• Para isso, será criado o pacote service, que
irá expor os serviços remotamente.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refatorando para Hook Class
– interfaces ClienteService e
PedidoService
Com estas interfaces, não são mais necessárias as
interfaces ClienteDao e PedidoDao.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refatorando para Hook Class
– classe ClienteServiceImpl
• A classe ClienteServiceImpl irá ter uma
instância de CrudDaoImpl, injetando os
parâmetros de ClienteDaoImpl
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refatorando para Hook Class
– corrigindo a classe Principal
• A classe Principal deverá ser ajustada para
exportar PedidoService e ClienteService,
encapsulando todo o pacote Dao.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refatorando para Hook Class
– exportando jar para a
aplicação cliente
• O pacote Dao não será mais exportado ao
cliente, restando apenas as interfaces de
service, e as classes de
domínio
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refatorando para Hook Class
– corrigindo aplicação cliente
• Surgirão erros na aplicação cliente, porque
esta não conhece o pacote service
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refatorando para Hook Class
– corrigindo aplicação cliente
• Correções nas classes Control.
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
• Com a composição, o código ficou menos
desacoplado e mais flexível;
• O pacote service também pode ser
implementado na solução de hook
method, embora tornou-se obrigatório no
hook class;
• Em casos onde não existe cliente remoto, o
pacote service é desnecessário.
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 5 - refactoring com hook class

  • 1.
    Programação Orientada aObjetos Refactoring com Hook Class 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 • Estratégias baseadas em herança são como cartas que só podem ser usadas uma única vez; • Qualquer nova implementação na classe CrudDaoImpl naturalmente será propagada para as classes filhas; • Em casos de métodos duplicados entre os filhos, é natural desejar que subam para a classe pai, contudo, podem existir outros filhos que não usem tal método, quebrando o encapsulamento.
  • 3.
    Prof Carlos EduardoDantas – carloseduardodantas@iftm.edu.br Hook Class vs Hook Methods • Hook methods e Hook classes se tratam de uma classe principal que chama um método cuja implementação pode variar; • Em hook methods, esse método está na mesma classe, podendo a implementação variar de acordo com a subclasse; • Em hook classes, esse método está em um objeto que compõe a classe, fazendo com que a implementação varie com a instância.
  • 4.
    Prof Carlos EduardoDantas – carloseduardodantas@iftm.edu.br Hook Class vs Hook Methods Hook Method Hook Class
  • 5.
    Prof Carlos EduardoDantas – carloseduardodantas@iftm.edu.br Hook Class vs Hook Methods • Reaproveitamento de código é importante, mas mais importante é a flexibilidade e fácil manutenibilidade que o código-fonte OO pode proporcionar, por isso é preferível composição à herança; • Joshua Block diz: “Crie suas classes pensando em herança, ou então proíba-a”
  • 6.
    Prof Carlos EduardoDantas – carloseduardodantas@iftm.edu.br Hook Class vs Hook Methods • Reaproveitamento de código é importante, mas mais importante é a flexibilidade e fácil manutenibilidade que o código-fonte OO pode proporcionar, por isso é preferível composição à herança; • Joshua Block diz: “Crie suas classes pensando em herança, ou então proíba-a”
  • 7.
    Prof Carlos EduardoDantas – carloseduardodantas@iftm.edu.br Refatorando para Hook Class – Criação da interface Crudavel • Crie a interface e coloque todos os métodos abstratos da classe CrudDaoImpl
  • 8.
    Prof Carlos EduardoDantas – carloseduardodantas@iftm.edu.br Refatorando para Hook Class – Alterando a classe CrudDaoImpl • A classe deixa de ser abstrata, de extender objetos do RMI, e passa a ter uma instância da interface Crudavel, injetada via construtor
  • 9.
    Prof Carlos EduardoDantas – carloseduardodantas@iftm.edu.br Refatorando para Hook Class – Alterando a classe CrudDaoImpl • A classe deixa de ser abstrata, de extender objetos do RMI, e passa a ter uma instância da interface Crudavel, injetada via construtor
  • 10.
    Prof Carlos EduardoDantas – carloseduardodantas@iftm.edu.br Refatorando para Hook Class – Alterando a classe CrudDaoImpl • Desse modo, os métodos da interface passam a ser invocados, deixando a classe CrudDaoImpl coesa.
  • 11.
    Prof Carlos EduardoDantas – carloseduardodantas@iftm.edu.br Refatorando para Hook Class – classes ClienteDaoImpl e PedidoDaoImpl • Estas classes passam a implementar Crudavel, e os métodos precisam ser públicos
  • 12.
    Prof Carlos EduardoDantas – carloseduardodantas@iftm.edu.br Refatorando para Hook Class – pacote service • A estrutura DAO está praticamente pronta. Contudo, é necessário publicar estes serviços via RMI, para que a aplicação cliente os consuma; • É desaconselhável exportar serviços na camada DAO, já que a mesma precisa ser genérica tanto para chamadas locais quanto remotas; • Para isso, será criado o pacote service, que irá expor os serviços remotamente.
  • 13.
    Prof Carlos EduardoDantas – carloseduardodantas@iftm.edu.br Refatorando para Hook Class – interfaces ClienteService e PedidoService Com estas interfaces, não são mais necessárias as interfaces ClienteDao e PedidoDao.
  • 14.
    Prof Carlos EduardoDantas – carloseduardodantas@iftm.edu.br Refatorando para Hook Class – classe ClienteServiceImpl • A classe ClienteServiceImpl irá ter uma instância de CrudDaoImpl, injetando os parâmetros de ClienteDaoImpl
  • 15.
    Prof Carlos EduardoDantas – carloseduardodantas@iftm.edu.br Refatorando para Hook Class – corrigindo a classe Principal • A classe Principal deverá ser ajustada para exportar PedidoService e ClienteService, encapsulando todo o pacote Dao.
  • 16.
    Prof Carlos EduardoDantas – carloseduardodantas@iftm.edu.br Refatorando para Hook Class – exportando jar para a aplicação cliente • O pacote Dao não será mais exportado ao cliente, restando apenas as interfaces de service, e as classes de domínio
  • 17.
    Prof Carlos EduardoDantas – carloseduardodantas@iftm.edu.br Refatorando para Hook Class – corrigindo aplicação cliente • Surgirão erros na aplicação cliente, porque esta não conhece o pacote service
  • 18.
    Prof Carlos EduardoDantas – carloseduardodantas@iftm.edu.br Refatorando para Hook Class – corrigindo aplicação cliente • Correções nas classes Control.
  • 19.
    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
  • 20.
    Prof Carlos EduardoDantas – carloseduardodantas@iftm.edu.br Conclusões • Com a composição, o código ficou menos desacoplado e mais flexível; • O pacote service também pode ser implementado na solução de hook method, embora tornou-se obrigatório no hook class; • Em casos onde não existe cliente remoto, o pacote service é desnecessário.
  • 21.
    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”.