SlideShare a Scribd company logo
1 of 39
Download to read offline
Programação Orientada a Objetos
Inversão de
Controle
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
Separação de
responsabilidades
• Ao pensar no design de uma aplicação, deve-se
pensar no grupo de objetos que trabalham em
conjunto para uma determinada finalidade;
• Ao desenhar pequenas classes que, juntas,
realizam uma tarefa maior, o programador
ganha em simplicidade e modularidade;
• Sistemas fáceis de manter são os que contém
classes que possuem apenas uma
responsabilidade bem definida, já que a
alteração do comportamento é isolada.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Baixo acoplamento e alta
coesão
• O desejável é que mudanças em uma parte do
sistema não impliquem em mudanças em outras
partes;
• A necessidade de atualizar diversos pontos do
código em alterar uma funcionalidade indica
que estes pontos estão ligados ou acoplados de
maneira indesejada;
• Acoplamento é o quanto dois elementos estão
amarrados entre si e quanto as alterações no
comportamento de um afetam o de outro.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Baixo acoplamento e alta
coesão
• Minimizar o acoplamento implica em facilitar a
troca dos componentes, além de ser peça
fundamental para a manutenção do código,
formando um arquitetura de maior qualidade;
• Baixo acoplamento é diferente de Nenhum
acoplamento;
• Deseja-se que a ligação entre dois componentes
seja a menor e mais simples possível;
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Baixo acoplamento e alta
coesão
• A razão da existência de todo componente é
exercer algum tipo de função ou
responsabilidade dentro do sistema, por isso
este deve ter alta coesão;
• Alta coesão quer dizer que suas
responsabilidades sejam relacionadas e façam
sentido juntas, que não haja responsabilidades
desconexas dentro de um mesmo componente;
• SRP – uma única razão para mudança.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Baixo acoplamento e alta
coesão
• Um método que verifica permissões de um
usuário logado e monta um relatório possui
mais de uma responsabilidade e requer
refatoração;
• Separar indica criar dois métodos distintos, e até
duas classes distintas, pois duas
responsabilidades estão vinculadas: autenticação
e execução.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Injeção de Dependências
• Mesmo com o baixo acoplamento, sempre
existirá uma ligação entre duas classes que
precisam trabalhar em conjunto.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Injeção de Dependências
• No exemplo anterior, Dao existe para que se
encapsule os detalhes de acesso a dados,
contudo precisa de recursos para realizar seu
trabalho, como conexão com o banco.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Injeção de Dependências
• É inviável repetir o código de conexão, e outros
detalhes como externalização de configurações,
pool de conexões, etc.. É óbvio que ProjetoDao
tem responsabilidades demais.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Injeção de Dependências
• No último exemplo, não seria possível salvar
dois projetos com a mesma conexão, nem
executar dois métodos Dao em uma única
transação.
• Essa é uma má prática conhecida como sessão
por operação, ou transação por operação;
• Esse exemplo soa
familiar?
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Injeção de Dependências
• Neste exemplo, o Dao acabaria com uma grande
quantidade de métodos, a maioria formado por
uma combinação de outros, ou seja, o Dao
trabalha demais.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Injeção de Dependências
• O problema deste exemplo é se o método inicia()
for esquecido de ser invocado, ou seja, o
objetoDao não é um bom cidadão, já que pode
ser instanciado sem que todas as suas
dependências sejam resolvidas.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Injeção de Dependências
• E agora?
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Injeção de Dependências
• O método fecha() quebra o encapsulamento do Dao, já
que se a implementação for trocada por outros tipos de
arquivos, não existiria conexão a ser fechada;
• Deve-se evitar espalhar responsabilidade de gerenciar o
recurso que está sendo manipulado;
• Não existe erro de compilação por não chamar o método
fecha();
• Delegar fechamento de conexão para outras classes é
ruim porque o fechamento é relativamente complexo,
pois deve-se controlar transações e exceções;
• Ainda não é possível salvar um Projeto, atualizar um
Usuário e remover uma História, já que cada Dao abre
sua conexão.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Injeção de Dependências
• A solução é tirar do Dao a responsabilidade de abrir e
fechar conexões;
• Sua única responsabilidade será tratar das operações de
manipulação do banco, mas não irá gerenciar conexões.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Injeção de Dependências
• Receber a conexão em vez de criá-la é um princípio de
injeção de dependências;
• Inverte-se quem está no controle de gerenciar a
dependência;
• O programador faz com que os objetos já recebam suas
dependências inicializados e prontos para uso;
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Inversão de Controle vs
Injeção de Dependências
• Injeção de Dependências é um caso específico de
Inversão de Controle;
• Em uma aplicação visual, ao invés de verificar o estado
de um botão de tempos em tempos, uma classe pode
registrar um listener, que será notificado quando o
evento ocorrer, onde o código do tratamento do evento
passa a ser invocado pelo botão, em vez de invocar
métodos para descobrir seu estado.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Injeção de Dependências
• Diante disso, quem irá gerenciar a conexão?
• Na injeção de dependências, existe um dependente (o
Dao), uma dependência (a conexão), e quem amarra
tudo isso é um provedor (provider).
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Injeção de Dependências
• Inverter o controle e declarar as
dependências para ser injetadas por
alguém é considerado uma boa prática de
design;
• As dependências podem ser injetadas via
construtor, métodos setter, ou diretamente
nos atributos via reflection;
• O mais recomendado é via construtor.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Injeção de Dependências
• Injeção diretamente no atributo:
• Injeção via setter:
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Injeção de Dependências
• Em CrudDao, foi implementada uma
estratégia manual de injeção de
dependências.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Injeção de Dependências
• Em ClienteControl, não existe inversão de
controle, pois esta classe sabe onde buscar
suas dependências, pelo ServiceLocator.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Injeção de Dependências
• Contudo, muitos têm utilizado
frameworks que fazem a injeção
automaticamente, como Spring, Google
Guice, Pico Container, e a especificação
CDI do Java EE 6, com o framework Weld
como implementação de referência;
• Na disciplina “Desenvolvimento de
Sistemas”, será usado o CDI com o
framework Weld.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refactoring com IoC na
camada Dao do Ecommerce
• Será aplicada uma inversão de controle
manual no projeto utilizado nas aulas
anteriores;
• Observa-se no código abaixo que está
sendo implementado a má prática
chamada transação
por operação.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refactoring com IoC na
camada Dao do Ecommerce
• Caso o sistema necessite salvar dois
clientes ou dois pedidos em uma mesma
transação, ou ainda assim salvar um
cliente e um pedido na mesma transação,
não será possível;
• Para exemplificar este cenário, será criada
uma classe Log, que será salva juntamente
com Cliente e Pedido.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refactoring com IoC na
camada Dao do Ecommerce
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refactoring com IoC na
camada Dao do Ecommerce
• Deseja-se que a classe CrudDaoImpl deixe de ter
a responsabilidade de gerenciar as conexões;
• Esta classe simplesmente irá usar as conexões
para efetuar suas operações;
• Contudo, as conexões deverão ser estado nas
classes PedidoDao,ClienteDao e LogDao, pois
estas classes podem efetuar outras operações
com o banco de dados, como uma consulta
complexa via Sql. CrudDaoImpl somente faz
operações de CRUD.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refactoring com IoC na
camada Dao do Ecommerce
• Adiciona-se o método getEntityManager() em
Crudavel
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refactoring com IoC na
camada Dao do Ecommerce
• Inverte-se o controle do Dao, exigindo que as
classes recebam a EntityManager ao serem
instanciadas.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refactoring com IoC na
camada Dao do Ecommerce
• O mesmo é feito com LogDao. Os métodos
getConsultaSql() e getParametrosMapa()
receberão implementação quando for criado algo
para consultar o log.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refactoring com IoC na
camada Dao do Ecommerce
• Observa-se que CrudDaoImpl apenas usa o
EntityManager, não gerencia mais a conexão
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refactoring com IoC na
camada Dao do Ecommerce
• Obviamente as classes do pacote service
começam a gerar erros, pois o Dao está exigindo
a EntityManager para efetuar seu trabalho;
• O gerenciamento das conexões não pode ser
feito pelas classes de service, pois estas classes
somente servem para expor o model para
clientes remotos. Deverá ser criada outra
chamada chamada repository.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refactoring com IoC na
camada Dao do Ecommerce
• Será criada uma exception para identificar erros
de sistema.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refactoring com IoC na
camada Dao do Ecommerce
• Será criada uma exception para identificar erros
de sistema.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refactoring com IoC na
camada Dao do Ecommerce
• O repositório de Cliente pode ser feito dessa
forma:
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refactoring com IoC na
camada Dao do Ecommerce
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refactoring com IoC na
camada Dao do Ecommerce
• Ao executar o sistema, naturalmente um erro
será gerado porque a tabela TB_LOG não existe,
contudo como foi feito um rollback, o cliente
também não foi inserido.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refactoring com IoC na
camada Dao do Ecommerce
• Ao editar o arquivo persistence.xml para
permitir dropar e criar tabelas, a tabela TB_LOG
irá existir, logo o insert será feito em ambas as
tabelas.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Referências
• SILVEIRA, Paulo, Guilherme. LOPES, Sérgio.
MOREIRA, Guilherme, SEPPAT, Nico. KUNG,
Fábio. Introdução à Arquitetura e Design de
Software. Editora Campus, 2012;
• 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”.

