SlideShare une entreprise Scribd logo
1  sur  48
Télécharger pour lire hors ligne
Programação Orientada a Objetos
Bad Smells e Design
Patterns
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
Bad Smells
• Conjunto de más práticas de design
• Popularizadas no livro “Refactoring” do
Martin Fowler;
• Existem mais de 60 bad
smells, mas por questão de
escopo, serão citados
apenas 6.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refused Bequest
• Quando herdamos de uma classe, mas não
queremos fazer uso de alguns métodos
herdados.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Feature Envy
• Quando um método está mais interessado
em outro objeto do que no próprio objeto
no qual ele está inserido.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Intimidade Inapropriada
• Métodos que conhecem demais sobre a
implementação de outra classe
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
God Class ou Blob
• Classes que controlam muitos objetos do
sistema. Tendem a crescer mais do que
deveriam e “fazer tudo”
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Divergent Changes
• Classes não coesas, que sofrem constantes
alterações devido a terem diversas
responsabilidades
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Shotgun Surgery
• Classes que possuem métodos que, toda
vez que alteram, disparam mudanças em
diversos outros lugares do código
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Design Patterns
• São uma forma de se documentar uma
solução para um problema de modelagem;
• Soluções que foram implementadas com
sucesso de forma recorrente em diversos
contextos;
• Padrões de projetos ajudam a
adquirir habilidade para modelar
Software
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Design Patterns
• Padrões = Aprender soluções sem precisar
passar por vários anos alternando entre
escolhas certas e erradas.
• MVC é um padrão, mas arquitetural;
• Cada tecnologia tem seus padrões, como
padrões Java EE, padrões Android, etc..
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Design Patterns
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
J2EE Patterns
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Primeiro Exemplo
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Strategy
• Código ruim + funcionando = mantém do
jeito que está;
• Problemas = precisar manter o código, por
exemplo, novas regras de negócio;
• A solução da forma que está não irá
escalar para um número grande de regras;
• O código pode crescer de forma
descontrolada e se tornar não gerenciável;
• Este código necessita de refactoring;
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Strategy
Solução?
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Strategy
Problemas:
1 – Explosão de subclasses;
2 – Não é possível alterar o comportamento
uma vez que a classe foi instanciada.
Soluções?
1 – Herança com granularidade diferente?
Uma subclasse para cada tipo de veículo?
Problemas? Muita duplicidade de código.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Strategy
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Strategy
Resolve?
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Strategy
Resolve?
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Strategy
Strategy é um padrão que deve ser utilizado
quando uma classe possuir diversos
algoritmos que possam ser utilizados de
forma intercambiável.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Template Method
• Algoritmo Geral na superclasse (parte
fixa);
• Passos distintos nas subclasses (parte
variável), fornecendo implementação
própria, completando lacunas.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Template Method
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Template Method
• Hook Method = técnica para permitir a
extensão do comportamento;
• Template Method = padrão de projeto
que soluciona o problema;
• Na prática, o template Method utiliza
Hook Method em sua solução;
• O conceito de Hook Method é mais geral,
também sendo utilizado por outros
padrões.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Template Method
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Template Method
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refatorar para Template
Method
• Funcionalidades com similaridades nos
algoritmos são implemetadas em diferentes
classes, gerando duplicação de código.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refatorar para Template
Method
• Funcionalidades com similaridades nos
algoritmos são implemetadas em diferentes
classes, gerando duplicação de código.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Factory Method
• Encapsular a criação de objetos através da
herança
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Factory Method
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Factory Method
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Bridge
• Um dos problemas da Herança, é quando se
precisa de uma implementação que combine o
comportamento das subclasses
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Bridge
• O padrão Bridge irá criar uma ponte entre as duas
hierarquias ligadas por uma relação de composição;
• No exemplo, a ponte é caracterizada pela relação de
composição entre a classe GeradorArquivo e a interface
PosProcessador.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Bridge
• Um ótimo efeito colateral nesse padrão é que
classes que foram separadas podem ser
utilizadas em outro contexto;
• Bridge utiliza ao mesmo tempo herança e
composição;
• Bridge utiliza ao mesmo tempo hook methods
e hook classes.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Bridge
• Um ótimo efeito colateral nesse padrão é que
classes que foram separadas podem ser
utilizadas em outro contexto;
• Bridge utiliza ao mesmo tempo herança e
composição;
• Bridge utiliza ao mesmo tempo hook methods
e hook classes.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Observer
• Utiliza composição com múltiplos objetos;
• Mudanças em objetos são notificadas para outros
objetos interessados.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Observer
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Observer
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
State
• Utilizando composição, permite a variação de
comportamento de acordo com o estado de
uma entidade do sistema
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
State
• Aplicação do algoritmo state para busca em
profundidade dos grafos
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refatorar substituindo
condicionais por
polimorfismo
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refatorar substituindo
condicionais por
polimorfismo
• Antes e depois
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Refatorar substituindo
condicionais por
polimorfismo
• Antes e depois
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Composição Recursiva
• Criação de uma estrutura mais robusta
colocando instâncias da superclasse ou
interface nas subclasses;
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Composite
• Possui como objetivo prover uma solução para objetos
que representam um conjunto de objetos, mas que
compartilham a mesma abstração deles;
• O padrão segue uma estrutura de árvore
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Composite
• Modelagem do Composite com trechos de
vôo
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Chains of Responsability
• Passos que precisam ser executados em sequência,
contudo com flexibilidade na configuração destes;
• Reutilização destes passos em outros procedimentos
• Este padrão cria uma cadeia de execução na qual cada
elemento processa as informações e em seguida delega
a execução ao próximo em sequência.
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Chains of Responsability
• Arquivo com uma lista de certificados digitais
revogados, atualizando de forma periódica em um
servidor remoto, contendo a data de validade;
• Caches na memória e na base de dados
Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br
Referências
• GUERRA, Eduardo. Design Patterns com Java.
Casa do Código, 2014;
• ANICHE, Maurício. Orientação a objetos e
SOLID para Ninjas. Casa do Código, 2015;
• “LARMAN, Craig – Utilizando UML e Padrões
3ª Edição. Bookman, 2007”.

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

