programação orientada a objetos - w3.impa.brw3.impa.br/~rbs/pdf/oop.pdf · mensagem” ao objeto...

172
Programação Orientada a Objetos Programação Orientada a Objetos Roberto de Beauclair Seixas Roberto de Beauclair Seixas [email protected] [email protected]

Upload: dothu

Post on 11-Nov-2018

215 views

Category:

Documents


0 download

TRANSCRIPT

Programação Orientada a ObjetosProgramação Orientada a Objetos

Roberto de Beauclair SeixasRoberto de Beauclair Seixas

[email protected]@lncc.br

Mar/97 Beauclair 2

Agenda

✔ Nivelamento

✔ Histórico

✔ Características da OOP

✔ Terminologia– Definições e Exemplos

✔ Desenvolvimentos de Programas OO

✔ Metodologia de Programação OO

✔ Estudo de Casos (Exercícios Orientados)

Parte 1

Conceitos básicos

Mar/97 Beauclair 4

Nivelamento

✔Programa X Algoritmo X Implementação

✔Técnicas de Programação

✔Abstração X Implementação

Mar/97 Beauclair 5

Algoritmo X Implementação X Programa

✔O que são e quais as diferenças entre:– Algoritmo ?

– Implementação ?

– Programa ?

✔O que é Metodologia ?

✔E Metodologia de programação ?

Mar/97 Beauclair 6

Nivelamento

✔Técnicas de Programação– Programação Não-Estruturada

– Programação Procedimental (ou Procedural)

– Programação Estruturada (ou Modular)

– Programação Orientada à Objetos• Modelo de Eventos

• Callbacks

Mar/97 Beauclair 7

Programação Não-Estruturada

✔Programas simples e pequenos consistindode apenas um programa principal.– Ex. Cartão

✔“Programa” é uma seqüência de comandosou instruções que modificam dados“globais” durante toda a sua execução.

Mar/97 Beauclair 8

Como melhorar este modelo de programação ?

– Extração de seqüências (procedures)

Programação Não-Estruturada

Main Program

Data

Program

Mar/97 Beauclair 9

Programação Procedimental

✔Um programa é visto como uma seqüênciade procedimentos que se “comunicam”através de dados locais, denominadosparâmetros.

✔O fluxo destes dados pode ser ilustradocomo um grafo hierárquico ou uma árvore.

Mar/97 Beauclair 10

Programação Procedimental

Main program

procedure

Mar/97 Beauclair 11

Programação Procedimental

Main programData

Procedure 1 Procedure 2 Procedure 3

Procedure 4

Mar/97 Beauclair 12

Programação Procedimental

✔Desta forma, temos um único programa queé dividido em pequenas partes, chamadas“procedures”. Para permitir o uso deprocedimentos genéricos ou grupo deprocedimentos em outros programas,precisamos separá-los e disponibilizá-los.

Grupo de procedures → módulos / estruturas

Mar/97 Beauclair 13

Programação Estruturada

✔ Um programa não consiste mais de uma única parte em umúnico arquivo. É agora dividido em várias pequenas parteschamados módulos, que interagem, através de chamadasaos procedimentos, formando o programa.

✔ Cada módulo pode ter seus próprios dados. Isto permiteque cada módulo gerencie estruturas de dados internas, quesão modificadas pelas chamadas aos procedimentos.

✔ Entretanto, só existe um estrutura por módulo e cadamódulo só pode existir uma única vez no programa.

Mar/97 Beauclair 14

Programação Estruturada

Main programData

Module 1Data + Data 1

Module 2Data + Data 2

Procedure 1 Procedure 1 Procedure 2

Mar/97 Beauclair 15

Programação Estruturada

✔Exemplo:– Programas que usam estruturas de dados para

armazenar eficientemente os dados (listas,árvores, matrizes, filas, etc.)

– Cada uma destas estruturas de dados podem sercaracterizadas pela sua “estrutura” e/ou pelosseus métodos de acesso.

Mar/97 Beauclair 16

Programação Estruturada

Problema: Implementar um módulo genéricopara manipulação de listas encadeadas.– Definição da interface (API)

• o que está “disponível” - deve esconder “todos” osaspectos de implementação.

– Implementação

dados dados dados dados

Mar/97 Beauclair 17

Programação Estruturada

/* *** interface definition *** */

boolean list_initialize ();

boolean list_append (ANY data);

boolean list_delete ();

void list_end ();

ANY list_get_first ();

ANY list_get_next ();

boolean list_is_empty ();

Mar/97 Beauclair 18

Programação Estruturada

✔Exemplo de uso:ANY data;

...

data ← list_get_first();

while (data is valid) do

do_something (data);

data ← list_get_next();

end

Mar/97 Beauclair 19

Programação Estruturada

✔Problema:

E para se manipular mais de uma lista ?!?

Mar/97 Beauclair 20

Programação Estruturada

/* *** interface definition *** */

declare type LIST_HANDLE;

LIST_HANDLE list_create ();

void list_destroy (LIST_HANDLE this);

boolean list_append (LIST_HANDLE this, ANY data);

ANY list_get_first (LIST_HANDLE this);

ANY list_get_next (LIST_HANDLE this);

boolean list_is_empty (LIST_HANDLE this);

Mar/97 Beauclair 21

Programação Estruturada

✔Agora, podemos criar “objetos” do tipo“lista”, cada um unicamente identificadospor um “handle”, cujos procedimentos(métodos) operam em função deste“handle”.

✔Mas … ainda existem alguns problemas!

Mar/97 Beauclair 22

Programação Estruturada

✔Criação e Destruição Explícita

procedure foo ()

begin

LIST_HANDLE my_list;

my_list ← list_create ();

… /* do something with my_list */

list_destroy (my_list);

end

Mar/97 Beauclair 23

Programação Estruturada

✔Ora, quando se usa variáveis, não se precisa“criá-las” e “destruí-las”. Então, porqueprecisamos fazer isto com as listas ?

Procedure foo ()

begin

LIST_HANDLE my_list;

… /* do something with my_list */

end

Mar/97 Beauclair 24

Programação Estruturada

✔ Não acoplar dados com operações !

✔ Módulos são agrupados por operações comuns,tais como as “list_operations” do exemploanterior. Usa-se então estas operações, passando-se os dados, explicitamente, como parâmetros.

✔ Esta abordagem resulta numa estrutura “orientadaà operações”. Podemos até dizer que as operaçõesespecificam ou definem os dados a serem usados.

Mar/97 Beauclair 25

Programação Orientada a Objetos

✔ Na Orientação a Objetos, a estrutura é organizadapelos dados. Escolhe-se a representação dos dadosque melhor se adequam aos requisitos doproblema.

✔ Consequentemente, os programas ficamestruturados pelos dados e não pelas operações.Isto significa que os dados apenas especificarãooperações válidas. Agora os módulos serãoagrupados por dados e suas representações,denominadas classes.

Mar/97 Beauclair 26

Programação Estruturada

✔OOPS! Dados Errados.Procedure foo() begin

data_type data1;

other_type data2;

list_handle my_list;

. . .

my_list ← list_create();

list_append (my_list, data1);

list_append (my_list, data2); /* OOPS! */

list_destroy (my_list);

end

Mar/97 Beauclair 27

Programação Estruturada

✔ É nossa responsabilidade assegurar que a lista éconsistente. Uma possível solução é adicionarinformações a respeito do tipo de cada elementoda lista.

