Paradigma orientado a objetos - Caso de Estudo C++

skosta 1,614 views 60 slides Jan 08, 2014
Slide 1
Slide 1 of 60
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60

About This Presentation

No description available for this slideshow.


Slide Content

Paradigma
Orientado a Objetos
Prof: Sergio Souza Costa
Baseado no Capitulo 8 do Livro: Programming Language Design
Concepts. David Watt

Sobre mim
Sérgio Souza Costa
Professor - UFMA
Doutor em Computação Aplicada (INPE)


[email protected]
https://sites.google.com/site/profsergiocosta/home
https://twitter.com/profsergiocosta
http://gplus.to/sergiosouzacosta
http://www.slideshare.net/skosta/presentations?order=popular

Paradigma Orientado a objetos
Veremos ...

Conceitos chaves
Pragmatica
Caso de estudo C++

Paradigma Orientado a objetos
●Não é um paradigma no sentido estrito: é uma subclassificacão do
imperativo
●A diferença é mais de metodologia quanto à concepção e
modelagem do sistema.
●A grosso modo, uma aplicação é estruturada em módulos (classes)
que agrupam um estado (atributos) e operações (métodos) sobre
este
●Classes podem ser estendidas e/ou usadas como tipos (cujos
elementos são objetos)

Conceitos chaves

Conceitos chaves

●Objetos
●Classes e subclasses
●Herança
●Polimorfismo de inclusão

Objetos
Objeto 1 Objeto 2
Objeto 3
Objeto 4
Um sistema é uma coleção de objetos e suas
relações.

Objeto
Um objeto é composto por uma ou mais
variáveis, e e equipado com métodos que
operam sobre elas.

Objeto
Um objeto é composto por uma ou mais
variáveis, e e equipado com métodos que
operam sobre elas.

As variáveis são tipicamente privadas,
podendo ser acessadas somente pelo
métodos.

Objeto
Um objeto é composto por uma ou mais
variáveis, e e equipado com métodos que
operam sobre elas.

As variáveis são tipicamente privadas,
podendo ser acessadas somente pelo
métodos.

Objetos nos dá um modo natural para modelar
entidades do mundo real.

Classes
●Classificar objetos e uma característica
chave em POO.
●A classe é uma estrutura de onde se deriva
vários objetos.
○Os objetos são as entidade criadas a partir de uma
classe.
●Um objeto é uma “instância” de uma classe.
○Classes existem na modelagem enquanto os
objetos em execução.

Herança
Uma subclasse herda todos os métodos da
super classe, ao menos que ela explicitamente
sobrecarregue algum deles.

Herança
Uma subclasse herda todos os métodos da
super classe, ao menos que ela explicitamente
sobrecarregue algum deles.

Herança tem um grande impacto na
produtividade dos programadores.

Foi um dos principais recursos que ajudou na
popularização deste "paradigma".

Polimorfismo de inclusão
Habilita um objeto de uma subclasse ser
tratada como um objeto da superclasse.

Isso permite construir coleções heterogêneas
de objetos de diferente classes, mas com o
mesmo antecessor (vetores de Object em
Java)

Pragmatica
As unidades de um programa são classes,
relacionadas:

●dependencia, metodos de uma classe
chama de outra.
●inclusão ou extensão, uma classe é uma
subclasse de outra.
●composição, objetos de uma classe contem
objetos de outra

Pragmatica
Uma classe é similar a um tipo composto, cuja
representação é definida pelos seus
componentes.

Pragmatica
Uma classe é similar a um tipo composto, cuja
representação é definida pelos seus
componentes

Se suas variaveis são privadas, a classe é um
tipo abstrato, garatindo baixo acoplamento.

Pragmatica
A relação de inclusão aumenta a acoplamenteo
das classes.

Como as subclasses tem acesso as variaveis
da superclasse, modificação nas variaveis da
super afetará a subclasse.

Caso de Estudo C++

C++
Proposta por Bjarne Stroustroup como uma
extensão ao C (C com classes) em 1983.

Padronizado pela ISO, em 1998 e revisado em
2003

Em 2011 foi lançado uma nova versão, quye
inclui por exemplo, funções anonimas.

Tipos e Valores
●Os tipos primitivos em C++ são os mesmo
do C, com adição do tipo "bool" que é pouco
usado na prática.

Tipos e Valores
●Os tipos primitivos em C++ são os mesmo
do C, com adição do tipo "bool" que é pouco
usado na prática.
●Os tipos compostos do C tambem foram
usados. Adicionamente, C++ suporta
objetos além de "structs".
○Ambos podem ser equipados com métoos.

