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

Post on 09-Nov-2018

216 views 0 download

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

Esta obra está licenciada sob umaLicença Creative Commons

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

vergonha de perguntar.David Pereira

david@jeebrasil.com.br

1

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

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

Esta obra está licenciada sob umaLicença Creative Commons

O que é POO?

Dados > Funções

O que é? > O que faz?

Foco nos Dados

4

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

Esta obra está licenciada sob umaLicença Creative Commons

O que é POO?

6

Esta obra está licenciada sob umaLicença Creative Commons

O que é POO?

• Simula 67

• Smalltalk

7

Esta obra está licenciada sob umaLicença Creative Commons

O que é POO?

Um código procedural

8

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;

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;

}

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

Esta obra está licenciada sob umaLicença Creative Commons

O que é POO?

Orientado a objetos

12

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.

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”

Esta obra está licenciada sob umaLicença Creative Commons

O que é POO?

15

perimetro

area

altura = 100

largura = 20

Esta obra está licenciada sob umaLicença Creative Commons

O que é POO?

O que ganhamos?

16

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

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

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

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

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.

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

Esta obra está licenciada sob umaLicença Creative Commons

Construção de objetos

23

Esta obra está licenciada sob umaLicença Creative Commons

Construção de Objetos

Objetos são construídos a partir de classes

24

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

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

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

Esta obra está licenciada sob umaLicença Creative Commons

Construção de Objetos

28

Esta obra está licenciada sob umaLicença Creative Commons

Construção de Objetos

29

class NomeClasse { //Atributos //Métodos            }

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

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

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

Esta obra está licenciada sob umaLicença Creative Commons

Construção de Objetos

class Cachorro {

void beber() {

// implementação

}

}

cachorro.beber()

33

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

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)

Esta obra está licenciada sob umaLicença Creative Commons

Construção de Objetos

OO precisa de classes?

36

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

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

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.

Esta obra está licenciada sob umaLicença Creative Commons

Construção de Objetos

Apenas linguagens OO possibilitam o desenvolvimento OO?

40

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;

Esta obra está licenciada sob umaLicença Creative Commons

Information Hiding e Encapsulamento

42

Esta obra está licenciada sob umaLicença Creative Commons

Information Hiding

Visibilidade de atributos e métodos

43

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

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

Esta obra está licenciada sob umaLicença Creative Commons 46

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

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

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

Esta obra está licenciada sob umaLicença Creative Commons

Information Hiding

Violação da Lei de Deméter:

usuario.getPessoa().getEndereco().getRua()

50

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

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

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

Esta obra está licenciada sob umaLicença Creative Commons

Herança

54

Esta obra está licenciada sob umaLicença Creative Commons

Herança

55

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

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

Esta obra está licenciada sob umaLicença Creative Commons

Herança

Herança Múltipla (C++)

class Ornitorrinco : Mamifero, Ave {

// ...

}

58

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 ?

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

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

Esta obra está licenciada sob umaLicença Creative Commons

Princípios de design importantes

62

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

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

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

Esta obra está licenciada sob umaLicença Creative Commons

Princípios de Design

Soluçãoclass Matricula {

private EstrategiaConsolidacao estrategia;

// ...

void consolidar() {

estrategia.consolidar();

}

}

66

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

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

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

Esta obra está licenciada sob umaLicença Creative Commons

Closures

70

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

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

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

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

Esta obra está licenciada sob umaLicença Creative Commons

Fluent Interfaces

75

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

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

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

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

Esta obra está licenciada sob umaLicença Creative Commons

Referências

80

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

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

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