SlideShare une entreprise Scribd logo
1  sur  44
Télécharger pour lire hors ligne
Programação Orientada a Objetos
Princípios OO
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
• Por que precisamos implementar baixo
acoplamento, alta coesão, dentre tanto
outros princípios e conceitos básicos em
POO?
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Curva de Defeitos do
Hardware
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Curva de Defeitos do
Software
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Análise - Curva de Defeitos
• Hardware se desgasta com o tempo;
• Software se deteriora com o tempo;
• Boa parte dos Software legados são
migrados para novas tecnologias por
deterioração, e não por necessidades
tecnológicas.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Análise - Curva de Defeitos
• Um bom design de Software visa a uma
arquitetura flexível que permita futuras
alterações, facilitando a produção de
código organizado e legível, maximizando
seu reaproveitamento;
• Boas práticas OO procuram trazer os
benefícios mencionados acima para o
design.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Programe voltado à Interface,
não à Implementação
• Contains() de ArrayList é uma busca muito
custosa em termos computacionais;
• Alternativas de coleções, como HashSet,
são mais eficientes, pois usam
internamente uma tabela Hash.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Programe voltado à Interface,
não à Implementação
• O problema ao efetuar esta manutenção, é
que todo o código que usava o retorno do
método ArrayList será quebrado,
alterando todos os lugares que dependem
de alguma forma desse método;
• Tarefas do tipo search/replace são um
forte sinal de código ruim;
• Vincular os funcionários a uma
implementação específica de Collection,
caracteriza alto acoplamento.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Programe voltado à Interface,
não à Implementação
• Quanto menos específica for a
interface/classe referenciada, menor o
acoplamento e mais possibilidades de
diferentes implementações;
• Como consequência, o código cliente terá
uma gama menor de métodos que podem
ser invocados.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Programe voltado à Interface,
não à Implementação
• Devemos procurar um balanço entre o
desacoplamento e a necessidade do nosso
código;
• Princípio de Segregação de Interfaces –
clientes não devem ser forçados a
depender de interfaces que não usam.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Programe voltado à Interface,
não à Implementação
• Hibernate usa uma implementação
específica de List, mas sempre retorna List
para evitar quebra de compatibilidade
com o código-fonte da aplicação cliente.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Programe voltado à Interface,
não à Implementação
• E se quisermos receber objetos via socket
(SocketInputStream), como faz?
• Utilize sempre o tipo menos específico
possível.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Programe voltado à Interface,
não à Implementação
• Geralmente, para a API JDBC, utiliza-se
uma Connection, ao invés de
OracleConnection, MysqlConnection,
dentre outros.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Programe voltado à Interface,
não à Implementação
• Interfaces irão ajudar muito para evitar
instruções switch, ou mesmo um
excessivo número de ifs encadeados,
evitando acoplamentos no modelo,
ocorrendo mudanças frequentes toda vez
que uma nova entidade for adicionada no
domínio.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Programe voltado à Interface,
não à Implementação
• No projeto criado nas aulas anteriores, os
casos abaixo estão respeitando esse
princípio
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Programe voltado à Interface,
não à Implementação
• Contudo, ClienteView não está
respeitando, gerando um alto
acoplamento com ClienteControl.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Programe voltado à Interface,
não à Implementação
• O certo seria criar interfaces e factories
para o Control, visando desacoplar o
máximo possível;
• Contudo, neste caso, como existe uma
implementação de Beans Binding entre o
view e o Control, o prejuízo deste
acoplamento é bastante minimizado.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Componha Comportamentos
• Códigos são mais fáceis de entender e
manter quando possuem poucas
possibilidades de fluxos lógicos, ou seja,
poucos caminhos de execução.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Componha Comportamentos
• Quantas possibilidades diferentes existem
para a execução deste método?
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Componha Comportamentos
• Existem diversas responsabilidades de
execução para esta classe;
• Este comportamento pode ser composto
por diversas partes menores, por isso
refatorações podem ser executadas.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Componha Comportamentos
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Componha Comportamentos
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Componha Comportamentos
• Observa-se que, passando de estruturado
para OO, o sistema ganhou
4 novas classes e uma
Interface.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Componha Comportamentos
• O comportamento foi quebrado em
diversas partes, onde foram juntados
novamente através de composição;
• O polimorfismo permite trabalhar de
maneira uniforme com partes que
executam tarefas distintas.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Componha Comportamentos
• Ao implementar os métodos da Interface
Processo na classe Transferência, observa-
se que o Princípio de Segregação de
Interfaces foi violado.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Componha Comportamentos
• Neste caso, o ideal é quebrar as interfaces
em uma hierarquia, assim como existe a
hierarquia entre Collection e
List/Set/Map;
• Caso o projeto não seja refatorado agora,
existe uma grande chance de sofrer novo
refactoring posteriormente, mesmo que a
implementação deste método seja simples.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Evite Herança, favoreça
composição
• O maior problema da Herança é que
acoplamos a implementação da classe mãe
muito precocemente, criando a
necessidade da classe filha conhecer muito
bem o código interno da classe mãe, o que
é visto como quebra de encapsulamento.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Evite Herança, favoreça
composição
• Exemplo: Herança entre Hashtable e
Properties.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Evite Herança, favoreça
composição
• A motivação dos desenvolvedores da JDK é
válida: o reaproveitamento de código já escrito
na classe Hashtable;
• Usar composição permite o reaproveitamento de
código sem o efeito indesejado de quebra de
encapsulamento;
• No exemplo da jdk, bastaria a classe Properties
fazer associação para um Hashtable privado, e o
método setProperty() delegar para a invocação
de hashtable.put()
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Evite Herança, favoreça
composição
• Ao substituir herança por interface, as
vantagens do polimorfismo permanecem,
e o acoplamento é bem menor, já que
nenhuma dessas classes precisam
conhecer o funcionamento interno de
outras, especialmente da classe mãe.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Evite Herança, favoreça
composição
• No projeto das aulas anteriores, ficou claro
que PedidoDaoImpl e ClienteDaoImpl
ficaram livres com o comportamento de
Composição
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Cuidado com o modelo
anêmico
• Um dos pilares de POO é que não se deve
expor os detalhes de implementação;
• Encapsulando a implementação, pode-se
trocar com facilidade, já que não existe
outro código dependendo destes detalhes;
• O usuário poderá acessar o objeto através
do contrato definido pela interface
pública.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Cuidado com o modelo
anêmico
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Cuidado com o modelo
anêmico
• No exemplo da classe Conta, o método
setSaldo() feriu o encapsulamento, já que
dificilmente o saldo de uma conta será
simplesmente “substituído” por outro;
• Para alterar o saldo, faz mais sentido alguma
operação como saque() e deposito();
• Nunca crie um getter/setter sem uma
necessidade real;
• Códigos como conta.setSaldo(conta.getSaldo() +
100) estarão espalhados por toda a aplicação.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Cuidado com o modelo
anêmico
• Caso a aplicação precise modificar para
que uma taxa seja debitada toda vez que
for realizado um depósito, será necessário
percorrer todo o código e modificar
diversas invocações, usando
search/replace.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Cuidado com o modelo
anêmico
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Cuidado com o modelo
anêmico
• O código de exemplo é bem procedural, pois não
possui atributos, e excesso do uso de métodos
como funções;
• A classe Banco possui uma intimidade
inapropriada com a classe Conta, pois conhece
demais a sua implementação interna;
• Falta de uso do princípio Tell, Don´t Ask;
• Está rompendo o princípio básico de manter
comportamento e estado relacionados em uma
única classe.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Cuidado com o modelo
anêmico
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Cuidado com o modelo
anêmico
• Enriqueça as classes com métodos de negócio,
para que não se tornem apenas estruturas de
dados;
• Algumas vezes getters/setters são necessários,
mas cuidado no uso indiscriminado destes.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Cuidado com o modelo
anêmico
• No projeto da aula anterior, rapidamente foi
percebido que para validar as entidades, nada
melhor do que delegar este comportamento às
mesmas.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Cuidado com objetos
mutáveis
• Objetos mutáveis são passíveis de efeitos
colaterais, gerando bugs indesejáveis.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Cuidado com objetos
mutáveis
• Objetos imutáveis são muito mais simples de
manipular, e possuem comportamento
previsível.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Cuidado com objetos
mutáveis
• Objetos mutáveis são imprevisíveis, pois no
exemplo abaixo é impossível determinar que a
saída será o ano atual;
• Como solução, muitos criam cópias defensivas
dos objetos, como:
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;
• PRESSMAN, Roger. Engenharia de Software –
Uma abordagem Profissional – 7ª edição, 2011;
• 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.