Sistema de tipos
O sistema de tipo do C++ é mais complexo,
suportanto polimorfismo de inclusão e
sobrecarga.

O sistema de tipo é mais forte do que o C,
menos coersões e chamada de funções são
sempre checadas.

Variaveis
●Similar ao C, C++ suporta variaveis locais e
globais.

●Adicionalmente, C++ suporta
EXPLICITAMENTE variáveis heap, através
dos operadores new (alocador) e delete
(desalocador).

Variaveis
●Similar ao C, C++ suporta variaveis locais e
globais.

●Adicionalmente, C++ suporta
EXPLICITAMENTE variáveis heap, através
dos operadores new (alocador) e delete
(desalocador).

Qual a diferença do new
para o malloc e do delete
para o free.

Controle
C++ include todos os comandos e sequencias
do C.

Adicionamente, o C++ suporta tratamento de
exceção.

Amarração e escopo
●Um programa C++ consiste de declarações
globais de tipo, funções, classes e unidades
genericas (templates). O programa principal
e a função main.

Amarração e escopo
●Um programa C++ consiste de declarações
globais de tipo, funções, classes e unidades
genericas (templates). O programa principal
e a função main.
●Uma classe C++ consiste de declarações de
variaveis, construtores e métodos.

Amarração e escopo
●Um programa C++ consiste de declarações
globais de tipo, funções, classes e unidades
genericas (templates). O programa principal
e a função main.
●Uma classe C++ consiste de declarações de
variaveis, construtores e métodos.
●Uma função (construtor e método) C++
consiste de declarações de parametros
formais, variaveis locais e tipos locais.

Amarração e escopo
●O modificador const, declara que uma
variavel pode ser inspecionada e não
tualizada.
●E no caso abaixo, que linha é invalida?


const int *p;
int q, r = 10;
p = &q;
p = &r;
*p = 10;

Procedimentos e funções
●C++ suporta funções, construtores, e
métodos.
○Métodos difere das funções somente por eles serem
anexados a objetos.
●O resultado de uma função ou método pode
ser void ou qualquer outro tipos.
●C++ suporta passagem por referência para
parametros.

Passagem por referência
void minimax (int a[], int n, int& min, int& max) {
min = max = a[0];
int i;
for (i = 1; i < n; i++) {
int elem = a[i];
if (elem < min) min = elem;
else if (elem > max) max = elem;
}
}

int[] temps = {13, 15, 20, 18, 21, 14, 12};
int low, high;
...
minimax(temps, 7, low, high);

Passagem por referência
●C++ suporta sobrecarga independente de
contexto de funções ( construtores e
métodos).
○duas ou mais funções podem compartilhar o mesmo
identificador somente se elas diferencias em tipo ou
numero de parametrs.
●Operadores sao tratados exatamente como
funções, podemos sobrecarregar existentes
operadores, mas nao podemos criar novos.

Passagem por referência
Permitido:

void put (ostream str, int i);
void put (ostream str, double r);

Passagem por referência
Permitido:

void put (ostream str, int i);
void put (ostream str, double r);

Nao permitido ( contexto)

int put (ostream str, double r); // illegal!

Sobrecarga de operadores
classostream:. . .{
public:

ostream& operator<< (charc);
ostream& operator<< (inti);
ostream& operator<< (double r);
}


ostream out;
int n;
...
out << (n/100); out << '%';
//ou simplesmente
out << (n/100) << '%';

Sobrecarga de operadores
struct Point {
int x, y;
public:
Point (int x, int y):x(x), y(y) {};
};
ostream& operator << (ostream &o,const Point &p){
o << "(" << p.x << ", " << p.y << ")";
return o;
}

int main () {cout << Point(4,5) << endl;}

Abstração de dados
●Suportada em C++ através de classes.
●Uma declaração de classe contem
○seu nome e das suas superclasse
○variaveis de classes
○operações (construtores e métodos)

Abstração de dados
●Suportada em C++ através de classes.
●Uma declaração de classe contem
○seu nome e das suas superclasse
○variaveis de classes
○operações (construtores e métodos)
●Pela terminologia do C++:
○subclasse é chamada de classe derivada
○superclasse é chamada de classe base
○métodos são simplesmente chamados de funções

Abstração de dados - declarações
Uma declaração em uma classe poder ser
definida como:
●públicas - public,
●protegidas - protected,
●privadas - private

