Paradigma orientado a objetos - Caso de Estudo C++
-
Upload
sergio-souza-costa -
Category
Documents
-
view
681 -
download
4
Transcript of Paradigma orientado a objetos - Caso de Estudo C++
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)
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
● 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)
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.
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);
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
● 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
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, ....