programação orientada a objetos - materiais e outras ... · métodos, mas apenas objetos suportam...

33
Programação orientada a objetos Neste capítulo: conceitos-chave que caracterizam as linguagens de programação orientadas a objetos; pragmática da programação orientada a objetos; o projeto de duas importantes linguagens orientadas a objeto, C++ e Java; as características orientadas a objetos de ADA95.

Upload: trannhu

Post on 09-Nov-2018

222 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

Programação orientada a objetos

Neste capítulo:

• conceitos-chave que caracterizam as linguagens de programação orientadas a objetos;

• pragmática da programação orientada a objetos;• o projeto de duas importantes linguagens orientadas a objeto,

C++ e Java;• as características orientadas a objetos de ADA95.

Page 2: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

1 Conceitos-chave

Abstração de dados tornou-se um conceito importante nas linguagens imperativas modernas.

>> É possível projetar programas inteiros em termos de tipos abstratos ou classes.

Se introduzirmos hierarquias de classe, chegamos a um paradigma de programação distinto, a programação orientada a objetos.

Page 3: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

Conceitos-chave da POO:

• Objetos• Classes e subclasses• herança• polimorfismo de inclusão.

Um objeto tem uma ou mais variáveis-componentes, e está equipado com métodos que operam sobre essas variáveis.

As variáveis-componentes de um objeto são tipicamente privadas, e, portanto, podem ser acessadas somente pelos métodos do objeto.

Page 4: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

Objetos oferecem uma maneira natural para modelar entidades do mundo real.

Exemplo: programa de controle de vôo de aeronaves.

O estado da aeronave pode ser modelado por um objeto, equipado com métodos que permitem que ele mude apenas em conformidade com as leis físicas.

>> Isto é mais confiável do que modelar o estado das aeronaves por um grupo de variáveis comuns, que o programa pode atualizar de forma arbitrária.

Page 5: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

Objetos também nos dão uma maneira natural de modelar entidades do cyber-world (mundo computacional), tais como arquivos, bases de dados, páginas Web e componentes de interface do usuário.

Considere uma página Web que apresenta dados econômicos derivados de um banco de dados.

>> A página pode ser modelado por um objeto equipadocom métodos para garantir que ela será sempre atualizadaatomicamente e com dados consistentes.

Page 6: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C
Page 7: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

Uma classe é uma família de objetos com variáveis-componentes e métodos similares.

A subclasse estende uma classe com componentes adicionais e/ou métodos adicionais (ou sobrescritos).

Cada subclasse pode, por sua vez, ter suas próprias subclasses; assim, podemos construir uma hierarquia de classes.

Herança é também característica de linguagens orientadas a objetos.

>> uma subclasse herda (compartilha) todos os métodos de suasuperclasse, a menos que a subclasse explicitamente substitua (sobrescreva) qualquer um desses métodos.

Page 8: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

Na verdade, toda uma hierarquia de classes pode herdar métodos de uma classe ancestral.

>> Herança tem um grande impacto sobre a produtividade do programador.

Page 9: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

Polimorfismo de inclusão é um conceito-chave, permitindo que um objeto de uma subclasse possa ser tratado como um objeto de sua superclasse.

Isto deriva de noções da teoria de conjuntos. Por exemplo, se paraense é subconjunto de brasileiro:

paraense ⊆ brasileiro

Então elementos do conjunto paraense são também elementos do conjunto brasileiro.

Page 10: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

Esse princípio nos permite, por exemplo, construir uma coleção heterogênea de objetos de classes distintas, desde que tal coleção seja definida em termos de alguma classe ancestral comum.

Page 11: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

POO: o paradigma de programação dominante a partir da década de 1990.

Motivos para esse sucesso:

>> O conceito de objetos fornece uma maneira muito natural para modelar sejam entidades do mundo real ou do mundo computacional.

>> Classes e hierarquias de classe provêem unidades altamenteadequadas (e reutilizáveis) para a construção de grandes programas.