✔ No entanto, o que realmente queremos é ummecanismo que nos permita especificar qual o tipodos dados a ser manipulado na lista, mantendo asmesmas funções. Ou seja, uma lista que armazenenúmeros, carros, maças ou pessoas, tem asmesmas operações.

Mar/97 Beauclair 28

Programação Orientada a Objetos

✔Em OO existe o conceito de “template”, que“casa” as operações com os dados.

✔Exemplo:– LIST_HANDLE <cars> list1; /* lista de carros */

– LIST_HANDLE <people> list1; /* lista de pessoas */

Mar/97 Beauclair 29

Programação Orientada a Objetos

✔Cada objeto “implementa”seus própriosmódulos e dados, permitindo que váriasestruturas coexistam.

✔Cada objeto é responsável por inicializar edestruir os seus dados. Consequentemente,não existe mais a necessidade de explicitaruma chamada aos procedimentos de criaçãoe destruição.

Mar/97 Beauclair 30

Programação Orientada a Objetos

✔Interação de Objetos

Objeto 2Data

Objeto 1Data

Objeto 4DataObjeto 3

Data

Mar/97 Beauclair 31

Implementação de Tipos Abstratos

1 - int i, j, k;

2 - i = 1;

3 - j = 2;

4 - k = i + j;

Mar/97 Beauclair 32

Implementação de Tipos Abstratos

1 - int i, j, k;Para cada instância, uma operação inicial deverá ser

chamada (construtor). No exemplo, isto é feitointernamente pelo compilador, que reserva amemória necessária para o armazenamento denúmeros inteiros e o associa a um nome (binding).Assim, podemos nos referir a “i ” significando umaárea da memória que guarda um valor de númerointeiro que foi “construída” pela definição de “i ”.Opcionamente, o compilador pode inicializar estaárea de memória, por exemplo, com o valor zero.

Mar/97 Beauclair 33

Implementação de Tipos Abstratos

2 - i = 1;

3 - j = 2;

Atribui o valor “1” a variável “i ”. Realiza a operação deatribuição do argumento “1” ao inteiro instanciado por“i ”. Idem para “j ”. Ou seja,

i.set(1);

j.set(2);

Mar/97 Beauclair 34

Implementação de Tipos Abstratos

✔Dois níveis de representação:– Nível dos tipos abstratos de dados:

• Expressamos tudo que é feito com uma instância dotipo abstrato por chamadas a operações pré-definidas.

– Nível de implementação:• Uma representação é escolhida para a operação.

• Por exemplo, em C a implementação da operação“set ” é feita pelo símbolo “=”. Entretanto, em Pascala implementação é feita pelo símbolo “:= ”.

Mar/97 Beauclair 35

Implementação de Tipos Abstratos

4 - k = i + j;

i.add(j);

k.set(i.add(j));

Mar/97 Beauclair 36

Classe

✔É a implementação (representação) de umtipo abstrato de dados. Define atributos emétodos que implementam a estrutura dedados e as operações dos tipos abstratos dedados, respectivamente.

✔Consequentemente, as “classes” definem aspropriedades e o comportamento dosconjuntos de objetos.

Mar/97 Beauclair 37

Classe

class Integer {

// implementação da estrutura de dadosatributos:

int i;

// operações do tipo abstrato de dadosmétodos:

void setValue (int n);

Integer addValue (Integer j);

};

Mar/97 Beauclair 38

Objetos

✔ Um “objeto” é uma instância de uma classe.

✔ Deve ser univocamente identificado pelo seu “nome” edefinir um “estado” que é representado pelos valores dosatributos ao longo do tempo.

✔ O estado dos objetos mudam de acordo com os métodosque lhe são aplicados. Esta seqüência de trocas de estadodefinem o “comportamento” dos objetos.

✔ Assim, O comportamento de um objeto é definido peloconjunto de métodos que podem ser utilizados.

Mar/97 Beauclair 39

Classes e Objetos

✔ Dois grandes conceitos da Orientação por Objetos:Classes e Objetos.

✔ Programar Orientado por Objetos é, portanto, aimplementação de tipos abstratos de dados, ou,simplesmente, a definição de classes.

✔ Assim, em tempo de execução, as instâncias dasclasses, ou seja, os objetos, resolvem o problemapela troca dos seus estados. Conseqüentemente,podemos pensar no programa como uma coleçãode objetos.

Mar/97 Beauclair 40

Pergunta:

Como estes objetos interagem ???

Mar/97 Beauclair 41

Mensagens

✔Um programa OO em execução é naverdade um repositório em que objetos sãocriados, interagem entre si e então sãodestruídos.

✔Esta interação é baseada em “mensagens”que são enviadas de um objeto para outroque indica qual método deve ser aplicado.

Mar/97 Beauclair 42

Mensagens

Integer i; // define um novo objeto

i.setValue(1); // atribui o valor “ 1”

A mensagem “aplique o método setValue com o argumento“1” a si mesmo” é enviado ao objeto “i ”. Note que “enviarmensagem” ao objeto “i ” é simplesmente representado por“.”. Assim, enviar mensagens aos objetos é muito similaras chamadas de procedimentos da programação tradicional.

Mar/97 Beauclair 43

Mensagens

✔ Entretanto, em OO existe uma visão de objetosautônomos que se comunicam pela troca demensagens. Os objetos reagem quando recebemmensagens aplicando-se os métodos.

✔ Uma mensagem é uma solicitação para um objetoexecutar um de seus métodos. A mensagem deveconter o nome e os argumentos do método.

Mar/97 Beauclair 44

Exemplo

Como o computador exibe um

caracter que você digita ??

Mar/97 Beauclair 45

Procedimental

Wait until a key is pressed

get a key value

write key value at cursor position

advance cursor position

Desta forma, fica difícil distinguir entidadesque definirão as propriedades e oscomportamentos.

Mar/97 Beauclair 46

Orientado por Objetos

Objeto tecla Objeto tela

Mensagem que indica queo estado deve ser trocado

para “pressionado”

Mensagem com o código da tecla pressionada

Mensagem para exibir a imagem da

tecla pressionada

Mar/97 Beauclair 47

Exercícios

✔Descreva as seguintes tarefas nas formasprocedimental e na forma OO– ver TV

– comprar um refrigerante na cantina

✔Qual a diferença entre mensagem echamadas a procedimentos ?

✔Identifique os objetos e as mensagens nocontexto da Internet.

Parte 2

Programação (básica)

Orientada a Objetos

Mar/97 Beauclair 49

Histórico

✔Linguagens de Programação

✔OOP

✔C++

Mar/97 Beauclair 50

Linguagens de Programação

linguagens de programação

objetos ? não ⇒ linguagens convencionais

classes ? não ⇒ linguagens com objetos

herança ? não ⇒ linguagens com classes

concorrência ? não ⇒ OOP

OOP concorrente

Mar/97 Beauclair 51

Histórico de OOP

1966 - Dahl & Nygaar Simula

1972 - Kay Smalltalk

1978 - Ingalls

1983 - Goldberg & Robson Smalltalk 80

1985 - Stroustrup C++

1985 - Hewitt Actor

1987 - Yonezawa & Tokoro Parallel OOP

Mar/97 Beauclair 52

Histórico de C++✔ Desenvolvida inicialmente por Bjarne Stroustrup na AT&T -

Bell Laboratories no início dos anos 80.

– Primeira versão comercial 1985