More Related Content

What's hot

Não deixe seu projeto só nas mãos do framework
Não deixe seu projeto só nas mãos do frameworkNão deixe seu projeto só nas mãos do framework
Não deixe seu projeto só nas mãos do frameworkGiuseppe Lopes
 
Dextra Sistemas: A linguagem PHP no modelo de Fábrica de Software
Dextra Sistemas: A linguagem PHP no modelo de Fábrica de SoftwareDextra Sistemas: A linguagem PHP no modelo de Fábrica de Software
Dextra Sistemas: A linguagem PHP no modelo de Fábrica de SoftwareDextra
 
Padrões De Projeto e Anti Patterns
Padrões De Projeto e Anti PatternsPadrões De Projeto e Anti Patterns
Padrões De Projeto e Anti PatternsHerval Freire
 
Certificação linux carreira lpic 1, lpic-2 e lpic-3!
Certificação linux carreira lpic 1, lpic-2 e lpic-3!Certificação linux carreira lpic 1, lpic-2 e lpic-3!
Certificação linux carreira lpic 1, lpic-2 e lpic-3!Marco Andrade
 
Primeira certificação microsoft – como se preparar para o exame?
Primeira certificação microsoft – como se preparar para o exame? Primeira certificação microsoft – como se preparar para o exame?
Primeira certificação microsoft – como se preparar para o exame? Marco Andrade
 