En vedette (20)

php 01 introducao
php 01 introducaophp 01 introducao
php 01 introducao
 
Java Lista Exercicios 04
Java Lista Exercicios 04Java Lista Exercicios 04
Java Lista Exercicios 04
 
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
 
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
 
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
 
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
 

Similaire à Bad Smells e Design Patterns

Workshop Scrum Developer
Workshop Scrum DeveloperWorkshop Scrum Developer
Workshop Scrum DeveloperJoão Victorino
 
Tendências em teste de software
Tendências em teste de softwareTendências em teste de software
Tendências em teste de softwareQualister
 
cms_files_81187_1648754282Material_Doutorado_Profissional_em_Engenharia_de_So...
cms_files_81187_1648754282Material_Doutorado_Profissional_em_Engenharia_de_So...cms_files_81187_1648754282Material_Doutorado_Profissional_em_Engenharia_de_So...
cms_files_81187_1648754282Material_Doutorado_Profissional_em_Engenharia_de_So...Ricardo Roberto MSc, MBA
 
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
 
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
 
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
 
Dessign patterns: Resoluções comuns para problemas comuns de POO
Dessign patterns: Resoluções comuns para problemas comuns de POODessign patterns: Resoluções comuns para problemas comuns de POO
Dessign patterns: Resoluções comuns para problemas comuns de POOJoão Lucas Farias
 
Pitagoras - Introdução a Programação Orientada a Objetos - Encapsulamento, Ac...
Pitagoras - Introdução a Programação Orientada a Objetos - Encapsulamento, Ac...Pitagoras - Introdução a Programação Orientada a Objetos - Encapsulamento, Ac...
Pitagoras - Introdução a Programação Orientada a Objetos - Encapsulamento, Ac...Charles Fortes
 
Simple singleton pattern
Simple singleton patternSimple singleton pattern
Simple singleton patternDennis Calazans
 
Administração de materiais unidade 03 14-06-07 - 108 - ppts 01 slide por fo...
Administração de materiais unidade 03   14-06-07 - 108 - ppts 01 slide por fo...Administração de materiais unidade 03   14-06-07 - 108 - ppts 01 slide por fo...
Administração de materiais unidade 03 14-06-07 - 108 - ppts 01 slide por fo...Alex Casañas
 
Estilizando temas de WordPress
Estilizando temas de WordPressEstilizando temas de WordPress
Estilizando temas de WordPressAnyssa Ferreira
 
Boas práticas de desenvolvimento para Jupyter Notebooks
Boas práticas de desenvolvimento para Jupyter NotebooksBoas práticas de desenvolvimento para Jupyter Notebooks
Boas práticas de desenvolvimento para Jupyter NotebooksJoel Pinho Lucas
 
A influência do Test-Driven Design no projeto de classes e no design em siste...
A influência do Test-Driven Design no projeto de classes e no design em siste...A influência do Test-Driven Design no projeto de classes e no design em siste...
A influência do Test-Driven Design no projeto de classes e no design em siste...Toni Esteves
 

Similaire à Bad Smells e Design Patterns (20)

NoSql
NoSqlNoSql
NoSql
 
Workshop Scrum Developer
Workshop Scrum DeveloperWorkshop Scrum Developer
Workshop Scrum Developer
 
Tendências em teste de software
Tendências em teste de softwareTendências em teste de software
Tendências em teste de software
 