– Primeiras versões eram tradutores

✔ Concebida como extensão do C, mantém todas as facilidades dasua antecessora com o acréscimo da capacidade de permitir aprogramação orientada por objetos.

✔ O C++ pode ser utilizado como um C melhorado, umalinguagem orientada a objetos ou como uma junção das duas.

Mar/97 Beauclair 53

Relacionamento entre C e C++

CLASSES DERIVADAS

CLASSES

C

FRIEND FUNCTIONS

C++

Mar/97 Beauclair 54

Características de OOP

✔Conceitos

✔Programação Tradicional x OOP

✔Ciclo de Vida do Software OOP

Mar/97 Beauclair 55

Conceitos da OOP

✔A programação orientada por objetos (OOP- Object Oriented Programming) baseia-sena construção de programas através dajunção de abstrações de tipos.

✔Um tipo abstrato é composto por dados epelas funções que podem atuar sobre estesdados.

Mar/97 Beauclair 56

Conceitos da OOP✔ A OOP permite a visualização de conceitos como

uma variedade de objetos. Pode-se representar ainteração, as tarefas a serem executadas equaisquer condições que devem ser observadasentre os objetos.

✔ As classes podem conter objetos intimamenterelacionados que compartilham atributos. Umaclasse define as propriedades e os atributos quedescrevem as ações de um objeto pertencentesàquela classe.

Mar/97 Beauclair 57

Programação tradicional versus OOP

✔Programação tradicional– subrotinas e funções formam o programa

– usuário das subrotinas deve conhecer estrutura de dados

– modificações em uma subrotina podem alterar outras

– adaptação de subrotinas para atender a outrosproblemas semelhantes

– difícil manutenção

Mar/97 Beauclair 58

Programação tradicional versus OOP

✔OOP– programa é formado pela junção de tipos abstratos

– não há necessidade do usuário saber a estrutura interna(dados) do tipo abstrato

– alteração interna de um tipo abstrato não altera outros

– fácil manutenção

– “reusabilidade”

Mar/97 Beauclair 59

Programação tradicional versus OOP

tipos abstratos

operação que pode atuarsobre estes tipos

ativar um método

classe ⇒objeto ⇒

⇒ classe

⇒ método

⇒ enviar mensagem

dados + funções

variável de uma classe

Mar/97 Beauclair 60

Programação tradicional versus OOP

struct x class x

dados variável dados variável

funções

funções

Em C++ os dados e as funções fazem parte daclasse e estão intimamente ligados, o quenão ocorre em C.

Mar/97 Beauclair 61

Ciclo de Vida de Software OOmodelo requisitos

mundo real do usuário

requisitos informais

análise dos

requisitos

modelo descritivo biblioteca de

projeto e componentes

construção reutilizáveis

redes de classes

modelo abstração e

conceitual generalização

Mar/97 Beauclair 62

Terminologia

✔Encapsulamento

✔Hierarquia de classes

✔Herança

✔Polimorfismo

✔Funções Virtuais– Definições e Exemplos

Mar/97 Beauclair 63

Encapsulamento✔ Encapsulamento diz respeiro a forma de definição dos

objetos

✔ Em OOP, uma classe é composta de várias seções:

– PRIVADA: é usada para definir a estrutura do tipo dedado;

– PÚBLICA: é usada para as informações de interfaceque tornam a classe reutilizável dentro dos aplicativos;

– PROTEGIDA: é usada para isolar os detalhesfuncionais de objeto externo a classe.

Mar/97 Beauclair 64

Hierarquia de Classes

✔ As classes servem como um padrão para a criaçãode objetos. Os objetos são ocorrências da classe.

✔ Pode-se desenvolver uma hierarquia de classe emque há uma classe-raiz e diversas subclasses ouclasses derivadas.

✔ As classes-raiz representam as tarefas maisgeneralizadas enquanto as subclasses recebemtarefas mais específicas.

Mar/97 Beauclair 65

Herança

✔ Classes derivadas (filhos) herdam todas ascaracterística de seus ancestrais (variáveis efunções) e podem possuir suas próprias.

✔ Classes raiz ou base (pais) devem ser o maisgenéricas possíveis, deixando para seus filhos oque for específico. Com isto, é possível a criaçãode classes altamente sofisticadas sem grandeesforço, já que boa parte do que elas devem fazerjá foi feito por seus “pais”.

Mar/97 Beauclair 66

Herança: Vantagem

Permite um grande reaproveitamento declasses já existentes e testadas, tornando odesenvolvimento de programas mais fácil,mais rápido e mais confiável.

Mar/97 Beauclair 67

Herança simples✔ Novos tipos abstratos, ou classes, podem também ser

criados a partir de outros já existentes.

SHQD�GH�DoR SHQD�GH�RXUR

WLQWHLUR HVIHURJUiILFD

FDQHWD

Mar/97 Beauclair 68

Herança simples

tiposabstratosde dados

subtipos

conceitos

classes classeherança

implementação

Mar/97 Beauclair 69

Herança simples

parte derivada(herdada de X)

parte incremental(código novo

específico de Y)

(herda de)

X (classe base)

Y (classe derivada)

Mar/97 Beauclair 70

Herança: ExemploUtilizaremos o seguinte esquema: #include <stdio.h>

class base

{

protected:

int a;

public:

void set (int i)

{ a = i; }

void printf ()

{ printf (“a = %d\n”, a); }

void get (int &i)

{ i = a; }

void titulo (char *s)

{ printf (“%s \n”, s); }

};

base

deriv1

deriv2

Mar/97 Beauclair 71

Herança: Exemploclass deriv1 : public base

{

protected:

int b;

public:

void set (int i, int j)

{ base :: set (i); b = j; }

void print ( )

{

base :: printf ();

printf (“b = %d\n”, b);

}

void get (int &i, int &j)

{ base :: get (i); j = b; }

};

class deriv2 : public deriv1

{

protected:

int b;

public:

void set (int i, int j, int k)

{ deriv1 :: set (i, j); c = k; }

void print ( )

{

deriv1 :: printf ();

printf (“c = %d\n”, c);

}

void get (int &i, int &j, int &k)

{ deriv1 :: get (i, j); k = c; }

};

Mar/97 Beauclair 72

Herança: Exemplovoid main ( )

{

deriv2 d2;

int i, j, k;

d2.set (1, 2, 3);

d2.titulo (“Teste de deriv 2:”);

d2.print ();

d2.get (i, j, k);

printf (“get: “);

printf (“%d %d %d\n”, i, j, k);

}

Resultados do programa:

Teste de deriv2:

a = 1

b = 2

c = 3

get: 1 2 3

Mar/97 Beauclair 73

Herança múltipla✔ Uma classe pode se tornar “pai” de outras classes e várias

classes podem compor uma nova classe.

carro barco

FDUUR�DQILELR

Mar/97 Beauclair 74

Herança múltipla: ExemploUsaremos o seguinte esquema:

soma mult subt divi

calc

Mar/97 Beauclair 75

Herança múltipla: Exemploclass soma

{

private:

float x, y, z;

public:

soma (float a, float b) { x = a; y = b; }

float exec () { return (x + y); }

};

class subt

{

private:

float x, y, z;

public:

subt (float a, float b) { x = a; y = b; }

float exec () { return (x - y); }

};

class mult

{

private:

float x, y, z;

public:

mult (float a, float b) { x = a; y = b; }

float exec () { return (x * y); }

};

class divi