Padrões de Projeto - Design Patterns e Anti-Patterns
Padrões de Projeto - Design Patterns e Anti-PatternsPadrões de Projeto - Design Patterns e Anti-Patterns
Padrões de Projeto - Design Patterns e Anti-PatternsRodrigo Kono
 
O que é certificação itil foundation e quanto custa?
O que é certificação itil foundation e quanto custa?O que é certificação itil foundation e quanto custa?
O que é certificação itil foundation e quanto custa?Marco Andrade
 
Trilhando o caminho PHP [2.0]
Trilhando o caminho PHP [2.0]Trilhando o caminho PHP [2.0]
Trilhando o caminho PHP [2.0]Rafael Dohms
 
Trilhando o Caminho PHP - PHPConf2008
Trilhando o Caminho PHP - PHPConf2008Trilhando o Caminho PHP - PHPConf2008
Trilhando o Caminho PHP - PHPConf2008Rafael Dohms
 

What's hot (10)

Não deixe seu projeto só nas mãos do framework
Não deixe seu projeto só nas mãos do frameworkNão deixe seu projeto só nas mãos do framework
Não deixe seu projeto só nas mãos do framework
 
PHPZEIRO: Adote um framework
PHPZEIRO: Adote um frameworkPHPZEIRO: Adote um framework
PHPZEIRO: Adote um framework
 
Dextra Sistemas: A linguagem PHP no modelo de Fábrica de Software
Dextra Sistemas: A linguagem PHP no modelo de Fábrica de SoftwareDextra Sistemas: A linguagem PHP no modelo de Fábrica de Software
Dextra Sistemas: A linguagem PHP no modelo de Fábrica de Software
 
Padrões De Projeto e Anti Patterns
Padrões De Projeto e Anti PatternsPadrões De Projeto e Anti Patterns
Padrões De Projeto e Anti Patterns
 
Certificação linux carreira lpic 1, lpic-2 e lpic-3!
Certificação linux carreira lpic 1, lpic-2 e lpic-3!Certificação linux carreira lpic 1, lpic-2 e lpic-3!
Certificação linux carreira lpic 1, lpic-2 e lpic-3!
 
Primeira certificação microsoft – como se preparar para o exame?
Primeira certificação microsoft – como se preparar para o exame? Primeira certificação microsoft – como se preparar para o exame?
Primeira certificação microsoft – como se preparar para o exame?
 
Padrões de Projeto - Design Patterns e Anti-Patterns
Padrões de Projeto - Design Patterns e Anti-PatternsPadrões de Projeto - Design Patterns e Anti-Patterns
Padrões de Projeto - Design Patterns e Anti-Patterns
 
O que é certificação itil foundation e quanto custa?
O que é certificação itil foundation e quanto custa?O que é certificação itil foundation e quanto custa?
O que é certificação itil foundation e quanto custa?
 
Trilhando o caminho PHP [2.0]
Trilhando o caminho PHP [2.0]Trilhando o caminho PHP [2.0]
Trilhando o caminho PHP [2.0]
 
Trilhando o Caminho PHP - PHPConf2008
Trilhando o Caminho PHP - PHPConf2008Trilhando o Caminho PHP - PHPConf2008
Trilhando o Caminho PHP - PHPConf2008
 

Viewers also liked

Mini Curso - Programação de Interfaces Gráficas - aula 4
Mini Curso - Programação de Interfaces Gráficas - aula 4Mini Curso - Programação de Interfaces Gráficas - aula 4
Mini Curso - Programação de Interfaces Gráficas - aula 4Carlos Eduardo
 
Mini Curso - Programação de Interfaces Gráficas - aula 1
Mini Curso - Programação de Interfaces Gráficas - aula 1Mini Curso - Programação de Interfaces Gráficas - aula 1
Mini Curso - Programação de Interfaces Gráficas - aula 1Carlos Eduardo
 
Mini Curso - Programação de Interfaces Gráficas - aula extra persistência
Mini Curso - Programação de Interfaces Gráficas - aula extra persistênciaMini Curso - Programação de Interfaces Gráficas - aula extra persistência
Mini Curso - Programação de Interfaces Gráficas - aula extra persistênciaCarlos Eduardo
 