cms_files_81187_1648754282Material_Doutorado_Profissional_em_Engenharia_de_So...
cms_files_81187_1648754282Material_Doutorado_Profissional_em_Engenharia_de_So...cms_files_81187_1648754282Material_Doutorado_Profissional_em_Engenharia_de_So...
cms_files_81187_1648754282Material_Doutorado_Profissional_em_Engenharia_de_So...
 
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
 
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
 
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...
 
Dessign patterns: Resoluções comuns para problemas comuns de POO
Dessign patterns: Resoluções comuns para problemas comuns de POODessign patterns: Resoluções comuns para problemas comuns de POO
Dessign patterns: Resoluções comuns para problemas comuns de POO
 
Pitagoras - Introdução a Programação Orientada a Objetos - Encapsulamento, Ac...
Pitagoras - Introdução a Programação Orientada a Objetos - Encapsulamento, Ac...Pitagoras - Introdução a Programação Orientada a Objetos - Encapsulamento, Ac...
Pitagoras - Introdução a Programação Orientada a Objetos - Encapsulamento, Ac...
 
Modular CSS - Projetando CSS para aplicativos
Modular CSS - Projetando CSS para aplicativosModular CSS - Projetando CSS para aplicativos
Modular CSS - Projetando CSS para aplicativos
 
PHPZEIRO: Adote um framework
PHPZEIRO: Adote um frameworkPHPZEIRO: Adote um framework
PHPZEIRO: Adote um framework
 
Simple singleton pattern
Simple singleton patternSimple singleton pattern
Simple singleton pattern
 
Administração de materiais unidade 03 14-06-07 - 108 - ppts 01 slide por fo...
Administração de materiais unidade 03   14-06-07 - 108 - ppts 01 slide por fo...Administração de materiais unidade 03   14-06-07 - 108 - ppts 01 slide por fo...
Administração de materiais unidade 03 14-06-07 - 108 - ppts 01 slide por fo...
 
Code Smells
Code SmellsCode Smells
Code Smells
 
Estilizando temas de WordPress
Estilizando temas de WordPressEstilizando temas de WordPress
Estilizando temas de WordPress
 
Boas práticas de desenvolvimento para Jupyter Notebooks
Boas práticas de desenvolvimento para Jupyter NotebooksBoas práticas de desenvolvimento para Jupyter Notebooks
Boas práticas de desenvolvimento para Jupyter Notebooks
 
Aula 3.ppt
Aula 3.pptAula 3.ppt
Aula 3.ppt
 
Frameworks PHP @edgarsandi
Frameworks PHP @edgarsandiFrameworks PHP @edgarsandi
Frameworks PHP @edgarsandi
 
Aula1 Apresentacao TEES
Aula1 Apresentacao TEESAula1 Apresentacao TEES
Aula1 Apresentacao TEES
 
A influência do Test-Driven Design no projeto de classes e no design em siste...
A influência do Test-Driven Design no projeto de classes e no design em siste...A influência do Test-Driven Design no projeto de classes e no design em siste...
A influência do Test-Driven Design no projeto de classes e no design em siste...
 

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 (7)

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
 

