Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class...

83
Esta obra está licenciada sob uma Licença Creative Commons Tudo o que você queria saber sobre POO, mas tinha vergonha de perguntar. David Pereira [email protected] 1

Transcript of Tudo o que você queria saber sobre POO, mas tinha · Herança Múltipla de Interfaces (Java) class...

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

Esta obra está licenciada sob umaLicença Creative Commons

Tudo o que você queria saber sobre POO, mas tinha

vergonha de perguntar.David Pereira

[email protected]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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