Mini Curso - Programação de Interfaces Gráficas - aula 3
Mini Curso - Programação de Interfaces Gráficas - aula 3Mini Curso - Programação de Interfaces Gráficas - aula 3
Mini Curso - Programação de Interfaces Gráficas - aula 3Carlos Eduardo
 
Mini Curso - Programação de Interfaces Gráficas - aula 2
Mini Curso - Programação de Interfaces Gráficas - aula 2Mini Curso - Programação de Interfaces Gráficas - aula 2
Mini Curso - Programação de Interfaces Gráficas - aula 2Carlos Eduardo
 
Apresentação wxWidgets
Apresentação wxWidgetsApresentação wxWidgets
Apresentação wxWidgetsRenzo Petri
 
Aula de Algoritmos II - Turma 222
Aula de Algoritmos II - Turma 222Aula de Algoritmos II - Turma 222
Aula de Algoritmos II - Turma 222Bianca Dantas
 
Aula sobre multithreading
Aula sobre multithreadingAula sobre multithreading
Aula sobre multithreadingBianca Dantas
 
Algoritmos Genéticos Aplicados ao Problema da Mochila Multidimensional
Algoritmos Genéticos Aplicados ao Problema da Mochila MultidimensionalAlgoritmos Genéticos Aplicados ao Problema da Mochila Multidimensional
Algoritmos Genéticos Aplicados ao Problema da Mochila MultidimensionalBianca Dantas
 
Java 08 Modificadores Acesso E Membros De Classe
Java 08 Modificadores Acesso E Membros De ClasseJava 08 Modificadores Acesso E Membros De Classe
Java 08 Modificadores Acesso E Membros De ClasseRegis Magalhães
 
Exercicios - Java Swing Listeners
Exercicios - Java Swing ListenersExercicios - Java Swing Listeners
Exercicios - Java Swing ListenersDaniel Arndt Alves
 
Projeto calculadora em_java
Projeto calculadora em_javaProjeto calculadora em_java
Projeto calculadora em_javasamuelthiago
 

Viewers also liked (20)

php 01 introducao
php 01 introducaophp 01 introducao
php 01 introducao
 
Mini Curso - Programação de Interfaces Gráficas - aula 4
Mini Curso - Programação de Interfaces Gráficas - aula 4Mini Curso - Programação de Interfaces Gráficas - aula 4
Mini Curso - Programação de Interfaces Gráficas - aula 4
 
Java Lista Exercicios 04
Java Lista Exercicios 04Java Lista Exercicios 04
Java Lista Exercicios 04
 
Mini Curso - Programação de Interfaces Gráficas - aula 1
Mini Curso - Programação de Interfaces Gráficas - aula 1Mini Curso - Programação de Interfaces Gráficas - aula 1
Mini Curso - Programação de Interfaces Gráficas - aula 1
 
Mini Curso - Programação de Interfaces Gráficas - aula extra persistência
Mini Curso - Programação de Interfaces Gráficas - aula extra persistênciaMini Curso - Programação de Interfaces Gráficas - aula extra persistência
Mini Curso - Programação de Interfaces Gráficas - aula extra persistência
 
Mini Curso - Programação de Interfaces Gráficas - aula 3
Mini Curso - Programação de Interfaces Gráficas - aula 3Mini Curso - Programação de Interfaces Gráficas - aula 3
Mini Curso - Programação de Interfaces Gráficas - aula 3
 
Mini Curso - Programação de Interfaces Gráficas - aula 2
Mini Curso - Programação de Interfaces Gráficas - aula 2Mini Curso - Programação de Interfaces Gráficas - aula 2
Mini Curso - Programação de Interfaces Gráficas - aula 2
 
Lista Exercicios C2
Lista Exercicios C2Lista Exercicios C2
Lista Exercicios C2
 
Apresentação wxWidgets
Apresentação wxWidgetsApresentação wxWidgets
Apresentação wxWidgets
 
Aula de Algoritmos II - Turma 222
Aula de Algoritmos II - Turma 222Aula de Algoritmos II - Turma 222
Aula de Algoritmos II - Turma 222
 
Java 07 Entrada Dados
Java 07 Entrada DadosJava 07 Entrada Dados
Java 07 Entrada Dados
 
Aula sobre multithreading
Aula sobre multithreadingAula sobre multithreading
Aula sobre multithreading
 
Algoritmos Genéticos Aplicados ao Problema da Mochila Multidimensional
Algoritmos Genéticos Aplicados ao Problema da Mochila MultidimensionalAlgoritmos Genéticos Aplicados ao Problema da Mochila Multidimensional
Algoritmos Genéticos Aplicados ao Problema da Mochila Multidimensional
 
Java Lista Exercicios 06
Java Lista Exercicios 06Java Lista Exercicios 06
Java Lista Exercicios 06
 
JTableView - Swing
JTableView - SwingJTableView - Swing
JTableView - Swing
 
Lista Exercicios C
Lista Exercicios CLista Exercicios C
Lista Exercicios C
 
