Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO
-
Upload
carlos-eduardo-dantas -
Category
Technology
-
view
113 -
download
1
Transcript of Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO
![Page 1: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/1.jpg)
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 – [email protected]
![Page 2: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/2.jpg)
Prof Carlos Eduardo Dantas – [email protected]
Introdução
• Por que precisamos implementar baixo acoplamento, alta coesão, dentre tanto outros princípios e conceitos básicos em POO?
![Page 5: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/5.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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.
![Page 6: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/6.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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.
![Page 7: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/7.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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.
![Page 8: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/8.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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.
![Page 9: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/9.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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.
![Page 10: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/10.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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.
![Page 11: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/11.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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.
![Page 12: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/12.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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.
![Page 13: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/13.jpg)
Prof Carlos Eduardo Dantas – [email protected]
Programe voltado à Interface, não à Implementação
• Geralmente, para a API JDBC, utiliza-se uma Connection, ao invés de OracleConnection, MysqlConnection, dentre outros.
![Page 14: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/14.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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.
![Page 15: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/15.jpg)
Prof Carlos Eduardo Dantas – [email protected]
Programe voltado à Interface, não à Implementação
• No projeto criado nas aulas anteriores, os casos abaixo estão respeitando esse princípio
![Page 16: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/16.jpg)
Prof Carlos Eduardo Dantas – [email protected]
Programe voltado à Interface, não à Implementação
• Contudo, ClienteView não está respeitando, gerando um alto acoplamento com ClienteControl.
![Page 17: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/17.jpg)
Prof Carlos Eduardo Dantas – [email protected]
Programe voltado à Interface, não à Implementação
• O certo seria criar interfaces e factoriespara 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.
![Page 18: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/18.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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.
![Page 19: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/19.jpg)
Prof Carlos Eduardo Dantas – [email protected]
Componha Comportamentos
• Quantas possibilidades diferentes existem para a execução deste método?
![Page 20: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/20.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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.
![Page 23: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/23.jpg)
Prof Carlos Eduardo Dantas – [email protected]
Componha Comportamentos
• Observa-se que, passando de estruturado para OO, o sistema ganhou
4 novas classes e uma
Interface.
![Page 24: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/24.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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.
![Page 25: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/25.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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.
![Page 26: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/26.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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.
![Page 27: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/27.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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.
![Page 28: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/28.jpg)
Prof Carlos Eduardo Dantas – [email protected]
Evite Herança, favoreça composição
• Exemplo: Herança entre Hashtable e Properties.
![Page 29: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/29.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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()
![Page 30: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/30.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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.
![Page 31: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/31.jpg)
Prof Carlos Eduardo Dantas – [email protected]
Evite Herança, favoreça composição
• No projeto das aulas anteriores, ficou claro que PedidoDaoImpl e ClienteDaoImplficaram livres com o comportamento de Composição
![Page 32: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/32.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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.
![Page 34: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/34.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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.
![Page 35: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/35.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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.
![Page 37: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/37.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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.
![Page 39: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/39.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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.
![Page 40: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/40.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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.
![Page 41: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/41.jpg)
Prof Carlos Eduardo Dantas – [email protected]
Cuidado com objetos mutáveis
• Objetos mutáveis são passíveis de efeitos colaterais, gerando bugs indesejáveis.
![Page 42: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/42.jpg)
Prof Carlos Eduardo Dantas – [email protected]
Cuidado com objetos mutáveis
• Objetos imutáveis são muito mais simples de manipular, e possuem comportamento previsível.
![Page 43: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/43.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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:
![Page 44: Programação Orientada a Objetos - Pós Graduação - Aula 6 - Princípios OO](https://reader030.fdocumentos.tips/reader030/viewer/2022032617/55abdc3a1a28abf02f8b468c/html5/thumbnails/44.jpg)
Prof Carlos Eduardo Dantas – [email protected]
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.