Bad Smells e Design Patterns

  • 1. Programação Orientada a Objetos Bad Smells e Design Patterns 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 Bad Smells • Conjunto de más práticas de design • Popularizadas no livro “Refactoring” do Martin Fowler; • Existem mais de 60 bad smells, mas por questão de escopo, serão citados apenas 6.
  • 3. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Refused Bequest • Quando herdamos de uma classe, mas não queremos fazer uso de alguns métodos herdados.
  • 4. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Feature Envy • Quando um método está mais interessado em outro objeto do que no próprio objeto no qual ele está inserido.
  • 5. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Intimidade Inapropriada • Métodos que conhecem demais sobre a implementação de outra classe
  • 6. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br God Class ou Blob • Classes que controlam muitos objetos do sistema. Tendem a crescer mais do que deveriam e “fazer tudo”
  • 7. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Divergent Changes • Classes não coesas, que sofrem constantes alterações devido a terem diversas responsabilidades
  • 8. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Shotgun Surgery • Classes que possuem métodos que, toda vez que alteram, disparam mudanças em diversos outros lugares do código
  • 9. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Design Patterns • São uma forma de se documentar uma solução para um problema de modelagem; • Soluções que foram implementadas com sucesso de forma recorrente em diversos contextos; • Padrões de projetos ajudam a adquirir habilidade para modelar Software
  • 10. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Design Patterns • Padrões = Aprender soluções sem precisar passar por vários anos alternando entre escolhas certas e erradas. • MVC é um padrão, mas arquitetural; • Cada tecnologia tem seus padrões, como padrões Java EE, padrões Android, etc..
  • 11. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Design Patterns
  • 12. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br J2EE Patterns
  • 13. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Primeiro Exemplo
  • 14. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Strategy • Código ruim + funcionando = mantém do jeito que está; • Problemas = precisar manter o código, por exemplo, novas regras de negócio; • A solução da forma que está não irá escalar para um número grande de regras; • O código pode crescer de forma descontrolada e se tornar não gerenciável; • Este código necessita de refactoring;
  • 15. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Strategy Solução?
  • 16. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Strategy Problemas: 1 – Explosão de subclasses; 2 – Não é possível alterar o comportamento uma vez que a classe foi instanciada. Soluções? 1 – Herança com granularidade diferente? Uma subclasse para cada tipo de veículo? Problemas? Muita duplicidade de código.
  • 17. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Strategy
  • 18. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Strategy Resolve?
  • 19. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Strategy Resolve?
  • 20. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Strategy Strategy é um padrão que deve ser utilizado quando uma classe possuir diversos algoritmos que possam ser utilizados de forma intercambiável.
  • 21. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Template Method • Algoritmo Geral na superclasse (parte fixa); • Passos distintos nas subclasses (parte variável), fornecendo implementação própria, completando lacunas.
  • 22. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Template Method
  • 23. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Template Method • Hook Method = técnica para permitir a extensão do comportamento; • Template Method = padrão de projeto que soluciona o problema; • Na prática, o template Method utiliza Hook Method em sua solução; • O conceito de Hook Method é mais geral, também sendo utilizado por outros padrões.
  • 24. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Template Method
  • 25. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Template Method
  • 26. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Refatorar para Template Method • Funcionalidades com similaridades nos algoritmos são implemetadas em diferentes classes, gerando duplicação de código.
  • 27. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Refatorar para Template Method • Funcionalidades com similaridades nos algoritmos são implemetadas em diferentes classes, gerando duplicação de código.
  • 28. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Factory Method • Encapsular a criação de objetos através da herança
  • 29. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Factory Method
  • 30. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Factory Method
  • 31. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Bridge • Um dos problemas da Herança, é quando se precisa de uma implementação que combine o comportamento das subclasses
  • 32. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Bridge • O padrão Bridge irá criar uma ponte entre as duas hierarquias ligadas por uma relação de composição; • No exemplo, a ponte é caracterizada pela relação de composição entre a classe GeradorArquivo e a interface PosProcessador.
  • 33. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Bridge • Um ótimo efeito colateral nesse padrão é que classes que foram separadas podem ser utilizadas em outro contexto; • Bridge utiliza ao mesmo tempo herança e composição; • Bridge utiliza ao mesmo tempo hook methods e hook classes.
  • 34. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Bridge • Um ótimo efeito colateral nesse padrão é que classes que foram separadas podem ser utilizadas em outro contexto; • Bridge utiliza ao mesmo tempo herança e composição; • Bridge utiliza ao mesmo tempo hook methods e hook classes.
  • 35. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Observer • Utiliza composição com múltiplos objetos; • Mudanças em objetos são notificadas para outros objetos interessados.
  • 36. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Observer
  • 37. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Observer
  • 38. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br State • Utilizando composição, permite a variação de comportamento de acordo com o estado de uma entidade do sistema
  • 39. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br State • Aplicação do algoritmo state para busca em profundidade dos grafos
  • 40. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Refatorar substituindo condicionais por polimorfismo
  • 41. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Refatorar substituindo condicionais por polimorfismo • Antes e depois
  • 42. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Refatorar substituindo condicionais por polimorfismo • Antes e depois
  • 43. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Composição Recursiva • Criação de uma estrutura mais robusta colocando instâncias da superclasse ou interface nas subclasses;
  • 44. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Composite • Possui como objetivo prover uma solução para objetos que representam um conjunto de objetos, mas que compartilham a mesma abstração deles; • O padrão segue uma estrutura de árvore
  • 45. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Composite • Modelagem do Composite com trechos de vôo
  • 46. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Chains of Responsability • Passos que precisam ser executados em sequência, contudo com flexibilidade na configuração destes; • Reutilização destes passos em outros procedimentos • Este padrão cria uma cadeia de execução na qual cada elemento processa as informações e em seguida delega a execução ao próximo em sequência.
  • 47. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Chains of Responsability • Arquivo com uma lista de certificados digitais revogados, atualizando de forma periódica em um servidor remoto, contendo a data de validade; • Caches na memória e na base de dados
  • 48. Prof Carlos Eduardo Dantas – carloseduardodantas@iftm.edu.br Referências • GUERRA, Eduardo. Design Patterns com Java. Casa do Código, 2014; • ANICHE, Maurício. Orientação a objetos e SOLID para Ninjas. Casa do Código, 2015; • “LARMAN, Craig – Utilizando UML e Padrões 3ª Edição. Bookman, 2007”.