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

Post on 09-Nov-2018

222 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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.

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.

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.

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.

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.

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.

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.

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.

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.

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

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.

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.

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.

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.

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

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

>> 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)

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.

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++).

É 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.

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.

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.

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!

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.

>> 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).

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.

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

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.

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);

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.)

Ex. funções sobrecarregadas

void put (ostream str, int i);

void put (ostream str, double r);

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

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.. . .}

top related