{

private:

float x, y, z;

public:

divi (float a, float b) { x = a; y = b; }

float exec () { return (x / y); }

};

Mar/97 Beauclair 76

Herança múltipla: Exemploclass calc : public soma, public subt,

public mult, public divi

{

private:

float rso, rsu, rmu, rdv;

public:

calc (float a, float b) : soma (a, b), subt (a, b),mult (a, b), divi (a, b)

{ /* nada */ }

void exec ()

{

rso = soma :: exec();

rsu = subt :: exec ();

rmu = mult :: exec ();

rdv = divi :: exec ();

}

void print ()

{

printf (“soma = %.2f\n”, rso);

printf (“subt = %.2f\n”, rsu);

printf (“mult = %.2f\n”, rmu);

printf (“divi = %.2f\n”, rdv);

}

};

Mar/97 Beauclair 77

Herança múltipla: Exemplo

void main ( )

{

calc tudo (10, 2);

tudo.exec ( );

tudo.print ( );

}

Resultados do programa:

soma = 12.00

subt = 8.00

mult = 20.00

divi = 5.00

Mar/97 Beauclair 78

Herança múltipla: ProblemaComo não temos um controle total sobre classes criadas por

outras pessoas e, ainda assim, podemos usá-las comoclasses base, pode ocorrer o seguinte problema:

base

deriv1 deriv2

deriv3

Mar/97 Beauclair 79

Herança múltipla: SoluçãoPare evitar que sejam criadas várias instâncias da classe base,

esta deve ser definida como virtual nas suas derivadas.

class base { ... };

class deriv1 : public virtual base { ... };

class deriv2 : public virtual base { ... };

class deriv3 : public deriv1, public deriv2

{ ... };

Mar/97 Beauclair 80

Ponteiros e herançaQuando temos uma classe base e várias classes derivadas, um ponteiro da

classe base pode receber como valor o endereço de qualquer uma desuas classes derivadas.

class base { ... };

class d1 : public base { ... };

class d2 : public base { ... };

temos:base *b;

d1 a;

d2 c;

b = &a;

b = &c;

Mar/97 Beauclair 81

Polimorfismo

É a característica pela qual uma únicamensagem pode ser enviada a todos osmembros de uma família de classes (pais eseus filhos), cada um deles respondendo deuma forma particular mediante o seupróprio método. O C++ utilizapolimorfismo através do uso de funçõesdenominadas funções virtuais.

Mar/97 Beauclair 82

Polimorfismo: ExemploPara compreendermos melhor o conceito de polimorfismo, vamos supor que

tenhamos uma classe base de nome DESENHO e as classes derivadas RETA,CIRCULO e QUADRADO. Se possuirmos um método Desenhe virtual,podemos ter:

DESENHO *ptr_desenho;

...

ptr_desenho.Desenhe();

Dependendo do objeto apontado no momento, o método Desenhe responderá deforma correta, mesmo que o tipo de “desenho” a ser feito seja diferente.

Mar/97 Beauclair 83

Herança com Polimorfismo: Exemplo✔ Utilizaremos o seguinte esquema: #include <stdio.h>

class base

{

protected:

int a;

public:

base ( ) { a = 0 };

base (int i) { a = i };

virtual void print ( )

{

printf(“base: %d\n”, a);

}

};

base

drv1 drv2 drv3

Mar/97 Beauclair 84

Herança com Polimorfismo: Exemploclass drv1 : public base

{

protected:

int d1;

public:

drv1 ( ) { d1 = 0 };

drv1 (int i, int j) : base (i)

{ d1 = j };

void print ( )

{

base :: print ();

printf(“drv1: %d\n”, d1);

}

};

class drv2 : public base

{

protected:

int d2;

public:

drv2 ( ) { d2 = 0 };

drv2 (int i, int j) : base (i)

{ d2 = j };

void print ( )

{

base :: print ();

printf(“drv2: %d\n”, d2);

}

};

class drv3 : public base{protected: int d3;public: drv3 ( ) { d3 = 0 }; drv3 (int i, int j) : base (i) { d3 = j }; void print ( ) { base :: print (); printf(“drv3: %d\n”, d3); }};

Mar/97 Beauclair 85

Herança com Polimorfismo: Exemplovoid main ()

{

base b (1);

drv1 d1 (10, 20);

drv2 d2 (100, 200);

drv3 d3 (1000, 2000);

base *ptrbase[4];

ptrbase[0] = &b;

ptrbase[1] = &d1;

ptrbase[2] = &d2;

ptrbase[3] = &d3;

for (int i = 0; i < 4; i++)

ptrbase[i] -> print ();

};

Resultados do programa:

base: 1

base: 10

drv1: 20

base: 100

drv2: 200

base: 1000

drv3: 2000

Mar/97 Beauclair 86

Herança com Polimorfismo: Exemplo

E assim, como fica ?

base

drv1

drv2

drv3

Mar/97 Beauclair 87

Funções Virtuais✔ Estão intimamente associadas ao conceito de polimorfismo.

✔ As funções virtuais são definidas na classe-raiz quando asclasses derivadas subseqüentes “sobrecarregam” a funçãoredefinindo a sua implementação.

✔ São métodos especiais de classes base públicas e podem serativadas através de ponteiros ou referências.

✔ A seleção e ativação de uma determinada função virtual é feitadurante a execução do programa e não em tempo de link-edição,como ocorre com funções normais.

Mar/97 Beauclair 88

Funções Virtuais

✔ Uma das vantagens das classes é a sua habilidadede esconder dados. Entretanto, as friend functionspermitem o compartilhamento de informações daclasse privada com funções não-membro.

✔ As friend functions, que não são definidas naprópria classe, podem compartilhar os mesmosrecursos de classe que as funções-membro, aomesmo tempo que permanecem externas àdefinição de classe.

Mar/97 Beauclair 89

Funções Virtuais: sobrecargaclass absoluto {

public:

int ab (int);

double ab (double);

};

int absoluto::ab(int val1) {

int temp;

temp = abs(val1);

return(temp);

}

double absoluto::ab (double val2) {

double temp;

temp = fabs(val2);

return(temp);

}

void main ( )

{

absoluto número;

cout << “O valor absoluto é “

<< numero.ab (-123)

<< endl;

cout << “O valor absoluto é “

<< numero.ab (-123.4567)

<< endl;

return;

}

Mar/97 Beauclair 90

Funções Virtuais: friend#include <stdio.h>

class teste

{

private:

int x;

public:

void set (int a) { x = a; }

friend void print (teste&);

};

void print (teste& v)

{

printf (“%d”, v.x); // friend

}

void main ( )

{

teste a;

a.set (10);

print (a);

}

Mar/97 Beauclair 91

Polimorfismo e Funções Virtuais: Exemplo

✔ Utilizaremos o seguinte esquema: #include <stdio.h>

class base

{

protected:

int dado;

public:

base (int a) { dado = a; };

virtual void print (char *msg)

{

printf(“base: %s e %d\n”, msg, dado);

}

};

drv1*

base*

drv2

drv3* drv4 drv5

Mar/97 Beauclair 92

Polimorfismo e Funções Virtuais: Exemplo

class drv1 : public base

{

public:

drv1 (int a) : base (a) { }

virtual void print (char *msg)

{ printf(“drv1: %s e %d\n”, msg, dado); }

};

class drv3 : public drv1