Merci 10 Completo
Merci 10 CompletoMerci 10 Completo
Merci 10 Completo
 
Java 08 Modificadores Acesso E Membros De Classe
Java 08 Modificadores Acesso E Membros De ClasseJava 08 Modificadores Acesso E Membros De Classe
Java 08 Modificadores Acesso E Membros De Classe
 
Exercicios - Java Swing Listeners
Exercicios - Java Swing ListenersExercicios - Java Swing Listeners
Exercicios - Java Swing Listeners
 
Projeto calculadora em_java
Projeto calculadora em_javaProjeto calculadora em_java
Projeto calculadora em_java
 

Similar to Programação Orientada a Objetos - Pós Graduação - Aula 7 - Inversão de Controle

Extreme 360 Arquitetura para Aplicações Delphi Spring4D - OOP e RAD
Extreme 360 Arquitetura para Aplicações Delphi Spring4D - OOP e RADExtreme 360 Arquitetura para Aplicações Delphi Spring4D - OOP e RAD
Extreme 360 Arquitetura para Aplicações Delphi Spring4D - OOP e RADCesar Romero
 
Como DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um LegadoComo DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um LegadoLuiz Costa
 
TDC2016SP - Trilha Microservices
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservicestdc-globalcode
 
Indo alem do_mvc_node_js
Indo alem do_mvc_node_jsIndo alem do_mvc_node_js
Indo alem do_mvc_node_jsgustavobeavis
 
Sistemas Distribuídos - Aspectos de Projeto
Sistemas Distribuídos - Aspectos de ProjetoSistemas Distribuídos - Aspectos de Projeto
Sistemas Distribuídos - Aspectos de ProjetoAdriano Teixeira de Souza
 
PLANO DE PROJETO DE SOFTWARE para produtos da Lacertae SW
PLANO DE PROJETO DE SOFTWARE  para produtos da Lacertae SWPLANO DE PROJETO DE SOFTWARE  para produtos da Lacertae SW
PLANO DE PROJETO DE SOFTWARE para produtos da Lacertae SWMatheus Costa
 
Programação de Sistemas Distribuídos - Aula 02
Programação de Sistemas Distribuídos - Aula 02Programação de Sistemas Distribuídos - Aula 02
Programação de Sistemas Distribuídos - Aula 02thomasdacosta
 
Modelagem de sistemas
Modelagem de sistemasModelagem de sistemas
Modelagem de sistemassauloroos01
 
Maratona JBoss 2010 - Drools Expert : Programação Orientada a Regras
Maratona JBoss 2010 - Drools Expert : Programação Orientada a RegrasMaratona JBoss 2010 - Drools Expert : Programação Orientada a Regras
Maratona JBoss 2010 - Drools Expert : Programação Orientada a RegrasDextra
 
Aula 1 - Programação Dinâmica para Web
Aula 1 - Programação Dinâmica para WebAula 1 - Programação Dinâmica para Web
Aula 1 - Programação Dinâmica para WebDaniel Brandão
 
Utilizando o Padrão Presentation Model em Aplicações Flex
Utilizando o Padrão Presentation Model em Aplicações FlexUtilizando o Padrão Presentation Model em Aplicações Flex
Utilizando o Padrão Presentation Model em Aplicações FlexEric Cavalcanti
 
Aula03 Sistemas Distribuídos - Arquiteturas de sistemas distribuídos
Aula03 Sistemas Distribuídos - Arquiteturas de sistemas distribuídosAula03 Sistemas Distribuídos - Arquiteturas de sistemas distribuídos
Aula03 Sistemas Distribuídos - Arquiteturas de sistemas distribuídosMessias Batista
 

Similar to Programação Orientada a Objetos - Pós Graduação - Aula 7 - Inversão de Controle (20)

Extreme 360 Arquitetura para Aplicações Delphi Spring4D - OOP e RAD
Extreme 360 Arquitetura para Aplicações Delphi Spring4D - OOP e RADExtreme 360 Arquitetura para Aplicações Delphi Spring4D - OOP e RAD
Extreme 360 Arquitetura para Aplicações Delphi Spring4D - OOP e RAD
 
Como DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um LegadoComo DDD e Strategic Design estão nos ajudando a modernizar um Legado
Como DDD e Strategic Design estão nos ajudando a modernizar um Legado
 
TDC2016SP - Trilha Microservices
TDC2016SP - Trilha MicroservicesTDC2016SP - Trilha Microservices
TDC2016SP - Trilha Microservices
 
Indo alem do_mvc_node_js
Indo alem do_mvc_node_jsIndo alem do_mvc_node_js
Indo alem do_mvc_node_js
 
Servico ad
Servico adServico ad
Servico ad
 
Sistemas Distribuídos - Aspectos de Projeto
Sistemas Distribuídos - Aspectos de ProjetoSistemas Distribuídos - Aspectos de Projeto
Sistemas Distribuídos - Aspectos de Projeto
 