Contenu connexe

En vedette

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
 
Aula de Algoritmos II - Turma 222
Aula de Algoritmos II - Turma 222Aula de Algoritmos II - Turma 222
Aula de Algoritmos II - Turma 222Bianca Dantas
 
Apresentação wxWidgets
Apresentação wxWidgetsApresentação wxWidgets
Apresentação wxWidgetsRenzo Petri
 
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
 
Aula sobre multithreading
Aula sobre multithreadingAula sobre multithreading
Aula sobre multithreadingBianca 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
 

En vedette (20)

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
 
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
 
Java Lista Exercicios 04
Java Lista Exercicios 04Java Lista Exercicios 04
Java Lista Exercicios 04
 
php 01 introducao
php 01 introducaophp 01 introducao
php 01 introducao
 
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
 
Java 07 Entrada Dados
Java 07 Entrada DadosJava 07 Entrada Dados
Java 07 Entrada Dados
 
Aula de Algoritmos II - Turma 222
Aula de Algoritmos II - Turma 222Aula de Algoritmos II - Turma 222
Aula de Algoritmos II - Turma 222
 
Apresentação wxWidgets
Apresentação wxWidgetsApresentação wxWidgets
Apresentação wxWidgets
 
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
 
Aula sobre multithreading
Aula sobre multithreadingAula sobre multithreading
Aula sobre multithreading
 
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
 
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
 
