tudo o que você queria saber sobre poo, mas tinha · herança múltipla de interfaces (java) class...
TRANSCRIPT
![Page 1: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/1.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Tudo o que você queria saber sobre POO, mas tinha
vergonha de perguntar.David Pereira
1
![Page 2: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/2.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Agenda
• O que é POO?
• Construção de Objetos
• Information Hiding e Encapsulamento
• Mecanismos de Herança
• Princípios de Design Importantes
• Closures
• Fluent Interfaces
2
![Page 3: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/3.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
O que é POO?
“Construção de software Orientado a Objetos é o método de desenvolvimento de software que baseia a arquitetura de um sistema em módulos inferidos a partir dos tipos de dados que ele manipula (em vez de basear na função ou funções que esse sistema tem como objetivo realizar).”
(Meyer, 1997)
3
![Page 4: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/4.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
O que é POO?
Dados > Funções
O que é? > O que faz?
Foco nos Dados
4
![Page 5: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/5.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
O que é POO?
Objetos são abstrações matemáticas que representam os elementos do “mundo real” presentes no domínio da aplicação.
5
![Page 6: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/6.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
O que é POO?
6
![Page 7: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/7.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
O que é POO?
• Simula 67
• Smalltalk
7
![Page 8: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/8.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
O que é POO?
Um código procedural
8
![Page 9: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/9.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
O que é POO?
9
struct t_retangulo {double altura;double largura;
};
typedef struct t_retangulo retangulo;
![Page 10: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/10.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
O que é POO?
10
double calcula_area(retangulo r) {return r.altura * r.largura;
}
double calcula_perimetro(retangulo r) {return 2*r.altura + 2*r.largura;
}
![Page 11: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/11.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
O que é POO?
11
retangulo r;r.altura = 100;r.largura = 20;
calcula_area(r); // Deve imprimir 2000calcula_perimetro(r); // Deve imprimir 240
![Page 12: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/12.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
O que é POO?
Orientado a objetos
12
![Page 13: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/13.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
O que é POO?
13
Object subclass: #RetanguloinstanceVariableNames ‘largura altura’
area “Retorna a área do retângulo” |area| area := largura * altura. ^area.
perimetro “Retorna o perímetro do retângulo” |perimetro| perimetro := (2*largura) + (2*altura). ^perimetro.
![Page 14: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/14.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
O que é POO?
14
r := Retangulo newaltura: 100;largura: 20.
r.area. “deve mostrar 2000”r.perimetro. “deve mostrar 240”
![Page 15: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/15.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
O que é POO?
15
perimetro
area
altura = 100
largura = 20
![Page 16: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/16.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
O que é POO?
O que ganhamos?
16
![Page 17: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/17.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
O que é POO?
Modularidade é a propriedade que um sistema tem de ser decomposto em um conjunto de módulos coesos e fracamente acoplados
R. Gauthier e S. Pont, Designing Systems Programs, 1970
17
![Page 18: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/18.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
O que é POO?
Reusabilidade, ou seja, a possibilidade de utilizar pedaços de software existentes para construir novos softwares.
18
![Page 19: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/19.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
O que é POO?
Diminuição no escopo das variáveis, afinal, ter variáveis globais é uma péssima prática.
William Wulf e Mary Shaw, Global variable considered harmful, 1973.
19
![Page 20: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/20.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
O que é POO?
Segurança, pois um objeto tem a capacidade verificar o seu estado e identificar quando o seu contrato é quebrado.
20
![Page 21: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/21.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
O que é POO?
21
Object subclass: #Retangulo instanceVariableNames ‘largura altura’ classInvariant: ‘(largura > 0) and: (altura > 0)’
altura: umaAltura self require: umaAltura > 0 ^altura := umaAltura.
![Page 22: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/22.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
O que é POO?
Aumento na testabilidade, ou o aumento da facilidade de criação de casos de testes para um software ou pedaço de software.
22
![Page 23: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/23.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Construção de objetos
23
![Page 24: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/24.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Construção de Objetos
Objetos são construídos a partir de classes
24
![Page 25: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/25.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Construção de Objetos
Na ciência da computação, um tipo abstrato de dados (ADT, Abstract Data Type) é a especificação matemática de um conjunto de dados e um conjunto de operações que podem ser realizadas sobre esses dados.
25
![Page 26: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/26.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Construção de Objetos
26
TIPOS- STACK[G]FUNÇÕES- put: (STACK[G] × G) → STACK[G]- remove: STACK[G] ↛ STACK[G]- top: STACK[G] ↛ G- empty: STACK[G] → BOOLEAN- new: STACK[G]AXIOMASPara cada x ∈ G, s ∈ STACK[G]A1: item(put(s,x)) = xA2: remove(put(s,x)) = sA3: empty(new) = trueA4: empty(put(s,x)) = falsePRECONDIÇÕESremove(s: STACK[G]) require not empty(s)item(s: STACK[G]) require not empty(s) Fonte: Meyer, 1997
![Page 27: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/27.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Construção de Objetos
“Uma classe é um tipo abstrato de dados equipado com uma implementação (total ou parcial)”.
(Meyer, 1997)
27
![Page 28: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/28.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Construção de Objetos
28
![Page 29: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/29.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Construção de Objetos
29
class NomeClasse { //Atributos //Métodos }
![Page 30: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/30.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Construção de Objetos
Atributos são características de uma classe que são comuns a todas as suas instâncias. O conjunto de valores dos atributos em um ponto no tempo é chamado de estado. Objetos diferentes normalmente possuem estados diferentes.
30
![Page 31: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/31.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Construção de Objetos
• Cor do pêlo
• Altura
• Peso
• Raça
• Cor dos olhos
• etc.
31
![Page 32: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/32.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Construção de Objetos
Métodos são operações que podem manipular os dados de um objeto. São invocados quando um objeto recebe uma mensagem.
32
![Page 33: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/33.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Construção de Objetos
class Cachorro {
void beber() {
// implementação
}
}
cachorro.beber()
33
![Page 34: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/34.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Construção de Objetos
Princípio da Uniformidade de Acesso
“Todos os serviços oferecidos por um módulo devem ser disponibilizados através de uma notação uniforme, que não revela se eles foram obtidos através de armazenamento ou computação.”
(Meyer, 1997)
34
![Page 35: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/35.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Construção de Objetos
35
Ruby
Atributo: retangulo.areaMétodo: retangulo.areaMétodo: retangulo.contem ponto ou retangulo.contem(ponto)
Java
Atributo: retangulo.areaMétodo: retangulo.area()Método: retangulo.contem(ponto)
![Page 36: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/36.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Construção de Objetos
OO precisa de classes?
36
![Page 37: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/37.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Construção de Objetos
Programação baseada em protótipos é um estilo de POO no qual não existem classes. A reutilização de comportamento é feita através de um processo de clonagem de objetos existentes que servem como protótipos para novos objetos.
37
![Page 38: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/38.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Construção de Objetos
38
var FormaGeometrica = function() { }FormaGeometrica.prototype.perimetro = function() {var total = 0.0;for (var i = 0; i < this.lados.length; i++)total += this.lados[i]
return total}
triangulo = new FormaGeometrica()triangulo.lados = new Array( 1.5, 2.0, 2.5 )triangulo.perimetro()
quadrado = new FormaGeometrica()quadrado.lados = new Array( 4, 4, 4, 4 )quadrado.perimetro()
![Page 39: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/39.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Construção de Objetos
39
Classes ProtótiposClasses e instâncias são objetos diferentes Não há distinção
Uma classe é criada através de uma definição de classe. Um objeto, a partir do construtor.
Definição e construção a partir do construtor
Cria um objeto com o operador new Mesma coisa
Hierarquia de objetos através de classes que são filhas de classes existentes.
Hierarquia de objetos através da utilização de um objeto como protótipo para outros.
Definição de classe especifica os atributos de todas as instâncias de uma classe.
Protótipo especifica um conjunto inicial de propriedades. Pode-se adicionar outras a um
objeto ou a um conjunto de objetos.
![Page 40: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/40.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Construção de Objetos
Apenas linguagens OO possibilitam o desenvolvimento OO?
40
![Page 41: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/41.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Construção de Objetos
41
struct _ooc_class_person { struct _ooc_vtbl_person const*const __vptr; t_person (*const person)(void); void (*const _person)(t_person *const this); t_person *const (*const alloc)(void);
t_person *const (*const new)(char const name[]); void (*const init)(t_person *const this, char const name[]);
} person;
![Page 42: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/42.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Information Hiding e Encapsulamento
42
![Page 43: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/43.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Information Hiding
Visibilidade de atributos e métodos
43
![Page 44: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/44.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Information Hiding
• A definição da visibilidade de atributos e métodos consiste em informar quais desses recursos podem ser acessados por outros objetos.
• private, public, protected, etc.
44
![Page 45: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/45.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Information Hiding
Encapsulamento (Encapsulation ou Information Hiding) é o processo de esconder detalhes de implementação de uma classe, deixando para o seu usuário apenas uma interface de interação.
David Parnas, On the Criteria to Be Used in Decomposing Systems Into Modules, 1972.
45
![Page 46: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/46.jpg)
Esta obra está licenciada sob umaLicença Creative Commons 46
![Page 47: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/47.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Information Hiding
47
class Pessoa { // atributos... public boolean isMaiorIdade() { if (idade >= 18) return true; else return false; } // outros métodos... }
![Page 48: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/48.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Information Hiding
Lei de Deméter (Principle of the least knowledge): “Cada unidade deve falar apenas com os seus amigos; não fale com estranhos”.
Ian Holland, 1987
48
![Page 49: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/49.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Information Hiding
A lei de Deméter diz que um método M de um objeto O deve invocar apenas métodos dos seguintes objetos:
1. O próprio “O” 2. Parâmetros de “M” 3. Qualquer objeto instanciado e “M” 4. Os atributos de “O”
49
![Page 50: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/50.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Information Hiding
Violação da Lei de Deméter:
usuario.getPessoa().getEndereco().getRua()
50
![Page 51: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/51.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Mecanismos de Herança
“Interesting Systems are seldom born into an empty world”
(Meyer, 1997)
51
![Page 52: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/52.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Herança
Herança (ou Generalização) é uma maneira de definir objetos através da utilização de objetos definidos anteriormente. Os novos objetos acrescentam funcionalidade ao objeto a partir do qual foram criados.
52
![Page 53: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/53.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Herança
Taxomania Rule
“Todo herdeiro deve introduzir um novo recurso, redeclarar um recurso herdado ou adicionar uma cláusula invariante”.
(Meyer, 1997)
53
![Page 54: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/54.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Herança
54
![Page 55: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/55.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Herança
55
![Page 56: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/56.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Herança
class ContaCorrente { int numero, dv; BigDecimal saldo; List<Movimentacao> movimentacoes; void extrato() { // ... }}class ContaEspecial extends ContaCorrente { BigDecimal chequeEspecial; // ...}
56
![Page 57: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/57.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Herança
Como NÃO fazer Herança
class Ponto { int x, y; // ...}
class Circulo extends Ponto { int raio; // ...}
57
![Page 58: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/58.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Herança
Herança Múltipla (C++)
class Ornitorrinco : Mamifero, Ave {
// ...
}
58
![Page 59: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/59.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Herança
• Java (e a maioria das linguagens OO) não permite herança múltipla
59
A
B C
D
foo
bar bar
“Diamond of Death”d.foo ?d.bar ?
a = (A) d ?
![Page 60: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/60.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Herança
Herança Múltipla de Interfaces (Java)
class Ornitorrinco implements Mamífero, Ave {
// ...
}
60
![Page 61: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/61.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Herança
Mix-ins (Ruby)
module Ave def botar_ovos #implementação endendmodule Mamifero def amamentar #implementacao endend
61
class Ornitorrinco include Ave include Mamiferoend
o = Ornitorrinco.newo.botar_ovoso.amamentar
![Page 62: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/62.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Princípios de design importantes
62
![Page 63: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/63.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Princípios de Design
Open Closed Principle: “Entidades de software (classes, módulos, funções, etc) devem ser abertas para extensão e fechadas para modificação”.
63
![Page 64: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/64.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Princípios de Design
Open For Extension: é possível estender o comportamento de um módulo a medida em que uma aplicação muda.
Closed For Modification: o ato de estender o comportamento não requer uma modificação no código fonte do módulo.
64
![Page 65: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/65.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Princípios de Design
Exemploclass Matricula {
// ...
void consolidar() {
if (discente.isGraduacao()) {
// ...
} else if (discente.isTecnico()) {
// ...
} else if (discente.isPosGraduacao()) {
// ...
}
}
65
![Page 66: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/66.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Princípios de Design
Soluçãoclass Matricula {
private EstrategiaConsolidacao estrategia;
// ...
void consolidar() {
estrategia.consolidar();
}
}
66
![Page 67: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/67.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Princípios de Design
interface EstrategiaConsolidacao {
void consolidar();
}
class EstrategiaGraduacao implements EstrategiaConsolidacao {
// ...
}
matricula.setEstrategia(new EstrategiaGraduacao());
matricula.setEstrategia(new EstrategiaTecnico());
matricula.setEstrategia(new EstrategiaStricto());
matricula.consolidar();
67
![Page 68: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/68.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Princípios de Design
Dependency Inversion Principle
1. Módulos de alto nível não podem depender de módulos de baixo nível. Ambos devem depender de abstrações.
2. Abstrações não devem depender de detalhes. Detalhes devem depender de abstrações.
68
![Page 69: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/69.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Princípios de Design
69
Service Layer Interfaces DAOs(Abstração)
Implementação de DAOS(Detalhes)
depende de
depende de
![Page 70: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/70.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Closures
70
![Page 71: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/71.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Closures
“Closures são, essencialmente, blocos de código que podem ser passados como parâmetros para funções.”
(Fowler, 2004)
71
![Page 72: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/72.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Closures
public List<Funcionario> gerentes(List<Funcionario> func) {
List<Funcionario> resultado = new ArrayList<Funcionario>();
for (Funcionario f : funcionarios)
if (f.isGerente()) result.add(f);
return resultado;
}
def gerentes func
func.select{ |f| f.isGerente }
end
72
![Page 73: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/73.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Closures
Annonymous Inner Classespublic List<Funcionario> select(Criteria c) { List<Funcionario> resultado = new ArrayList<Funcionario>(); for (Funcionario f : funcionarios) { if (c.eval(f)) resultado.add(f); } return resultado;}
List<Funcionario> resultado = lista.select(new Criteria() { boolean eval(Funcionario f) { return f.isGerente(); }});
73
![Page 74: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/74.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Closures
Closures no Java 7public List<Funcionario> select({Funcionario => boolean} c) {
List<Funcionario> resultado = new ArrayList<Funcionario>(); for (Funcionario f : funcionarios) { if (c.eval(f)) resultado.add(f); } return resultado;}
lista.select({ Funcionario f => f.isGerente() });
74
![Page 75: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/75.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Fluent Interfaces
75
![Page 76: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/76.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Fluent Interfaces
Fluent Interfaces são uma construção da orientação a objetos que definem um comportamento no qual um contexto de instruções pode ser executado através de chamadas subsequentes de métodos.
76
![Page 77: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/77.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Fluent Interfaces
private void makeNormal(Customer customer) {
Order o1 = new Order();
customer.addOrder(o1);
OrderLine line1 = new OrderLine(6, Product.find("TAL"));
o1.addLine(line1);
OrderLine line2 = new OrderLine(5, Product.find("HPK"));
o1.addLine(line2);
OrderLine line3 = new OrderLine(3, Product.find("LGV"));
o1.addLine(line3);
line2.setSkippable(true);
o1.setRush(true);
}
(Fowler, 2005)
77
![Page 78: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/78.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Fluent Interfaces
private void makeFluent(Customer customer) { customer.newOrder() .with(6, "TAL") .with(5, "HPK").skippable() .with(3, "LGV") .priorityRush();}
78
![Page 79: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/79.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Fluent Interfaces
class Order { // ... public Order with(int id, String type) { addLine(new OrderLine(id, type)); return this; } public Order skippable() { setSkippable(true); return this; } public Order prioorityRush() { setRush(true); return this; }}
79
![Page 80: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/80.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Referências
80
![Page 81: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/81.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Referências
• Object Oriented Software Construction, Bertrand Meyer
• Smalltalk, Objects and Design, Charmond Liu
• Refactoring, Martin Fowler
• Applying UML and patterns, Craig Larman
• The Ruby Way, Hal Fulton
81
![Page 82: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/82.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Referências
• The Open Closed Principle, Robert C. Martin
• The Liskov Substitution Principle, Robert C. Martin
• The Dependency Inverion Principle, Robert C. Martin
• The Interface Segregation Principle, Robert C. Martin
82
![Page 83: Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class Ornitorrinco implements Mamífero, Ave {// ...} 60. Esta obra está licenciada](https://reader031.vdocuments.site/reader031/viewer/2022022106/5be5b06009d3f2ea1a8beb34/html5/thumbnails/83.jpg)
Esta obra está licenciada sob umaLicença Creative Commons
Referências
• Object oriented programming in C, Laurent Deniau. http://ldeniau.home.cern.ch/ldeniau/html/oopc/oopc.html.
• Core JavaScript 1.5 Guide. http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide
83