PLANO DE PROJETO DE SOFTWARE para produtos da Lacertae SW
PLANO DE PROJETO DE SOFTWARE  para produtos da Lacertae SWPLANO DE PROJETO DE SOFTWARE  para produtos da Lacertae SW
PLANO DE PROJETO DE SOFTWARE para produtos da Lacertae SW
 
Java - Boas práticas
Java - Boas práticasJava - Boas práticas
Java - Boas práticas
 
Mvc delphi
Mvc delphiMvc delphi
Mvc delphi
 
Programação de Sistemas Distribuídos - Aula 02
Programação de Sistemas Distribuídos - Aula 02Programação de Sistemas Distribuídos - Aula 02
Programação de Sistemas Distribuídos - Aula 02
 
Modelagem de sistemas
Modelagem de sistemasModelagem de sistemas
Modelagem de sistemas
 
Maratona JBoss 2010 - Drools Expert : Programação Orientada a Regras
Maratona JBoss 2010 - Drools Expert : Programação Orientada a RegrasMaratona JBoss 2010 - Drools Expert : Programação Orientada a Regras
Maratona JBoss 2010 - Drools Expert : Programação Orientada a Regras
 
Aula 01
Aula 01Aula 01
Aula 01
 
Aula 1 - Programação Dinâmica para Web
Aula 1 - Programação Dinâmica para WebAula 1 - Programação Dinâmica para Web
Aula 1 - Programação Dinâmica para Web
 
Aula1
Aula1Aula1
Aula1
 
Data accesss conect
Data accesss conectData accesss conect
Data accesss conect
 
Dao
DaoDao
Dao
 
Introdução ao vraptor
Introdução ao vraptorIntrodução ao vraptor
Introdução ao vraptor
 
Utilizando o Padrão Presentation Model em Aplicações Flex
Utilizando o Padrão Presentation Model em Aplicações FlexUtilizando o Padrão Presentation Model em Aplicações Flex
Utilizando o Padrão Presentation Model em Aplicações Flex
 
Aula03 Sistemas Distribuídos - Arquiteturas de sistemas distribuídos
Aula03 Sistemas Distribuídos - Arquiteturas de sistemas distribuídosAula03 Sistemas Distribuídos - Arquiteturas de sistemas distribuídos
Aula03 Sistemas Distribuídos - Arquiteturas de sistemas distribuídos
 

More from Carlos Eduardo

When and Why Your Code Starts to Smell Bad
When and Why Your Code Starts to Smell BadWhen and Why Your Code Starts to Smell Bad
When and Why Your Code Starts to Smell BadCarlos Eduardo
 
Experimentos envolvendo ações de Rejuvenescimento de Software
Experimentos envolvendo ações de Rejuvenescimento de SoftwareExperimentos envolvendo ações de Rejuvenescimento de Software
Experimentos envolvendo ações de Rejuvenescimento de SoftwareCarlos Eduardo
 
A Measurement-Based Model for Estimation of Resource Exhaustion in Operationa...
A Measurement-Based Model for Estimation of Resource Exhaustion in Operationa...A Measurement-Based Model for Estimation of Resource Exhaustion in Operationa...
A Measurement-Based Model for Estimation of Resource Exhaustion in Operationa...Carlos Eduardo
 
Socket Descriptor Leak encontrado na JDK
Socket Descriptor Leak encontrado na JDKSocket Descriptor Leak encontrado na JDK
Socket Descriptor Leak encontrado na JDKCarlos Eduardo
 
Máquinas de turing com memória limitada
Máquinas de turing com memória limitadaMáquinas de turing com memória limitada
Máquinas de turing com memória limitadaCarlos Eduardo
 
Detecting bad smells in source code using change history information
Detecting bad smells in source code using change history informationDetecting bad smells in source code using change history information
Detecting bad smells in source code using change history informationCarlos Eduardo
 
Recommending refactoring operations in large software systems
Recommending refactoring operations in large software systemsRecommending refactoring operations in large software systems
Recommending refactoring operations in large software systemsCarlos Eduardo
 

More from Carlos Eduardo (8)

When and Why Your Code Starts to Smell Bad
When and Why Your Code Starts to Smell BadWhen and Why Your Code Starts to Smell Bad
When and Why Your Code Starts to Smell Bad
 
Experimentos envolvendo ações de Rejuvenescimento de Software
Experimentos envolvendo ações de Rejuvenescimento de SoftwareExperimentos envolvendo ações de Rejuvenescimento de Software
Experimentos envolvendo ações de Rejuvenescimento de Software
 
A Measurement-Based Model for Estimation of Resource Exhaustion in Operationa...
A Measurement-Based Model for Estimation of Resource Exhaustion in Operationa...A Measurement-Based Model for Estimation of Resource Exhaustion in Operationa...
A Measurement-Based Model for Estimation of Resource Exhaustion in Operationa...
 
Socket Descriptor Leak encontrado na JDK
Socket Descriptor Leak encontrado na JDKSocket Descriptor Leak encontrado na JDK
Socket Descriptor Leak encontrado na JDK
 