Merci 10 Completo
Merci 10 CompletoMerci 10 Completo
Merci 10 Completo
 
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
 

Similaire à Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO

Frameworks de desenvolvimento web
Frameworks de desenvolvimento webFrameworks de desenvolvimento web
Frameworks de desenvolvimento webArlindo Santos
 
PROJETO INTEGRADO - CURSOS DA ÁREA DE TI - Uma das tecnologias mais populare...
PROJETO INTEGRADO - CURSOS DA ÁREA DE TI -  Uma das tecnologias mais populare...PROJETO INTEGRADO - CURSOS DA ÁREA DE TI -  Uma das tecnologias mais populare...
PROJETO INTEGRADO - CURSOS DA ÁREA DE TI - Uma das tecnologias mais populare...HELENO FAVACHO
 
Programação orientada à objetos & mvc
Programação orientada à objetos & mvcProgramação orientada à objetos & mvc
Programação orientada à objetos & mvcJhordam Siqueira
 
Projeto Integrado Áreas de TI - iniciar uma jornada empreendedora - 2.pdf
Projeto Integrado Áreas de TI - iniciar uma jornada empreendedora - 2.pdfProjeto Integrado Áreas de TI - iniciar uma jornada empreendedora - 2.pdf
Projeto Integrado Áreas de TI - iniciar uma jornada empreendedora - 2.pdfHELENO FAVACHO
 
Hexagonal Rails
Hexagonal RailsHexagonal Rails
Hexagonal RailsLuiz Costa
 
Global tecnol s.a – tecnologias – ads semestre 5º e 6º semestre
Global tecnol s.a – tecnologias – ads semestre 5º e 6º semestreGlobal tecnol s.a – tecnologias – ads semestre 5º e 6º semestre
Global tecnol s.a – tecnologias – ads semestre 5º e 6º semestreHELENO FAVACHO
 
