O documento discute refatoração de código usando o padrão de projeto Hook Class. Especificamente, descreve como refatorar uma classe DAO usando herança para composição através da criação de uma interface e injeção de dependência na classe DAO.
Programação Orientada a Objetos - Pós Graduação - Aula 5 - refactoring com hook class
1. 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
2. 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.
3. 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.
4. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Hook Class vs Hook Methods
Hook Method Hook Class
5. 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”
6. 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”
7. 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
8. 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
9. 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
10. 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.
11. 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
12. 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.
13. 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.
14. 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
15. 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.
16. 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
17. 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
18. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refatorando para Hook Class
– corrigindo aplicação cliente
• Correções nas classes Control.
19. 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
20. 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.
21. 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”.