{

public:

drv3 (int a) : drv1 (a) { }

void print (char *msg)

{ printf(“drv3: %s e %d\n”, msg, dado); }

};

class drv2 : public base

{

public:

drv2 (int a) : base (a) { }

};

class drv4 : public drv1

{

public:

drv4 (int a) : drv1 (a) { }

};

class drv5 : public drv2

{

public:

drv5 (int a) : drv2 (a) { }

};

Mar/97 Beauclair 93

Polimorfismo e Funções Virtuais: Exemplo

void main ()

{

base b (1);

drv1 d1 (10);

drv2 d2 (100);

drv3 d3 (1000);

drv4 d4 (10000);

drv5 d5 (15000);

printf (“Objetos:\n”);

b.print (“objeto tipo base”);

d1.print (“objeto tipo drv1”);

d2.print (“objeto tipo drv2”);

d3.print (“objeto tipo drv3”);

d4.print (“objeto tipo drv4”);

d5.print (“objeto tipo drv5”);

}

Resultados do programa:

Objetos:

base: objeto tipo base e 1

drv1: objeto tipo drv1 e 10

base: objeto tipo drv2 e 100

drv3: objeto tipo drv3 e 1000

drv1: objeto tipo drv4 e 10000

base: objeto tipo drv5 e 15000

Parte 3

Metodologia de Desenvolvimento

de Programas Orientados a Objetos

Mar/97 Beauclair 95

Desenvolvimento de Programas OO

✔Diferença entre desenvolvimento deprogramação tradicional e OO

✔Abstração

✔Proteção dos dados

✔Construtores e Destrutores

✔Construção de métodos

✔Compilação em OOP

Mar/97 Beauclair 96

Diferença entre desenvolvimento comprogramação tradicional e com OO

Tradicional:

✔ visão de programação orientada à procedimentos

✔ o programa descreve uma série de passos a serem executados

OOP:

✔ visão de programação orientada a objetos

✔ o programa descreve um sistema de objetos interagindo

✔ conceito chave :

– abstração: processo de ignorar os detalhes, de forma a seconcentrar nas características essenciais

Mar/97 Beauclair 97

Tipos de AbstraçãoAbstração nos procedimentos:

– permite ignorar detalhes sobre os processos

– projeta-se o sistema em função de operações lógicas, ao invésde instruções específicas da linguagem de programação

Abstração nos dados:

– permite ignorar detalhes de como os dados são representados

– sempre envolvem algum grau de abstração nosprocedimentos

Mar/97 Beauclair 98

Abstração

Problema:

É possível declarar estruturas de dados sem sedeclarar as funções necessárias para se usá-las.As linguagens de programação tradicionaispermitem que se tenha abstração deprocedimentos e abstração de dados como duastécnicas distintas, quando de fato elas estãototalmente interligadas.

Mar/97 Beauclair 99

Abstração

Solução:

Uso da principal propriedade das classes:

– O usuário vê um objeto em termos dasoperações que podem ser realizadas, não emtermos da sua estrutura de dados.

Mar/97 Beauclair 100

Abstração em Linguagens OO

Linguagens OO combinam abstração de dados eabstração de procedimentos.

✔ Quando se define uma classe, descreve-se tudo sobre umaentidade de alto nível.

✔ Quando se usa um objeto desta classe, pode-se ignorar ostipos construídos contidos na classe e os procedimentosusados para manipulá-los.

Mar/97 Beauclair 101

Exemplo: polígonoDefinição:

– série de pontos, armazenados como uma série de paresde números.

No entanto, um polígono é mais que uma série de pontos. Umpolígono tem:

– perímetro, área e forma característica.

– pode-se querer mover, rodar, refletir, ...

– dado dois polígonos, pode-se querer achar as suasinterseções ou sua união, ou testar se são iguais.

Mar/97 Beauclair 102

Exemplo: estrutura tipo pilhaVamos supor que seja necessário que criemos uma estrutura

tipo pilha. Isto pode ser feito de várias maneiras, porémnem todas são eficientes quanto a integridade dos dados.

A maneira mais simples seria criando uma estrutura quecontivesse um vetor para os dados da pilha e uma variávelque fornecesse o local (índice) para inserir ou retirar umdado.

Para o acesso, seriam criadas as funções push para inserir epop para retirar. O usuário deveria criar uma variável dotipo pilha e utilizar as funções push e pop.

Mar/97 Beauclair 103

Exemplo: estrutura tipo pilha#include <stdio.h>

#include <stdlib.h>

#define MAX 100

/* Tipo Abstrato */

typedef struct _pilha {

int v[MAX];

int topo;

} Pilha;

/* Protótipos */

void push (Pilha *p, int dado);int pop (Pilha *p);

Mar/97 Beauclair 104

Exemplo: estrutura tipo pilhavoid push (Pilha *p, int dado)

{

if (p->topo >= MAX)

{

printf(“Pilha cheia.\n”);

exit(1);

}

p->v[p->topo] = dado;

p->topo++;

}

int pop (Pilha *p)

{

p->topo--;

if (p->topo < 0)

{

printf(“Pilha vazia.\n”);

exit(1);

}

return (p->v[p->topo]);

}

Mar/97 Beauclair 105

Exemplo: estrutura tipo pilhavoid main ( )

{

static Pilha p;

int i;

for (i = 0; i < 10; i++)

push (&p, i);

for (i = 0; i < 10; i++)

printf (“%d\n”, pop (&p));

}

Mar/97 Beauclair 106

Problema:Apesar de funcionar, esta é a pior forma possível em termos

de proteção de dados, pois nada impediria que alguém que“sabe o que está fazendo”, utilizasse instruções do tipo:

p.topo = 5; ou p.v[10] = 7;

ou algo pior.

Mar/97 Beauclair 107

Solução 1: Usando structA forma mais simples de classe em

C++ é a estrutura (struct).

Entretanto, a struct não possui, emprincípio, a proteção necessáriaaos dados.

Para exemplificar a criação de umaclasse usando struct, criaremos aseguir o tipo ou “classe”PILHA .

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

const int MAX = 100;

struct PILHA

{

// dados

char v [MAX];

int topo;

Mar/97 Beauclair 108

Solução 1: Usando struct// operações (métodos)

void cria ()

{ topo = 0; }

void push (char c)

{

if (topo >= MAX)

{

printf(“Pilha cheia.\n”);

exit(1);

}

v [topo++] = c;

}

char pop ()

{

topo--;

if (topo < 0)

{

printf(“Pilha vazia.\n”);

exit(1);

}

return (v [topo] );

}

}; // fim da struct PILHA

Mar/97 Beauclair 109

Solução 1: Usando structvoid main ()

{

PILHA p1, p2;

static char str1[] =

{“Exemplo da classe PILHA”};

static char str2[] =

{ “Uma string qualquer”};

int i;

// coloca ponteiros no início

p1.cria ();

p2.cria ();

printf (“Strings originais:\n”);

printf (“%s\n”, str1);

printf (“%s\n”, str2);

// armazena primeira string

int tam1 = strlen(str1);

for (i = 0; i < tam1; i++)

p1.push (str1[i]);

// armazena segunda string

int tam2 = strlen(str2);

for (i = 0; i < tam2; i++)

p2.push (str2[i]);

Mar/97 Beauclair 110

Solução 1: Usando struct// retira strings

printf (“\nStrings invertidas:\n”);

for (i = 0; i < tam1; i++)

printf (“%c”, p1.pop());

printf(“\n”);

for (i = 0; i < tam2; i++)

printf (“%c”, p2.pop());

printf(“\n”);

}