Máquinas de turing com memória limitada
Máquinas de turing com memória limitadaMáquinas de turing com memória limitada
Máquinas de turing com memória limitada
 
Detecting bad smells in source code using change history information
Detecting bad smells in source code using change history informationDetecting bad smells in source code using change history information
Detecting bad smells in source code using change history information
 
Recommending refactoring operations in large software systems
Recommending refactoring operations in large software systemsRecommending refactoring operations in large software systems
Recommending refactoring operations in large software systems
 
NoSql
NoSqlNoSql
NoSql
 

Programação Orientada a Objetos - Pós Graduação - Aula 7 - Inversão de Controle

  • 1. Programação Orientada a Objetos Inversão de Controle 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 Separação de responsabilidades • Ao pensar no design de uma aplicação, deve-se pensar no grupo de objetos que trabalham em conjunto para uma determinada finalidade; • Ao desenhar pequenas classes que, juntas, realizam uma tarefa maior, o programador ganha em simplicidade e modularidade; • Sistemas fáceis de manter são os que contém classes que possuem apenas uma responsabilidade bem definida, já que a alteração do comportamento é isolada.
  • 3. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Baixo acoplamento e alta coesão • O desejável é que mudanças em uma parte do sistema não impliquem em mudanças em outras partes; • A necessidade de atualizar diversos pontos do código em alterar uma funcionalidade indica que estes pontos estão ligados ou acoplados de maneira indesejada; • Acoplamento é o quanto dois elementos estão amarrados entre si e quanto as alterações no comportamento de um afetam o de outro.
  • 4. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Baixo acoplamento e alta coesão • Minimizar o acoplamento implica em facilitar a troca dos componentes, além de ser peça fundamental para a manutenção do código, formando um arquitetura de maior qualidade; • Baixo acoplamento é diferente de Nenhum acoplamento; • Deseja-se que a ligação entre dois componentes seja a menor e mais simples possível;
  • 5. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Baixo acoplamento e alta coesão • A razão da existência de todo componente é exercer algum tipo de função ou responsabilidade dentro do sistema, por isso este deve ter alta coesão; • Alta coesão quer dizer que suas responsabilidades sejam relacionadas e façam sentido juntas, que não haja responsabilidades desconexas dentro de um mesmo componente; • SRP – uma única razão para mudança.
  • 6. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Baixo acoplamento e alta coesão • Um método que verifica permissões de um usuário logado e monta um relatório possui mais de uma responsabilidade e requer refatoração; • Separar indica criar dois métodos distintos, e até duas classes distintas, pois duas responsabilidades estão vinculadas: autenticação e execução.
  • 7. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Injeção de Dependências • Mesmo com o baixo acoplamento, sempre existirá uma ligação entre duas classes que precisam trabalhar em conjunto.
  • 8. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Injeção de Dependências • No exemplo anterior, Dao existe para que se encapsule os detalhes de acesso a dados, contudo precisa de recursos para realizar seu trabalho, como conexão com o banco.
  • 9. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Injeção de Dependências • É inviável repetir o código de conexão, e outros detalhes como externalização de configurações, pool de conexões, etc.. É óbvio que ProjetoDao tem responsabilidades demais.
  • 10. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Injeção de Dependências • No último exemplo, não seria possível salvar dois projetos com a mesma conexão, nem executar dois métodos Dao em uma única transação. • Essa é uma má prática conhecida como sessão por operação, ou transação por operação; • Esse exemplo soa familiar?
  • 11. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Injeção de Dependências • Neste exemplo, o Dao acabaria com uma grande quantidade de métodos, a maioria formado por uma combinação de outros, ou seja, o Dao trabalha demais.
  • 12. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Injeção de Dependências • O problema deste exemplo é se o método inicia() for esquecido de ser invocado, ou seja, o objetoDao não é um bom cidadão, já que pode ser instanciado sem que todas as suas dependências sejam resolvidas.
  • 13. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Injeção de Dependências • E agora?
  • 14. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Injeção de Dependências • O método fecha() quebra o encapsulamento do Dao, já que se a implementação for trocada por outros tipos de arquivos, não existiria conexão a ser fechada; • Deve-se evitar espalhar responsabilidade de gerenciar o recurso que está sendo manipulado; • Não existe erro de compilação por não chamar o método fecha(); • Delegar fechamento de conexão para outras classes é ruim porque o fechamento é relativamente complexo, pois deve-se controlar transações e exceções; • Ainda não é possível salvar um Projeto, atualizar um Usuário e remover uma História, já que cada Dao abre sua conexão.
  • 15. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Injeção de Dependências • A solução é tirar do Dao a responsabilidade de abrir e fechar conexões; • Sua única responsabilidade será tratar das operações de manipulação do banco, mas não irá gerenciar conexões.
  • 16. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Injeção de Dependências • Receber a conexão em vez de criá-la é um princípio de injeção de dependências; • Inverte-se quem está no controle de gerenciar a dependência; • O programador faz com que os objetos já recebam suas dependências inicializados e prontos para uso;
  • 17. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Inversão de Controle vs Injeção de Dependências • Injeção de Dependências é um caso específico de Inversão de Controle; • Em uma aplicação visual, ao invés de verificar o estado de um botão de tempos em tempos, uma classe pode registrar um listener, que será notificado quando o evento ocorrer, onde o código do tratamento do evento passa a ser invocado pelo botão, em vez de invocar métodos para descobrir seu estado.
  • 18. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Injeção de Dependências • Diante disso, quem irá gerenciar a conexão? • Na injeção de dependências, existe um dependente (o Dao), uma dependência (a conexão), e quem amarra tudo isso é um provedor (provider).
  • 19. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Injeção de Dependências • Inverter o controle e declarar as dependências para ser injetadas por alguém é considerado uma boa prática de design; • As dependências podem ser injetadas via construtor, métodos setter, ou diretamente nos atributos via reflection; • O mais recomendado é via construtor.
  • 20. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Injeção de Dependências • Injeção diretamente no atributo: • Injeção via setter:
  • 21. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Injeção de Dependências • Em CrudDao, foi implementada uma estratégia manual de injeção de dependências.
  • 22. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Injeção de Dependências • Em ClienteControl, não existe inversão de controle, pois esta classe sabe onde buscar suas dependências, pelo ServiceLocator.
  • 23. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Injeção de Dependências • Contudo, muitos têm utilizado frameworks que fazem a injeção automaticamente, como Spring, Google Guice, Pico Container, e a especificação CDI do Java EE 6, com o framework Weld como implementação de referência; • Na disciplina “Desenvolvimento de Sistemas”, será usado o CDI com o framework Weld.
  • 24. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Refactoring com IoC na camada Dao do Ecommerce • Será aplicada uma inversão de controle manual no projeto utilizado nas aulas anteriores; • Observa-se no código abaixo que está sendo implementado a má prática chamada transação por operação.
  • 25. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Refactoring com IoC na camada Dao do Ecommerce • Caso o sistema necessite salvar dois clientes ou dois pedidos em uma mesma transação, ou ainda assim salvar um cliente e um pedido na mesma transação, não será possível; • Para exemplificar este cenário, será criada uma classe Log, que será salva juntamente com Cliente e Pedido.
  • 26. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Refactoring com IoC na camada Dao do Ecommerce
  • 27. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Refactoring com IoC na camada Dao do Ecommerce • Deseja-se que a classe CrudDaoImpl deixe de ter a responsabilidade de gerenciar as conexões; • Esta classe simplesmente irá usar as conexões para efetuar suas operações; • Contudo, as conexões deverão ser estado nas classes PedidoDao,ClienteDao e LogDao, pois estas classes podem efetuar outras operações com o banco de dados, como uma consulta complexa via Sql. CrudDaoImpl somente faz operações de CRUD.
  • 28. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Refactoring com IoC na camada Dao do Ecommerce • Adiciona-se o método getEntityManager() em Crudavel
  • 29. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Refactoring com IoC na camada Dao do Ecommerce • Inverte-se o controle do Dao, exigindo que as classes recebam a EntityManager ao serem instanciadas.
  • 30. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Refactoring com IoC na camada Dao do Ecommerce • O mesmo é feito com LogDao. Os métodos getConsultaSql() e getParametrosMapa() receberão implementação quando for criado algo para consultar o log.
  • 31. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Refactoring com IoC na camada Dao do Ecommerce • Observa-se que CrudDaoImpl apenas usa o EntityManager, não gerencia mais a conexão
  • 32. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Refactoring com IoC na camada Dao do Ecommerce • Obviamente as classes do pacote service começam a gerar erros, pois o Dao está exigindo a EntityManager para efetuar seu trabalho; • O gerenciamento das conexões não pode ser feito pelas classes de service, pois estas classes somente servem para expor o model para clientes remotos. Deverá ser criada outra chamada chamada repository.
  • 33. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Refactoring com IoC na camada Dao do Ecommerce • Será criada uma exception para identificar erros de sistema.
  • 34. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Refactoring com IoC na camada Dao do Ecommerce • Será criada uma exception para identificar erros de sistema.
  • 35. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Refactoring com IoC na camada Dao do Ecommerce • O repositório de Cliente pode ser feito dessa forma:
  • 36. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Refactoring com IoC na camada Dao do Ecommerce
  • 37. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Refactoring com IoC na camada Dao do Ecommerce • Ao executar o sistema, naturalmente um erro será gerado porque a tabela TB_LOG não existe, contudo como foi feito um rollback, o cliente também não foi inserido.
  • 38. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Refactoring com IoC na camada Dao do Ecommerce • Ao editar o arquivo persistence.xml para permitir dropar e criar tabelas, a tabela TB_LOG irá existir, logo o insert será feito em ambas as tabelas.
  • 39. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Referências • SILVEIRA, Paulo, Guilherme. LOPES, Sérgio. MOREIRA, Guilherme, SEPPAT, Nico. KUNG, Fábio. Introdução à Arquitetura e Design de Software. Editora Campus, 2012; • 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”.