>> A programação orientada a objeto se ajusta bem a análise e projeto orientados a objeto, dando suporte ao desenvolvimento de grandes sistemas de software de forma contínua (sem

Page 12: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

quebras conceituais).

2 Pragmática

As unidades de um programa orientado a objetos são as classes.

Classes podem estar relacionadas umas às outras por:

- dependência (operações de uma classe demandam operações de outra classe);- inclusão ou extensão (uma classe é subclasse de outra);- agregação (objetos de uma classe contêm objetos de outra classe).

Obs: sobre agregação: o termo original usado por David Watt é “containment”. Em UML se empregam o termos composição ou agregação.

Page 13: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

Uma classe é similar ou compatível a um tipo cuja representação é determinada por variáveis componentes.

>> Se as variáveis componentes são públicas, elas podemser acessado diretamente por outras classes, dando origem a forte acoplamento.

>> Se as variáveis componentes são privadas, a classe ésimilar a um tipo abstrato, garantindo-se fraco acoplamento.

Page 14: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

Obs: forte acoplamento entre unidades de um programa é algo indesejável no processo de desenvolvimento e ocorre quando há alta probabilidade de que alterações em uma das unidades demandem correspondentes alterações (ajustes) na outra.

Page 15: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

A relação de inclusão (classe/subclasse) é uma fonte potencial de forte acoplamento.

>> Se uma subclasse pode acessar diretamente variáveis componentes de sua superclasse, as duas classes são fortemente acopladas: qualquer alteração nas variáveis componentes da superclasse irá forçar alterações na implementação da subclasse.

Por outro lado, se a subclasse não pode acessar diretamente variáveis componentes de sua superclasse, ele deve operar sobre eles indiretamente (via métodos da superclasse).

Em uma extensa hierarquia de classes, o problema de forte acoplamento pode ser significativo.

Page 16: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

Arquitetura de um (pequeno) programa orientado a objetos,exibindo relações de dependência e de inclusão.

Page 17: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

Compare essa arquitetura com a do programa imperativo com abstração de dados.

Page 18: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

>> A principal diferença é que um programa orientado a objetospode conter subclasses.

>> Uma diferença secundária é que um programa (puramente) orientada a objetos consiste inteiramente de classes ( procedimentos independentestornam-se métodos das classes)

Page 19: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

3 Estudo de caso: C++

C++ foi projetado por Bjarne Stroustrup, que começou em 1979, estendendo C com classes.

Posteriormente, C++ evoluiu gradualmente através da adição de subclasses, funções ('' virtual'') passíveis de sobrescrita , sobrecarga, e muitos outros recursos.

Page 20: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

Uma versão-padrão internacionalmente reconhecida de C++ foi definida em 1998.

A padronização de C++ foi coordenada com a padronização contemporânea de C, garantindo-se que C continua a ser um subconjunto de C++ em quase todos os aspectos, exceto alguns poucos de menor importância (o que significa que a maioria dos programas C também são programas C++).

Page 21: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

É notoriamente difícil estender uma linguagem de programação existente com sucesso. As junções tendem a ser claramente visíveis.

Neste caso, características de abstração de dados de alto nível C++ não se ajustam facilmente a (e na verdade são prejudicados por) características de baixo nível de C.

No entanto, C++ mostrou-se muito bem sucedida na prática, sendo amplamente utilizada tanto para a programação de sistema como de aplicações e, e introduzindo muitos programadores do campo imperativo na programação orientada a objetos.

Page 22: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

3.1 Valores e tipos

C++ toma seus tipos primitivos em grande parte de C.

C++ tem um tipo booleano (bool), mas ele é classificado como um tipo inteiro (com valores 0 e 1), e parece ser subutilizado na prática.

Page 23: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

C++ faz pouca distinção entre registros (structs) e objetos.

>> Tanto registros como objetos podem ser equipados commétodos, mas apenas objetos suportam encapsulamento.

O repertório de expressões de C++ é semelhante ao de C.