Resultados do programa:

Strings originais:

Exemplo da classe PILHA

Uma string qualquer

Strings invertidas:

AHLIP essalc ad olpmexE

reuqlauq gnirts amU

Mar/97 Beauclair 111

public, private e protectedA palavra-chave public, indica que o acesso aos membros que

estiverem abaixo é livre, enquanto a private indica que elessão privados, somente podendo ser acessados pelosmétodos da classe. O protected indica que os dados sópodem ser acessados pelos métodos da classe e pormétodos de classes derivadas (herança). A diferençabásica entre private e protected é que se os membros foremdeclarados como protected, as classes derivadas poderãoutilizar estes membros com se fossem seus, o que nãoocorre quando estes forem declarados como private.

Mar/97 Beauclair 112

Solução 2: Usando classstruct PILHA

{

// dados

private:

char v [MAX];

int tam;

int topo;

// operações (métodos)

public:

void cria () { ... }

void push ( char c ) { ... }

int pop () { ... }

};

class PILHA

{

// dados

private:

char v [MAX];

int tam;

int topo;

// operações (métodos)

public:

void cria () { ... }

void push ( char c ) { ... }

int pop () { ... }

};

Mar/97 Beauclair 113

Construtores e DestrutoresSão métodos especiais das classes e possuem características

interessantes:

– o construtor tem o nome da sua classe e é ativadosempre que declararmos um objeto da classe.

– o destrutor tem o nome da classe com o caracter “~” nafrente e é ativado sempre que termina o escopo de umobjeto da classe.

Quando uma classe não possui estes métodos especiais,apenas é criada a área correspondente ao tamanho dosdados.

Mar/97 Beauclair 114

Construtores e Destrutores: Exemplo#include <stdio.h>

#include <stdlib.h>

#include <string.h>

const int MAX = 1000;

class PILHA

{

private:

char *v;

int tam;

int topo;

public:

// construtor sem parâmetro

PILHA ()

{

printf(“Ativou Construtor 1\n”);

topo = 0;

tam = MAX;

v = new char[MAX];

}

// construtor com parâmetro

PILHA (int t)

{

printf(“Ativou Construtor 2\n”);

topo = 0;

tam = t;

v = new char[t];

}

Mar/97 Beauclair 115

Construtores e Destrutores: Exemplo~PILHA ()

{

printf (“Ativou destrutor\n”);

delete v;

}

void push (char c)

{

if (topo >= tam)

{

printf (“Pilha cheia.\n”);

exit (1);

}

v [topo++] = c;

}

char pop ()

{

topo--;

if (topo < 0)

{

printf(“Pilha vazia.\n”);

exit(1);

}

return (v[topo]);

}

};

Mar/97 Beauclair 116

Construtores e Destrutores: Exemplovoid main ()

{

PILHA p1, p2 (100);

static char str1[] =

{“Exemplo da classe PILHA”);

static char str2[] =

{“Uma string qualquer”};

printf (“Strings originais:\n”);

printf (“%s\n”, str1);

printf (“%s\n”, str2);

// armazena primeira string

int tam1 = strlen(str1);

for (i = 0; i < tam1; i++)

p1.push (str1[i]);

// armazena segunda string

int tam2 = strlen(str2);

for (i = 0; i < tam2; i++)

p2.push (str2[i]);

// retira strings

printf (“\nStrings invertidas:\n”);

for (i = 0; i < tam1; i++)

printf (“%c”, p1.pop());

printf(“\n”);

for (i = 0; i < tam2; i++)

printf (“%c”, p2.pop());

printf(“\n”);

}

Mar/97 Beauclair 117

Construtores e Destrutores: ExemploResultados do programa:

Ativou Construtor 1

Ativou Construtor 2

Strings originais:

Exemplo da classe PILHA

Uma string qualquer

Strings invertidas:

AHLIP essalc ad olpmexE

reuqlauq gnirts amU

Ativou destrutor

Ativou destrutor

Mar/97 Beauclair 118

Construção de métodosOs métodos que vimos até o momento são inline, isto é, não

são funções verdadeiras. Entretanto é útil que se separe adefinição da classe da sua implementação.

Desta forma, é possível se criar uma biblioteca de classes e ousuário necessitará apenas incluir o header de definição daclasse para a compilação e utilizar a biblioteca de classesdurante a link-edição.

A outra vantagem, é a possibilidade de proteger a classe deolhos alheios.

Mar/97 Beauclair 119

pilha.hpp#ifndef PILHA_HPP

#define PILHA_HPP

const int MAX = 1000;

class PILHA

{

private:

char *v;

int topo;

int MaxTam;

public:

// construtor sem parâmetros

PILHA ( );

// construtor com parâmetros

PILHA (int tam);

// destrutor

~PILHA ( );

void push (char c);

char pop ( );

};

#endif

Mar/97 Beauclair 120

pilha.cpp#include “pilha.hpp”

PILHA::PILHA ()

{

topo = 0;

v = new char[MAX];

MaxTam = MAX;

}

PILHA::PILHA (int tam)

{

topo = 0;

v = new char[tam];

MaxTam = tam;

}

PILHA::~PILHA ()

{

delete v;

}

void PILHA::push (char c)

{

if (topo >= MaxTam)

{

printf(“Pilha cheia.\n”);

exit(1);

}

v[topo++] = c;

}

char PILHA::pop () { topo --; if (topo < 0) { printf(“Pilha Vazia.\n”); exit(1); } return(v[topo]); }

Parte 4

Detalhamento da Metodologia

Mar/97 Beauclair 122

Metodologia de Programação OO

✔Identificação das classes

✔Determinação dos atributos e ações

✔Determinação dos relacionamentos

✔Determinação das hierarquias

Mar/97 Beauclair 123

Metodologia de Programação OO

Programação estruturada: Top-Down

– Especificar as funções do programa

• “O que este programa deve fazer ?”

• Definição das rotinas principais

• Detalhamento por refinamentos sucessivos

O programa é tratado como uma descrição de processos,que são divididos em sub-processos.

Mar/97 Beauclair 124

Metodologia de Programação OO

Visão Abstrata

Visão Detalhada

Mar/97 Beauclair 125

Metodologia de Programação OO

Programação OO:

– NÃO analise o programa em termos de processos outarefas;

– NÃO descreva-o pensando nas estruturas de dados;

– Analise o programa como um Sistema de ObjetosInteragindo.

O que são os objetos ?

Quais são as entidades ativas do programa ?

Mar/97 Beauclair 126

Metodologia de Programação OO

Visão AbstrataSuper Classe

Visão DetalhadaSub-Classes

ERRADO !top-down

Mar/97 Beauclair 127

Metodologia de Programação OO

Visão DetalhadaSub-Classes

Visão GlobalSuper Classe

ERRADO !bottom-up

Mar/97 Beauclair 128

Metodologia de Programação OO

Programação em OO envolve ambos os níveis de abstração,trabalhando com top-down e bottom-up.

Programação em OO envolve:

– Identificar as classes

– Determinar atributos e ações

– Determinar relacionamentos entre as classes

– Arrumar as classes em uma forma hierárquica

Mar/97 Beauclair 129

Metodologia de Programação OO

identificar asclasses

determinaratributos e ações

determinarrelacionamentos

determinarhierarquias

é um processo iterativo !

Mar/97 Beauclair 130

