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

Paradigma orientado a objetos - Caso de Estudo C++

Embed Size (px)

Citation preview

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 CostaProfessor - UFMADoutor 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 chavesPragmaticaCaso 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ênciavoid 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 class ostream : . . . {

public: ostream& operator<< (char c); ostream& operator<< (int i); ostream& operator<< (double r); }

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

Sobrecarga de operadoresstruct 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çõesclass 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 dadosclass 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