O sistema de tipos de C++ é mais complexo, suportando polimorfismo de inclusão e sobrecarga.

C++ implementa verificação de tipos mais forte que C. Particularmente, nas chamadas de função em C++ sempre há verificação de tipo, mesmo se a função chamada se encontra em uma unidade de compilação diferente.

Page 24: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

A aritmética de ponteiro permanece, no entanto, e mina a verificação de tipo.

>> se P é do tipo char*, a expressão (legal) p+7 é também do tipo char*, mas o resultado poderia ser um ponteiro para uma variável de qualquer tipo!

Page 25: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

3.2 Variáveis, armazenamento e controle

C++ suporta variáveis globais e locais.

C++ também suporta explicitamente variáveis de heap, que são criados pelo alocador new e destruídas pelo desalocador delete.

C++ inclui todos os comandos e seqüenciadores de C. Além disso, C++ suporta exceções, concebidas como objetos comuns.

Page 26: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

>> Tipicamente, um objeto exceção é construído imediatamente antes de ser disparado; quando a exceção é capturada, o manipulador pode consultá-la para determinar o valor que ela carrega.

>> Uma função C++ pode especificar quais classes de exceções ela pode disparar. Uma função sem nenhuma especificação de exceção pode lançar qualquer exceção (não é possível especificar que uma função nunca lançará uma exceção).

Page 27: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

3.3 Vinculações e escopo

Um programa C++ consiste de declarações de tipos e variáveis globais, funções, classes e unidades genéricas (''templetes'').

O programa principal é uma função chamada main.

Dentro de uma declaração de classe C++, nós declaramos os componentes da classe: variáveis, construtores e métodos.

Dentro de uma função, construtor, ou método C++ , podemos declarar parâmetros formais, variáveis locais e tipos locais.

Page 28: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

Um parâmetro ou variável C++ pode ser declarado com o especificador const, caso em que pode ser inspecionado, mas não atualizado. (Além disso, um tipo ponteiro pode especificar como const seus referentes, caso em que os referentes podem ser inspecionados, mas não atualizados.)

char *const cp; // ponteiro const para charchar const* pc; // ponteiro para const charconst char* pc2; // ponteiro para const char

Page 29: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

C++ suporta funções, construtores e métodos.

Métodos diferem de funções comuns apenas no fato delas estarem vinculadas a objetos.

O tipo resultante de uma função ou método pode ser vazio (void) ou qualquer outro tipo.

Page 30: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

C++ suporta tanto passagem de parâmetros por valor como por referência.

void minimax (int a [], int n, int& min, int& max){ / / coloca em min o mínimo e em max o máximo, dos / / inteiros em a[0], ... , a[n-1]....}

Uma possível chamada para esta função:

int [] temps = {13, 15, 20, 18, 21, 14, 12};int menor, maior;. . .

minimax(temps, 7, menor, maior);

Page 31: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

C++ suporta sobrecarga de funções (e construtores e métodos) independente de contexto.

OBS: na sobrecarga dependente de contexto, as assinaturas das funções só diferem no tipo de retorno.

>> problemas com ambiguidade.

Além disso, pode-se sobrecarregar qualquer operador existente, fornecendo uma definição adicional. (Mas não se pode inventar símbolos de operadores novos.)

Page 32: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

Ex. funções sobrecarregadas

void put (ostream str, int i);

void put (ostream str, double r);

int put (ostream str, double r) // ilegal!

Page 33: Programação orientada a objetos - Materiais e outras ... · métodos, mas apenas objetos suportam encapsulamento. O repertório de expressões de C++ é semelhante ao de C

Ex. 3 - Operadores sobrecarregados

A classe (library class) ostream sobrecarrega o operador ''<<'' como segue:

classe ostream:. . . {// Um objeto ostream é um fluxo de saída de texto.. . .public:ostream& operator << (char c); // Escreva c para este fluxo.ostream& operator << (int i); // Escreva i para este fluxo.ostream& operator << (double r) // Escreva r para este fluxo.. . .}