Identificação das Classes

Determinar as classes que um programa necessita émais difícil que identificar uma função principal.

Não se pode simplesmente fazer uma decomposiçãodos procedimentos do problema, esperando-seobter tipos estruturados ou estruturas de dadospara convertê-los em classes.

As classes tem que ser o princípio básico, asentidades ativas do programa.

Mar/97 Beauclair 131

Identificação das Classes✔ Uma boa técnica para identificação de classes é escrever

uma descrição dos propósitos do programa, listando todosos substantivos que aparecem na descrição e escolher asclasses desta lista.

O sucesso desta abordagem simples depende de como equão boa está a descrição escrita, mas pode dar boasidéias para os iniciantes em OO.

Mar/97 Beauclair 132

Identificação das Classes✔ Utilizar os modelos físicos dos objetos.

Exemplo 1: reserva de acentos em aviões

• classe aeronave

• classe passageiro

Exemplo 2: sistema operacional

• classe processos (programas, interrupções, etc.)

• classe dispositivos (discos, impressora, etc.)

Mar/97 Beauclair 133

Identificação das Classes✔ Utilizar as entidades conceituais que o programa irá

manipular.

Exemplos:

• programa de desenho– classe retângulo, classe círculo, ...

• compilador– classe sintaxe, ???

• sistema operacional– classe processos, classe dispositivos, ???

Mar/97 Beauclair 134

Identificação das Classes✔ Classes menos óbvias:

– Eventos

• fatos que podem acontecer com os objetos

– Interações

• fatos que podem acontecer entre os objetos

Exemplo: banco

classe transações para representar fatos comodepósitos, empréstimos, transferências, etc.

Mar/97 Beauclair 135

Determinação dos Atributos e Ações

✔ Determine as responsabilidades de cada classe.

– A informação que um objeto de cada classe tem quemanter.

O que um objeto desta classe tem que saber ?

– As operações que um objeto pode efetuar ou o que podeser feito com ele.

O que este objeto pode fazer ?

O que podemos fazer com este objeto ?

Mar/97 Beauclair 136

Determinação dos Atributos e Ações

Toda classe tem atributos. São as propriedades oucaracterísticas que a descrevem.

classe retângulo: altura e largura

classe cursor: forma

classe arquivo: nome, modo de acesso e posição

Importante: Não confundir atributos e classes. Não se devedefinir um classe para descrever um atributo.

Mar/97 Beauclair 137

Determinação dos Atributos e Ações

Toda classe tem um comportamento, que diz como um objetointerage com outros objetos (ações) e como seus atributosmudam durante esta interação.

– O fato de se determinar atributos e ações dão uma idéiaclara do que constitui uma classe útil.

– Ter o cuidado de não se criar classes que não fazemnada além do que “encapsular” processos.

– Determinar quais atributos vão ser guardados e quaisvão ser calculados quando necessários.

Mar/97 Beauclair 138

Determinação dos Relacionamentos

É uma extensão da etapa anterior (determinar ascaracterísticas de cada classe). Determinar como as classesvão usar outras classes.

Algumas classes podem existir independentemente, outrasnão. Algumas vezes, uma classe é depende de outra classepois não tem utilidade alguma, a menos que a outra classeexista. Isto é necessário quando uma classe executa umafunção membro de outra classe.

Uma classe pode estar “embutida” em outra classe,significando que contém objetos de outra classe.

Mar/97 Beauclair 139

Determinação dos Relacionamentos

Exemplos:

A classe Hora necessita de uma função que faça aconversão para um objeto string. Esta função chamauma função da classe String.

Um objeto círculo necessita de um objeto ponto pararepresentar o seu centro, da mesma forma que necessitade um número inteiro para representar o seu raio(composição).

Mar/97 Beauclair 140

Determinação de Hierarquias

É uma extensão da primeira etapa (identificação das classes)mas necessita da informação obtida durante as demaisetapas.

Exemplos:

– classe Conta_Bancária

• classe Conta_Corrente e classe Poupança

– classe Carro

• tipo de carro é um atributo e não uma classe

Mar/97 Beauclair 141

Composição e HerançaTanto composição como herança permitem que uma classe

use o código de outra classe.

Entretanto, composição deve ser usada quando a definição deuma classe tem outra classe, enquanto herança deve serusada quando uma classe é um tipo de outra classe.

– Um círculo não é um tipo de ponto; um círculo tem umponto para definir o seu centro.

– Um dado numérico não contém um dado genérico; umdado numérico é um tipo de dado.

Mar/97 Beauclair 142

Compilação em C++✔ Os programas em C++ podem ser gerados de duas formas:

✔ fonte C++ fonte C++

tradutor

fonte C

compilador

objeto

link

executável

Mar/97 Beauclair 143

Um Exemplo Completo

Because a user caninteract with onlyone window at atime, whetherscorlling or enteringtext, you need a wayto specify whichwindow receivesinput. That windowsis the active window.Olny one window

Because a user can interactwith only one window at atime, whether scorlling orentering text, you need a wayto specify which windowreceives input. That windowsis the active window. Olnyone window can be active atany given time.

Mar/97 Beauclair 144

Um Exemplo Completo✔ Identificação das classes

– uma classe óbvia: classe Win, onde cada window é umobjeto.

– uma classe para as interações com o usuário, tais comoteclado, mouse, etc. : classe Event, que passará aoobjeto win um objeto event, para realizar uma açãocorrespondente.

– uma classe candidata: classe WinMgr, para que se possadeterminar para qual objeto win um objeto event deveser enviado.

Mar/97 Beauclair 145

Um Exemplo Completo✔ Identificação das classes (continuação)

– como o programa irá manipular posições, é convenienterepresentá-las através de uma classe, ao invés de umpar de inteiros: classe Point

– o programa irá manipular janelas que terão a formaretangular. Assim, é razoável que também tenhamos aclasse Rect.

Mar/97 Beauclair 146

Um Exemplo Completo✔ Determinação dos atributos e ações

Objeto WinMgr

– guardar a posição dos objetos win

– manter uma ordem dos objetos win, através de umapilha, de forma que o objeto win que está no alto dapilha seja o objeto ativo

– refazer a pilha quando o usuário desejar que outroobjeto win seja ativado

Mar/97 Beauclair 147

Um Exemplo Completo✔ Determinação dos atributos e ações

Objeto WinMgr

– guardar a posição dos objetos win

– manter uma ordem dos objetos win, através de umapilha, de forma que o objeto win que está no alto dapilha seja o objeto ativo

– refazer a pilha quando o usuário desejar que outroobjeto win seja ativado

Mar/97 Beauclair 148

Um Exemplo Completo✔ Determinação dos atributos e ações

Objeto Win

– guardar a sua posição e tamanho

– guardar o texto que deve exibir, estando visível ouinvisível pelo uso de scroll-bars

– guardar a posição absoluta do texto exibido

– exibir o texto

– responder aos movimentos de cursor e mouse

Mar/97 Beauclair 149

Um Exemplo Completo✔ Determinação dos atributos e ações

Objeto Scroll-Bar

– guardar a sua posição e tamanho

– guardar a posição relativa do texto exibido

– exibir texto

– responder aos movimentos de cursor e mouse

Mar/97 Beauclair 150

Um Exemplo CompletoPode-se notar várias similaridades entre o objeto win e o

objeto scroll-bar: eles sabem seus tamanhos e posição,exibem informações e podem responder a interações com ousuário.