Tdc Future 2021 - simples soluções grandes resultados - Márcio Rogério Nizzola
Tdc Future 2021 - simples soluções grandes resultados - Márcio Rogério NizzolaTdc Future 2021 - simples soluções grandes resultados - Márcio Rogério Nizzola
Tdc Future 2021 - simples soluções grandes resultados - Márcio Rogério NizzolaDextra Sistemas / Etec Itu
 
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
 
Palestra Dariva Portais Corporativos
Palestra Dariva Portais CorporativosPalestra Dariva Portais Corporativos
Palestra Dariva Portais CorporativosRoberto Dariva
 
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App | MVPConf Latam 2021
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App | MVPConf Latam 2021Boas Práticas em Aplicações na Nuvem: Twelve-Factor App | MVPConf Latam 2021
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App | MVPConf Latam 2021Renato Groffe
 
Projeto Integrado ADS - a agricultura familiar.pdf
Projeto Integrado ADS - a agricultura familiar.pdfProjeto Integrado ADS - a agricultura familiar.pdf
Projeto Integrado ADS - a agricultura familiar.pdfHELENO FAVACHO
 
Programação Orientada a Aspectos
Programação Orientada a AspectosProgramação Orientada a Aspectos
Programação Orientada a AspectosRicardo Terra
 
Projeto integrado ii – ads back end - web - mobile -devops
Projeto integrado ii – ads   back end - web - mobile -devopsProjeto integrado ii – ads   back end - web - mobile -devops
Projeto integrado ii – ads back end - web - mobile -devopsZairaLessa
 
Projeto integrado ii – ads back end - web - mobile -devops
Projeto integrado ii – ads   back end - web - mobile -devopsProjeto integrado ii – ads   back end - web - mobile -devops
Projeto integrado ii – ads back end - web - mobile -devopsHELENO FAVACHO
 
PROJETO INTEGRADO II – ADS - BackEnd - Web - Mobile -DevOps.pdf
PROJETO INTEGRADO II – ADS - BackEnd - Web - Mobile -DevOps.pdfPROJETO INTEGRADO II – ADS - BackEnd - Web - Mobile -DevOps.pdf
PROJETO INTEGRADO II – ADS - BackEnd - Web - Mobile -DevOps.pdfHELENO FAVACHO
 
O seu código fede e você nem sabia. Ou sabia, mas não o quanto fede!
O seu código fede e você nem sabia. Ou sabia, mas não o quanto fede!O seu código fede e você nem sabia. Ou sabia, mas não o quanto fede!
O seu código fede e você nem sabia. Ou sabia, mas não o quanto fede!Wagner Mendes Voltz Fusca
 
Proposta de Boas Práticas e Padrões de Desenvolvimento Web
Proposta de Boas Práticas e Padrões de Desenvolvimento WebProposta de Boas Práticas e Padrões de Desenvolvimento Web
Proposta de Boas Práticas e Padrões de Desenvolvimento WebEr Galvão Abbott
 

Similaire à Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO (20)

Frameworks de desenvolvimento web
Frameworks de desenvolvimento webFrameworks de desenvolvimento web
Frameworks de desenvolvimento web
 
PROJETO INTEGRADO - CURSOS DA ÁREA DE TI - Uma das tecnologias mais populare...
PROJETO INTEGRADO - CURSOS DA ÁREA DE TI -  Uma das tecnologias mais populare...PROJETO INTEGRADO - CURSOS DA ÁREA DE TI -  Uma das tecnologias mais populare...
PROJETO INTEGRADO - CURSOS DA ÁREA DE TI - Uma das tecnologias mais populare...
 
Programação orientada à objetos & mvc
Programação orientada à objetos & mvcProgramação orientada à objetos & mvc
Programação orientada à objetos & mvc
 
Projeto Integrado Áreas de TI - iniciar uma jornada empreendedora - 2.pdf
Projeto Integrado Áreas de TI - iniciar uma jornada empreendedora - 2.pdfProjeto Integrado Áreas de TI - iniciar uma jornada empreendedora - 2.pdf
Projeto Integrado Áreas de TI - iniciar uma jornada empreendedora - 2.pdf
 
Aula 01
Aula 01Aula 01
Aula 01
 