Total encapsulamento é alcançado com as
variaveis declaradas como privadas ou
protegidas, e somente as operações como
publicas.

Abstração de dados - declarações
Podemos distinguir variaveis em dois tipos:

●de instancia; cada objeto possui uma copia
distinta desta variavel
●de classe, só existe uma por classe.

Qual a palavra reservada para fazer essa
distinção?

Abstração de dados - declarações
Podemos distinguir variaveis em dois tipos:

●de instancia; cada objeto possui uma copia
distinta desta variavel
●de classe, só existe uma por classe.

Qual a palavra reservada para fazer essa
distinção?
●static

Abstração de dados - declarações
class A {
public:
static int x;
};
int A::x = 10;
int main () {
A a,b;
a.x = 20;
cout << b.x << "-" << A::x << "-" << a.x << endl;
}

Abstração de dados - declarações
similarmente, existem duas declarações de
métodos:

●instancia e
●classe

Abstração de dados - construtores
É um tipo especial de metodo usado para criar
os objetos.

Similar aos outros métodos, construtores
tambem podem ser sobrecarregados.

Objetos C++
Objetos C++, similar as variáveis, podem ser
global, local ou "heap".

C++ adota semantica de copia para todos as
atribuições, porem a semantica de referencia
pode ser alcançada usando ponteiros para
objetos.

Copia vs Referencia
{
Person pc("Curie", "Pierre", 'M', 1859);
Person ms("Sklodowska", "Marie", 'F', 1867);
Person mc;
mc = ms;
mc.change_surname(pc.get_surname());
}

Qual o valor para ms.get_surname() ?

Copia vs Referencia
{
Person* ppc = new Person("Curie", "Pierre", 'M', 1859);
Person* pms = new Person("Sklodowska", "Marie", 'F', 1867);
Person* pmc;
pmc = pms;
pmc->change_surname(ppc->get_surname());
}
Qual o valor para pms.get_surname() ?

Abstração de dados
class A {
public:
A (int x):x(x){}
int getX() {return x;}
private:
int x;
};
int main () {
A* a = new A(30);
*a = 20;
cout << a->getX() << endl ;
}

Quebrando o
encapsulamento

Abstração de dados
Herança
multipla é
suportada
diretamente em
C++:

Abstração de dados
●O uso de herança multipla é controverso.
●Dado que herança quebra com o
encapsulamento e aumenta acoplabilidade
entre as entidades.
●Herança multipla agravaria essas
desvantagens.
●Porém, bem aplicado pode ser um
instrumento poderoso na modelagem.

Polimorfismo de inclusão
●C++ suporta polimorfismo de inclusão, dado
que um objeto de uma sub-classe pode ser
tradado como um objeto da superclasse,
quando eles sao acessados atraves de
ponteiros.

Polimorfismo de inclusão

Polimorfismo de inclusão
Person p[10]; Person dw("Watt", "David", 'M', 1946);
Student jw("Watt", "Jeff", 'M', 1983, 0100296, "BSc");
p[0] = dw;
p[1] = jw; // illegal!

Person* pp[10]; Person* pdw =
new Person("Watt", "David", 'M', 1946);
Student* pjw =
new Student("Watt", "Jeff", 'M', 1983,0100296, "BSc");
pp[0] = pdw;
pp[1] = pjw; // legal

Abstração genérica

C++ suporta classes genericas, que podem ser
parametrizadas
● por valores,
●variaveis,
● tipos, e
●funções.

Classes parametrizadas
template <class Element, bool less (Element x, Element y) >
class Priority_Queue {
private:
. . .//representação
public:
Priority_Queue (); void add (Element e); Element remove ();
}

//usando
struct Print_Job { int owner_id;int timestamp;char* ps_filename;}

bool earlier (Print_Job job1, Print_Job job2) {
return (job1.timestamp < job2.timestamp);}
typedef Priority_Queue<Print_Job, earlier> Print_Queue;

Funções parametrizadas
template <class Item>
void swap (Item& x, Item& y) {
Item z = x;
x = y;y = z;
}

int a[];
...
swap(a[i], a[j]);

Funções parametrizadas
template <class Item>
void swap (Item& x, Item& y) {
Item z = x;
x = y;y = z;
}

int a[];
...
swap(a[i], a[j]);

Classes e funções parametrizadas são
amplamente utilizadas na biblioteca
STL (standard template library), que
disponibiliza diversos conteiners,
pilhas, listas, filas, ....

DÚVIDAS