Ou seja, este comportamento comum aponta para a criação deuma classe base, fazendo com que as classes Win e Scroll-Bar sejam classes derivadas. Esta nova classe, representaráa área de interação com o usuário com uma entidadelógica.

Mar/97 Beauclair 151

Um Exemplo Completo✔ Determinação dos atributos e ações

Objeto Interactor

– guardar a sua posição e tamanho

– guardar a posição relativa do texto exibido

– exibir texto

– responder aos movimentos de cursor e mouse

Mar/97 Beauclair 152

Um Exemplo Completo✔ Determinação da hierarquia

Apesar de prematuro, já conseguimos determinar umahierarquia de classes. Falta verificar se esta hierarquia semanterá no decorrer do desenvolvimento.

Interactor

Scroll-Bar Win

Mar/97 Beauclair 153

Um Exemplo Completo✔ Determinação dos atributos e ações

Objeto Event

– determinar qual tecla foi pressionada (se teclado)

– determinar qual o estado dos botões e a posição domouse (se mouse)

– informar o que determinou

Mar/97 Beauclair 154

Um Exemplo Completo✔ Determinação da hierarquia

Uma vez que esta classe possui dois tipos que parecem nãoter nada em comum, é interessante derivá-las de umaclasse abstrata.

Event

Keyboard Mouse

Mar/97 Beauclair 155

Um Exemplo Completo✔ Determinação dos relacionamentos

Uma window pode ter, ou não, uma scroll-bar. Istorepresenta um relacionamento, onde uma windowcontém uma scroll-bar como um objeto membro. Win,consequentemente, usa scroll-bar.

A interação entre windows e scroll-bar requer duasformas de comunicação, uma vez que usando-se ascroll-bar afetamos a window e, movendo o cursor nawindow, afetamos a scroll-bar. Scroll-bar precisa saberda interface de win para se comunicar.

Mar/97 Beauclair 156

Um Exemplo Completo✔ Determinação dos relacionamentos (continuação)

Events são passados aos Interactors. Então, Interactortem que ter uma função membro capaz de receber umobjeto Event. Interactor usa Event.

WinMgr manipula objetos Win. Como podemos ter umnúmero arbitrário de Wins, não os podemos ter comoobjetos membro. Ao invés disso, faremos com queWinMgr consiga inserir ou deletar objetos Win.WinMgr também usa Event, que são então passadospara as Win.

Mar/97 Beauclair 157

Relacionamentos

contémusa

usa

contém comunica com

usa

WinMgr

Event Win

Scroll-Bar

Mar/97 Beauclair 158

Um Exemplo CompletoNeste momento, as hierarquias são muito simples, não

necessitando de nenhuma reestruturação.

Entretanto, é necessário decidir quais característicaspertencerão as classes bases e quais pertencerão as classesderivadas. Isto requer uma análise mais detalhada arespeito dos atributos e ações de cada classe. Para talanálise, inicia-se a definição das interfaces das classes, ouseja, o que será public, private ou protected.

Mar/97 Beauclair 159

classe Interactorclass Interactor

{

public:

int width ();

int height ();

Point origin ();

int withinBounds (Point pos);

virtual void paint () = 0;

virtual void handleEvent (Event &action) = 0;

protected:

Rect area;

};

Mar/97 Beauclair 160

classe Winclass Win : public Interactor

{ private:

public: ScrollBar *Hscroller;

int paint (); ScrollBar *Vscroller;

int handleEvent (Event &action); char *textBuffer;

void setchar (Point pos, char newchar); int textrows, textcolumns;

char retchar (Point pos); Point position;

void putstr (Point pos, char *newstr); Point cursorPos;

int rows (); char *title;

int columns (); };

void setTitle (char *newtitle);

Mar/97 Beauclair 161

classe Win: ProblemasÉ muita informação para somente uma classe.

É fácil notar que existem vários atributos que pertencem aotexto colocado na classe Win, não pertencendopropriamente ao objeto window.

– Dito isso, é interessante se criar uma nova classe queguarde o texto e incluí-la como membro da classe Win.

Mar/97 Beauclair 162

classe Winclass Win : public Interactor

{

public:

void paint ();

void handleEvent (Event &action);

void setTitle (char *newtitle);

private:

ScrollBar *Hscroller, *Vscroller;

Buffer canvas;

Point position; // Posição relativa do texto visível

Point cursorPos;

char *title;

};

Mar/97 Beauclair 163

classe Bufferclass Buffer

{

public:

int rows ();

int columns ();

Point origin ();

void setchar (Point pos, char *newchar);

char retchar (Point pos);

void putstr (Point pos, char *newstr);

private:

int width, length;

char *textArray;

};

Mar/97 Beauclair 164

classe ScrollBarclass ScrollBar : public Interactor

{

public:

void paint ();

void handleEvent (Event &action);

void setSlider (int pos);

private:

Win *parentWin;

int sliderPos;

int orientation; // Horizontal ou Vertical

};

Mar/97 Beauclair 165

classe WinMgrclass WinMgr

{

public:

void handleEvent (Event &action);

void addWindow (Win *newWindow);

void deleteWindow ();

void repaint();

private:

List winList; // classe já definida para manipulação de listas

};

Mar/97 Beauclair 166

classe Eventclass Event

{

public:

virtual EventType getType () = 0;

};

Uma vez que não existe nenhum tipo associado com o objetogenérico Event, a função getType é declarada como virtual.Cada classe derivada rescreve getType para retornar umaconstante de identificação.

Mar/97 Beauclair 167

classe KbdEventclass KbdEvent : public Event

{

public:

EventType getType () { return KBD_EVENT; }unsigned int val ();

private:

char ascii;

char scancode;

};

Mar/97 Beauclair 168

classe MouseEventclass MouseEvent : public Event

{

public:

EventType getType () { return MOUSE_EVENT; }Point getPosition ();

int getButton ();

private:

Point pos;

int buttons;

};

Mar/97 Beauclair 169

classe ScrollEventclass ScrollEvent : public Event

{

public:

EventType getType () { return SCROLL_EVENT; }int getDirection ();

int getDistance ();

ScrollBar *getSource ();

private:

int direction;

int distance;

ScrollBar *source;

};

Mar/97 Beauclair 170

Manipulação de Eventosvoid Win :: handleEvent (Event &action)

{

switch ( action.getType () )

{

case KBD_EVENT:

KbdEvent &keyAction = (KbdEvent &) action;

// executa o que for relativo à tecla pressionada

case MOUSE_EVENT:

MouseEvent &keyAction = (MouseEvent &) action;

// ...

case SCROLL_EVENT:

ScrollEvent &keyAction = (ScrollEvent &) action;

// ...

}

}

Mar/97 Beauclair 171

BibliografiaObject Orientation: Concepts, Languages, Databases and Interfaces

Setrag Khoshafian and Razmik Abnous

John Wiley & Sons, Inc. - 1990

An Introduction to Object-Oriented Programming an C++

Richard S. Wiener and Lewis J. Pinson

Addison-Wesley Publishing Company - 1988

Object-Oriented Environment in C++

David Hu

MIS Press - 1990

Mar/97 Beauclair 172

BibliografiaC++ Programming

John Thomas Berry

Howard W. Sams & Company - 1989

C++ Tutorial

Microsoft Group

Microsoft Corporation - 1991

Borland C++

Chris H. Pappas and William H. Murray

Makron Books - 1995