View
216
Download
0
Category
Preview:
Citation preview
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
Recommended