Hexagonal Rails
Hexagonal RailsHexagonal Rails
Hexagonal Rails
 
Global tecnol s.a – tecnologias – ads semestre 5º e 6º semestre
Global tecnol s.a – tecnologias – ads semestre 5º e 6º semestreGlobal tecnol s.a – tecnologias – ads semestre 5º e 6º semestre
Global tecnol s.a – tecnologias – ads semestre 5º e 6º semestre
 
Tdc Future 2021 - simples soluções grandes resultados - Márcio Rogério Nizzola
Tdc Future 2021 - simples soluções grandes resultados - Márcio Rogério NizzolaTdc Future 2021 - simples soluções grandes resultados - Márcio Rogério Nizzola
Tdc Future 2021 - simples soluções grandes resultados - Márcio Rogério Nizzola
 
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
 
Palestra Dariva Portais Corporativos
Palestra Dariva Portais CorporativosPalestra Dariva Portais Corporativos
Palestra Dariva Portais Corporativos
 
DDD
DDDDDD
DDD
 
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App | MVPConf Latam 2021
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App | MVPConf Latam 2021Boas Práticas em Aplicações na Nuvem: Twelve-Factor App | MVPConf Latam 2021
Boas Práticas em Aplicações na Nuvem: Twelve-Factor App | MVPConf Latam 2021
 
Projeto Integrado ADS - a agricultura familiar.pdf
Projeto Integrado ADS - a agricultura familiar.pdfProjeto Integrado ADS - a agricultura familiar.pdf
Projeto Integrado ADS - a agricultura familiar.pdf
 
Programação Orientada a Aspectos
Programação Orientada a AspectosProgramação Orientada a Aspectos
Programação Orientada a Aspectos
 
Métodos Ágeis
Métodos ÁgeisMétodos Ágeis
Métodos Ágeis
 
Projeto integrado ii – ads back end - web - mobile -devops
Projeto integrado ii – ads   back end - web - mobile -devopsProjeto integrado ii – ads   back end - web - mobile -devops
Projeto integrado ii – ads back end - web - mobile -devops
 
Projeto integrado ii – ads back end - web - mobile -devops
Projeto integrado ii – ads   back end - web - mobile -devopsProjeto integrado ii – ads   back end - web - mobile -devops
Projeto integrado ii – ads back end - web - mobile -devops
 
PROJETO INTEGRADO II – ADS - BackEnd - Web - Mobile -DevOps.pdf
PROJETO INTEGRADO II – ADS - BackEnd - Web - Mobile -DevOps.pdfPROJETO INTEGRADO II – ADS - BackEnd - Web - Mobile -DevOps.pdf
PROJETO INTEGRADO II – ADS - BackEnd - Web - Mobile -DevOps.pdf
 
O seu código fede e você nem sabia. Ou sabia, mas não o quanto fede!
O seu código fede e você nem sabia. Ou sabia, mas não o quanto fede!O seu código fede e você nem sabia. Ou sabia, mas não o quanto fede!
O seu código fede e você nem sabia. Ou sabia, mas não o quanto fede!
 
Proposta de Boas Práticas e Padrões de Desenvolvimento Web
Proposta de Boas Práticas e Padrões de Desenvolvimento WebProposta de Boas Práticas e Padrões de Desenvolvimento Web
Proposta de Boas Práticas e Padrões de Desenvolvimento Web
 

Plus de 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
 

Plus de 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 6 - Princípios OO

  • 1. Programação Orientada a Objetos Princípios OO 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 • Por que precisamos implementar baixo acoplamento, alta coesão, dentre tanto outros princípios e conceitos básicos em POO?
  • 3. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Curva de Defeitos do Hardware
  • 4. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Curva de Defeitos do Software
  • 5. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Análise - Curva de Defeitos • Hardware se desgasta com o tempo; • Software se deteriora com o tempo; • Boa parte dos Software legados são migrados para novas tecnologias por deterioração, e não por necessidades tecnológicas.
  • 6. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Análise - Curva de Defeitos • Um bom design de Software visa a uma arquitetura flexível que permita futuras alterações, facilitando a produção de código organizado e legível, maximizando seu reaproveitamento; • Boas práticas OO procuram trazer os benefícios mencionados acima para o design.
  • 7. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Programe voltado à Interface, não à Implementação • Contains() de ArrayList é uma busca muito custosa em termos computacionais; • Alternativas de coleções, como HashSet, são mais eficientes, pois usam internamente uma tabela Hash.
  • 8. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Programe voltado à Interface, não à Implementação • O problema ao efetuar esta manutenção, é que todo o código que usava o retorno do método ArrayList será quebrado, alterando todos os lugares que dependem de alguma forma desse método; • Tarefas do tipo search/replace são um forte sinal de código ruim; • Vincular os funcionários a uma implementação específica de Collection, caracteriza alto acoplamento.
  • 9. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Programe voltado à Interface, não à Implementação • Quanto menos específica for a interface/classe referenciada, menor o acoplamento e mais possibilidades de diferentes implementações; • Como consequência, o código cliente terá uma gama menor de métodos que podem ser invocados.
  • 10. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Programe voltado à Interface, não à Implementação • Devemos procurar um balanço entre o desacoplamento e a necessidade do nosso código; • Princípio de Segregação de Interfaces – clientes não devem ser forçados a depender de interfaces que não usam.
  • 11. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Programe voltado à Interface, não à Implementação • Hibernate usa uma implementação específica de List, mas sempre retorna List para evitar quebra de compatibilidade com o código-fonte da aplicação cliente.
  • 12. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Programe voltado à Interface, não à Implementação • E se quisermos receber objetos via socket (SocketInputStream), como faz? • Utilize sempre o tipo menos específico possível.
  • 13. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Programe voltado à Interface, não à Implementação • Geralmente, para a API JDBC, utiliza-se uma Connection, ao invés de OracleConnection, MysqlConnection, dentre outros.
  • 14. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Programe voltado à Interface, não à Implementação • Interfaces irão ajudar muito para evitar instruções switch, ou mesmo um excessivo número de ifs encadeados, evitando acoplamentos no modelo, ocorrendo mudanças frequentes toda vez que uma nova entidade for adicionada no domínio.
  • 15. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Programe voltado à Interface, não à Implementação • No projeto criado nas aulas anteriores, os casos abaixo estão respeitando esse princípio
  • 16. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Programe voltado à Interface, não à Implementação • Contudo, ClienteView não está respeitando, gerando um alto acoplamento com ClienteControl.
  • 17. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Programe voltado à Interface, não à Implementação • O certo seria criar interfaces e factories para o Control, visando desacoplar o máximo possível; • Contudo, neste caso, como existe uma implementação de Beans Binding entre o view e o Control, o prejuízo deste acoplamento é bastante minimizado.
  • 18. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Componha Comportamentos • Códigos são mais fáceis de entender e manter quando possuem poucas possibilidades de fluxos lógicos, ou seja, poucos caminhos de execução.
  • 19. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Componha Comportamentos • Quantas possibilidades diferentes existem para a execução deste método?
  • 20. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Componha Comportamentos • Existem diversas responsabilidades de execução para esta classe; • Este comportamento pode ser composto por diversas partes menores, por isso refatorações podem ser executadas.
  • 21. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Componha Comportamentos
  • 22. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Componha Comportamentos
  • 23. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Componha Comportamentos • Observa-se que, passando de estruturado para OO, o sistema ganhou 4 novas classes e uma Interface.
  • 24. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Componha Comportamentos • O comportamento foi quebrado em diversas partes, onde foram juntados novamente através de composição; • O polimorfismo permite trabalhar de maneira uniforme com partes que executam tarefas distintas.
  • 25. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Componha Comportamentos • Ao implementar os métodos da Interface Processo na classe Transferência, observa- se que o Princípio de Segregação de Interfaces foi violado.
  • 26. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Componha Comportamentos • Neste caso, o ideal é quebrar as interfaces em uma hierarquia, assim como existe a hierarquia entre Collection e List/Set/Map; • Caso o projeto não seja refatorado agora, existe uma grande chance de sofrer novo refactoring posteriormente, mesmo que a implementação deste método seja simples.
  • 27. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Evite Herança, favoreça composição • O maior problema da Herança é que acoplamos a implementação da classe mãe muito precocemente, criando a necessidade da classe filha conhecer muito bem o código interno da classe mãe, o que é visto como quebra de encapsulamento.
  • 28. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Evite Herança, favoreça composição • Exemplo: Herança entre Hashtable e Properties.
  • 29. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Evite Herança, favoreça composição • A motivação dos desenvolvedores da JDK é válida: o reaproveitamento de código já escrito na classe Hashtable; • Usar composição permite o reaproveitamento de código sem o efeito indesejado de quebra de encapsulamento; • No exemplo da jdk, bastaria a classe Properties fazer associação para um Hashtable privado, e o método setProperty() delegar para a invocação de hashtable.put()
  • 30. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Evite Herança, favoreça composição • Ao substituir herança por interface, as vantagens do polimorfismo permanecem, e o acoplamento é bem menor, já que nenhuma dessas classes precisam conhecer o funcionamento interno de outras, especialmente da classe mãe.
  • 31. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Evite Herança, favoreça composição • No projeto das aulas anteriores, ficou claro que PedidoDaoImpl e ClienteDaoImpl ficaram livres com o comportamento de Composição
  • 32. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Cuidado com o modelo anêmico • Um dos pilares de POO é que não se deve expor os detalhes de implementação; • Encapsulando a implementação, pode-se trocar com facilidade, já que não existe outro código dependendo destes detalhes; • O usuário poderá acessar o objeto através do contrato definido pela interface pública.
  • 33. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Cuidado com o modelo anêmico
  • 34. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Cuidado com o modelo anêmico • No exemplo da classe Conta, o método setSaldo() feriu o encapsulamento, já que dificilmente o saldo de uma conta será simplesmente “substituído” por outro; • Para alterar o saldo, faz mais sentido alguma operação como saque() e deposito(); • Nunca crie um getter/setter sem uma necessidade real; • Códigos como conta.setSaldo(conta.getSaldo() + 100) estarão espalhados por toda a aplicação.
  • 35. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Cuidado com o modelo anêmico • Caso a aplicação precise modificar para que uma taxa seja debitada toda vez que for realizado um depósito, será necessário percorrer todo o código e modificar diversas invocações, usando search/replace.
  • 36. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Cuidado com o modelo anêmico
  • 37. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Cuidado com o modelo anêmico • O código de exemplo é bem procedural, pois não possui atributos, e excesso do uso de métodos como funções; • A classe Banco possui uma intimidade inapropriada com a classe Conta, pois conhece demais a sua implementação interna; • Falta de uso do princípio Tell, Don´t Ask; • Está rompendo o princípio básico de manter comportamento e estado relacionados em uma única classe.
  • 38. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Cuidado com o modelo anêmico
  • 39. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Cuidado com o modelo anêmico • Enriqueça as classes com métodos de negócio, para que não se tornem apenas estruturas de dados; • Algumas vezes getters/setters são necessários, mas cuidado no uso indiscriminado destes.
  • 40. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Cuidado com o modelo anêmico • No projeto da aula anterior, rapidamente foi percebido que para validar as entidades, nada melhor do que delegar este comportamento às mesmas.
  • 41. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Cuidado com objetos mutáveis • Objetos mutáveis são passíveis de efeitos colaterais, gerando bugs indesejáveis.
  • 42. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Cuidado com objetos mutáveis • Objetos imutáveis são muito mais simples de manipular, e possuem comportamento previsível.
  • 43. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Cuidado com objetos mutáveis • Objetos mutáveis são imprevisíveis, pois no exemplo abaixo é impossível determinar que a saída será o ano atual; • Como solução, muitos criam cópias defensivas dos objetos, como:
  • 44. 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; • PRESSMAN, Roger. Engenharia de Software – Uma abordagem Profissional – 7ª edição, 2011; • 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.