Академический Документы
Профессиональный Документы
Культура Документы
Agenda
Nivelamento Histrico Caractersticas da OOP Terminologia
Definies e Exemplos
Parte 1
Conceitos bsicos
Nivelamento
Programa X Algoritmo X Implementao Tcnicas de Programao Abstrao X Implementao
Mar/97
Beauclair
Nivelamento
Tcnicas de Programao
Programao No-Estruturada Programao Procedimental (ou Procedural) Programao Estruturada (ou Modular) Programao Orientada Objetos
Modelo de Eventos Callbacks
Mar/97
Beauclair
Programao No-Estruturada
Programas simples e pequenos consistindo de apenas um programa principal.
Ex. Carto
Programa uma seqncia de comandos ou instrues que modificam dados globais durante toda a sua execuo.
Mar/97 Beauclair 7
Programao No-Estruturada
Program Main Program Data
Programao Procedimental
Um programa visto como uma seqncia de procedimentos que se comunicam atravs de dados locais, denominados parmetros. O fluxo destes dados pode ser ilustrado como um grafo hierrquico ou uma rvore.
Mar/97
Beauclair
Programao Procedimental
Main program procedure
Mar/97
Beauclair
10
Programao Procedimental
Main program Data
Procedure 1
Procedure 2
Procedure 3
Procedure 4
Mar/97 Beauclair 11
Programao Procedimental
Desta forma, temos um nico programa que dividido em pequenas partes, chamadas procedures. Para permitir o uso de procedimentos genricos ou grupo de procedimentos em outros programas, precisamos separ-los e disponibiliz-los. Grupo de procedures mdulos / estruturas
Mar/97 Beauclair 12
Programao Estruturada
Um programa no consiste mais de uma nica parte em um nico arquivo. agora dividido em vrias pequenas partes chamados mdulos, que interagem, atravs de chamadas aos procedimentos, formando o programa. Cada mdulo pode ter seus prprios dados. Isto permite que cada mdulo gerencie estruturas de dados internas, que so modificadas pelas chamadas aos procedimentos. Entretanto, s existe um estrutura por mdulo e cada mdulo s pode existir uma nica vez no programa.
Mar/97
Beauclair
13
Programao Estruturada
Main program Data
Mar/97
Beauclair
14
Programao 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 ser caracterizadas pela sua estrutura e/ou pelos seus mtodos de acesso.
Mar/97
Beauclair
15
Programao Estruturada
dados dados dados dados
Implementao
Mar/97 Beauclair 16
Programao 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 17
Programao 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 18
Programao Estruturada
Problema: E para se manipular mais de uma lista ?!?
Mar/97
Beauclair
19
Programao 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
20
Programao Estruturada
Agora, podemos criar objetos do tipo lista, cada um unicamente identificados por um handle, cujos procedimentos (mtodos) operam em funo deste handle. Mas ainda existem alguns problemas!
Mar/97
Beauclair
21
Programao Estruturada
Criao e Destruio Explcita
procedure foo () begin LIST_HANDLE my_list; my_list list_create (); /* do something with my_list */ list_destroy (my_list); end
Mar/97 Beauclair 22
Programao Estruturada
Ora, quando se usa variveis, no se precisa cri-las e destru-las. Ento, porque precisamos fazer isto com as listas ?
Procedure foo () begin LIST_HANDLE my_list; /* do something with my_list */ end
Mar/97 Beauclair 23
Programao Estruturada
No acoplar dados com operaes ! Mdulos so agrupados por operaes comuns, tais como as list_operations do exemplo anterior. Usa-se ento estas operaes, passandose os dados, explicitamente, como parmetros. Esta abordagem resulta numa estrutura orientada operaes. Podemos at dizer que as operaes especificam ou definem os dados a serem usados.
Mar/97 Beauclair 24
Programao 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); list_destroy (my_list); end
Mar/97 Beauclair
/* OOPS! */
26
Programao Estruturada
nossa responsabilidade assegurar que a lista consistente. Uma possvel soluo adicionar informaes a respeito do tipo de cada elemento da lista. No entanto, o que realmente queremos um mecanismo que nos permita especificar qual o tipo dos dados a ser manipulado na lista, mantendo as mesmas funes. Ou seja, uma lista que armazene nmeros, carros, maas ou pessoas, tem as mesmas operaes.
Mar/97 Beauclair 27
Mar/97
Beauclair
28
Objeto 3 Data
Mar/97 Beauclair
Objeto 4 Data
30
Mar/97
Beauclair
31
i.set(1); j.set(2);
Mar/97 Beauclair 33
Nvel de implementao:
Uma representao escolhida para a operao. Por exemplo, em C a implementao da operao set feita pelo smbolo =. Entretanto, em Pascal a implementao feita pelo smbolo :=.
Mar/97 Beauclair 34
i.add(j); k.set(i.add(j));
Mar/97
Beauclair
35
Classe
a implementao (representao) de um tipo abstrato de dados. Define atributos e mtodos que implementam a estrutura de dados e as operaes dos tipos abstratos de dados, respectivamente. Consequentemente, as classes definem as propriedades e o comportamento dos conjuntos de objetos.
Mar/97 Beauclair 36
Classe
class Integer { // implementao da estrutura de dados atributos: int i; // operaes do tipo abstrato de dados mtodos: void setValue (int n); Integer addValue (Integer j); };
Mar/97 Beauclair 37
Objetos
Um objeto uma instncia de uma classe. Deve ser univocamente identificado pelo seu nome e definir um estado que representado pelos valores dos atributos ao longo do tempo. O estado dos objetos mudam de acordo com os mtodos que lhe so aplicados. Esta seqncia de trocas de estado definem o comportamento dos objetos. Assim, O comportamento de um objeto definido pelo conjunto de mtodos que podem ser utilizados.
Mar/97
Beauclair
38
Classes e Objetos
Dois grandes conceitos da Orientao por Objetos: Classes e Objetos. Programar Orientado por Objetos , portanto, a implementao de tipos abstratos de dados, ou, simplesmente, a definio de classes. Assim, em tempo de execuo, as instncias das classes, ou seja, os objetos, resolvem o problema pela troca dos seus estados. Conseqentemente, podemos pensar no programa como uma coleo de objetos. Mar/97 Beauclair 39
Pergunta:
Mar/97
Beauclair
40
Mensagens
Um programa OO em execuo na verdade um repositrio em que objetos so criados, interagem entre si e ento so destrudos. Esta interao baseada em mensagens que so enviadas de um objeto para outro que indica qual mtodo deve ser aplicado.
Mar/97 Beauclair 41
Mensagens
Integer i; // define um novo objeto i.setValue(1); // atribui o valor 1 A mensagem aplique o mtodo setValue com o argumento 1 a si mesmo enviado ao objeto i. Note que enviar mensagem ao objeto i simplesmente representado por .. Assim, enviar mensagens aos objetos muito similar as chamadas de procedimentos da programao tradicional.
Mar/97
Beauclair
42
Mensagens
Entretanto, em OO existe uma viso de objetos autnomos que se comunicam pela troca de mensagens. Os objetos reagem quando recebem mensagens aplicando-se os mtodos. Uma mensagem uma solicitao para um objeto executar um de seus mtodos. A mensagem deve conter o nome e os argumentos do mtodo.
Mar/97
Beauclair
43
Exemplo
Mar/97
Beauclair
44
Procedimental
Wait until a key is pressed get a key value write key value at cursor position advance cursor position
Desta forma, fica difcil distinguir entidades que definiro as propriedades e os comportamentos.
Mar/97 Beauclair 45
Objeto tela
46
Exerccios
Descreva as seguintes tarefas nas formas procedimental e na forma OO
ver TV comprar um refrigerante na cantina
Qual a diferena entre mensagem e chamadas a procedimentos ? Identifique os objetos e as mensagens no contexto da Internet.
Mar/97 Beauclair 47
Parte 2
Programao (bsica) Orientada a Objetos
Histrico
Linguagens de Programao OOP C++
Mar/97 Beauclair 49
Linguagens de Programao
linguagens de programao objetos ? classes ? herana ? concorrncia ? OOP concorrente
Mar/97 Beauclair 50
no no no no
Histrico de OOP
1966 - Dahl & Nygaar 1972 - Kay 1978 - Ingalls 1983 - Goldberg & Robson 1985 - Stroustrup 1985 - Hewitt 1987 - Yonezawa & Tokoro Simula Smalltalk Smalltalk 80 C++ Actor Parallel OOP
Mar/97
Beauclair
51
Histrico de C++
Desenvolvida inicialmente por Bjarne Stroustrup na AT&T Bell Laboratories no incio dos anos 80. Primeira verso comercial 1985 Primeiras verses eram tradutores Concebida como extenso do C, mantm todas as facilidades da sua antecessora com o acrscimo da capacidade de permitir a programao orientada por objetos. O C++ pode ser utilizado como um C melhorado, uma linguagem orientada a objetos ou como uma juno das duas.
Mar/97
Beauclair
52
C CLASSES
C++
FRIEND FUNCTIONS
Mar/97
Beauclair
53
Caractersticas de OOP
Conceitos Programao Tradicional x OOP Ciclo de Vida do Software OOP
Mar/97 Beauclair 54
Conceitos da OOP
A programao orientada por objetos (OOP - Object Oriented Programming) baseia-se na construo de programas atravs da juno de abstraes de tipos. Um tipo abstrato composto por dados e pelas funes que podem atuar sobre estes dados.
Mar/97 Beauclair 55
Conceitos da OOP
A OOP permite a visualizao de conceitos como uma variedade de objetos. Pode-se representar a interao, as tarefas a serem executadas e quaisquer condies que devem ser observadas entre os objetos. As classes podem conter objetos intimamente relacionados que compartilham atributos. Uma classe define as propriedades e os atributos que descrevem as aes de um objeto pertencentes quela classe.
Mar/97 Beauclair 56
Mar/97
Beauclair
57
Mar/97
Beauclair
58
Mar/97
Beauclair
59
Em C++ os dados e as funes fazem parte da classe e esto intimamente ligados, o que no ocorre em C.
Mar/97 Beauclair 60
modelo conceitual
Mar/97
61
Terminologia
Encapsulamento Hierarquia de classes Herana Polimorfismo Funes Virtuais
Definies e Exemplos
Mar/97
Beauclair
62
Encapsulamento
Encapsulamento diz respeiro a forma de definio dos objetos Em OOP, uma classe composta de vrias sees: PRIVADA: usada para definir a estrutura do tipo de dado; PBLICA: usada para as informaes de interface que tornam a classe reutilizvel dentro dos aplicativos; PROTEGIDA: usada para isolar os detalhes funcionais de objeto externo a classe.
Mar/97
Beauclair
63
Hierarquia de Classes
As classes servem como um padro para a criao de objetos. Os objetos so ocorrncias da classe. Pode-se desenvolver uma hierarquia de classe em que h uma classe-raiz e diversas subclasses ou classes derivadas. As classes-raiz representam as tarefas mais generalizadas enquanto as subclasses recebem tarefas mais especficas.
Mar/97 Beauclair 64
Herana
Classes derivadas (filhos) herdam todas as caracterstica de seus ancestrais (variveis e funes) e podem possuir suas prprias. Classes raiz ou base (pais) devem ser o mais genricas possveis, deixando para seus filhos o que for especfico. Com isto, possvel a criao de classes altamente sofisticadas sem grande esforo, j que boa parte do que elas devem fazer j foi feito por seus pais.
Mar/97 Beauclair 65
Herana: Vantagem
Permite um grande reaproveitamento de classes j existentes e testadas, tornando o desenvolvimento de programas mais fcil, mais rpido e mais confivel.
Mar/97
Beauclair
66
Herana simples
Novos tipos abstratos, ou classes, podem tambm ser criados a partir de outros j existentes.
FDQHWD WLQWHLUR SHQDGHDoR HVIHURJUiILFD
SHQDGHRXUR
Mar/97
Beauclair
67
Herana simples
conceitos
tipos abstratos de dados subtipos
classes
classe herana
implementao
Mar/97 Beauclair 68
Herana simples
X (classe base)
(herda de) parte derivada (herdada de X) parte incremental (cdigo novo especfico de Y)
Mar/97
Y (classe derivada)
Beauclair
69
Herana: Exemplo
Utilizaremos 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); } }; Beauclair 70
Mar/97
Herana: Exemplo
class 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
71
Herana: Exemplo
void 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
72
Herana mltipla
Uma classe pode se tornar pai de outras classes e vrias classes podem compor uma nova classe.
c a rro
ba rc o
FDUURDQILELR
Mar/97
Beauclair
73
soma
mult
subt
divi
calc
Mar/97
Beauclair
74
Beauclair
76
Mar/97
Beauclair
77
deriv1
deriv2
deriv3
Mar/97 Beauclair 78
Mar/97
Beauclair
79
Ponteiros e herana
Quando temos uma classe base e vrias classes derivadas, um ponteiro da classe base pode receber como valor o endereo de qualquer uma de suas 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 80
Polimorfismo
a caracterstica pela qual uma nica mensagem pode ser enviada a todos os membros de uma famlia de classes (pais e seus filhos), cada um deles respondendo de uma forma particular mediante o seu prprio mtodo. O C++ utiliza polimorfismo atravs do uso de funes denominadas funes virtuais.
Mar/97 Beauclair 81
Polimorfismo: Exemplo
Para 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 mtodo Desenhe virtual, podemos ter: DESENHO *ptr_desenho; ... ptr_desenho.Desenhe(); Dependendo do objeto apontado no momento, o mtodo Desenhe responder de forma correta, mesmo que o tipo de desenho a ser feito seja diferente.
Mar/97
Beauclair
82
base
drv1
drv2
drv3
Mar/97
Beauclair
83
Mar/97
Beauclair
84
drv1
drv3
drv2
Mar/97 Beauclair 86
Funes Virtuais
Esto intimamente associadas ao conceito de polimorfismo. As funes virtuais so definidas na classe-raiz quando as classes derivadas subseqentes sobrecarregam a funo redefinindo a sua implementao. So mtodos especiais de classes base pblicas e podem ser ativadas atravs de ponteiros ou referncias. A seleo e ativao de uma determinada funo virtual feita durante a execuo do programa e no em tempo de link-edio, como ocorre com funes normais.
Mar/97
Beauclair
87
Funes Virtuais
Uma das vantagens das classes a sua habilidade de esconder dados. Entretanto, as friend functions permitem o compartilhamento de informaes da classe privada com funes no-membro. As friend functions, que no so definidas na prpria classe, podem compartilhar os mesmos recursos de classe que as funes-membro, ao mesmo tempo que permanecem externas definio de classe.
Mar/97 Beauclair 88
cout
return; }
Beauclair
89
// friend
Mar/97
Beauclair
90
#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); } };
base*
drv1*
drv2
drv3*
drv4
drv5
Mar/97
Beauclair
91
Mar/97
e e e e e e
Beauclair
93
Parte 3
Metodologia de Desenvolvimento de Programas Orientados a Objetos
Desenvolvimento de Programas OO
Diferena entre desenvolvimento de programao tradicional e OO Abstrao Proteo dos dados Construtores e Destrutores Construo de mtodos Compilao em OOP
Mar/97 Beauclair 95
Mar/97
Beauclair
96
Tipos de Abstrao
Abstrao nos procedimentos: permite ignorar detalhes sobre os processos projeta-se o sistema em funo de operaes lgicas, ao invs de instrues especficas da linguagem de programao Abstrao nos dados: permite ignorar detalhes de como os dados so representados sempre envolvem algum grau de abstrao nos procedimentos
Mar/97
Beauclair
97
Abstrao
Problema: possvel declarar estruturas de dados sem se declarar as funes necessrias para se us-las. As linguagens de programao tradicionais permitem que se tenha abstrao de procedimentos e abstrao de dados como duas tcnicas distintas, quando de fato elas esto totalmente interligadas.
Mar/97
Beauclair
98
Abstrao
Soluo: Uso da principal propriedade das classes: O usurio v um objeto em termos das operaes que podem ser realizadas, no em termos da sua estrutura de dados.
Mar/97
Beauclair
99
Abstrao em Linguagens OO
Linguagens OO combinam abstrao de dados e abstrao de procedimentos.
Quando se define uma classe, descreve-se tudo sobre uma entidade de alto nvel. Quando se usa um objeto desta classe, pode-se ignorar os tipos construdos contidos na classe e os procedimentos usados para manipul-los.
Mar/97
Beauclair
100
Exemplo: polgono
Definio: srie de pontos, armazenados como uma srie de pares de nmeros. No entanto, um polgono mais que uma srie de pontos. Um polgono tem: permetro, rea e forma caracterstica. pode-se querer mover, rodar, refletir, ... dado dois polgonos, pode-se querer achar as suas intersees ou sua unio, ou testar se so iguais.
Mar/97 Beauclair 101
Mar/97
Beauclair
103
Mar/97
Beauclair
104
Mar/97
Beauclair
105
Problema:
Apesar de funcionar, esta a pior forma possvel em termos de proteo de dados, pois nada impediria que algum que sabe o que est fazendo, utilizasse instrues do tipo: p.topo = 5; ou ou algo pior. p.v[10] = 7;
Mar/97
Beauclair
106
Mar/97
Beauclair
107
char pop () { topo--; if (topo < 0) { printf(Pilha vazia.\n); exit(1); } return (v [topo] ); } }; // fim da struct PILHA
Beauclair 108
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]);
Beauclair 109
Mar/97
Beauclair
110
class PILHA { // dados private: char v [MAX]; int tam; int topo; // operaes (mtodos) public: void cria () { ... } void push ( char c ) { ... } int pop () { ... } };
Beauclair 112
Construtores e Destrutores
So mtodos especiais das classes e possuem caractersticas interessantes: o construtor tem o nome da sua classe e ativado sempre que declararmos um objeto da classe. o destrutor tem o nome da classe com o caracter ~ na frente e ativado sempre que termina o escopo de um objeto da classe. Quando uma classe no possui estes mtodos especiais, apenas criada a rea correspondente ao tamanho dos dados.
Mar/97 Beauclair 113
Mar/97
Mar/97
Beauclair
115
// 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); }
Beauclair
116
Construo de mtodos
Os mtodos que vimos at o momento so inline, isto , no so funes verdadeiras. Entretanto til que se separe a definio da classe da sua implementao. Desta forma, possvel se criar uma biblioteca de classes e o usurio necessitar apenas incluir o header de definio da classe para a compilao e utilizar a biblioteca de classes durante a link-edio. A outra vantagem, a possibilidade de proteger a classe de olhos alheios.
Mar/97
Beauclair
118
pilha.hpp
#ifndef PILHA_HPP #define PILHA_HPP const int MAX = 1000; class PILHA { private: char *v; int topo; int MaxTam; public: // construtor sem parmetros PILHA ( ); // construtor com parmetros PILHA (int tam); // destrutor ~PILHA ( ); void push (char c); char pop ( ); }; #endif
Beauclair 119
Mar/97
pilha.cpp
PILHA::~PILHA () #include pilha.hpp { PILHA::PILHA () delete v; { } topo = 0; v = new char[MAX]; void PILHA::push (char c) MaxTam = MAX; { } PILHA::PILHA (int tam) if (topo >= MaxTam) { { printf(Pilha cheia.\n); topo = 0; exit(1); v = new char[tam]; } MaxTam = tam; v[topo++] = c; } }
Mar/97 Beauclair
char PILHA::pop () { topo --; if (topo < 0) { printf(Pilha Vazia.\n); exit(1); } return(v[topo]); }
120
Parte 4
Detalhamento da Metodologia
Metodologia de Programao OO
Identificao das classes Determinao dos atributos e aes Determinao dos relacionamentos Determinao das hierarquias
Mar/97
Beauclair
122
Metodologia de Programao OO
Programao estruturada: Top-Down Especificar as funes do programa O que este programa deve fazer ? Definio das rotinas principais Detalhamento por refinamentos sucessivos O programa tratado como uma descrio de processos, que so divididos em sub-processos.
Mar/97 Beauclair 123
Metodologia de Programao OO
Viso Abstrata
Viso Detalhada
Mar/97
Beauclair
124
Metodologia de Programao OO
Programao OO: NO analise o programa em termos de processos ou tarefas; NO descreva-o pensando nas estruturas de dados; Analise o programa como um Sistema de Objetos Interagindo. O que so os objetos ? Quais so as entidades ativas do programa ?
Mar/97
Beauclair
125
Metodologia de Programao OO
ERRADO ! top-down Viso Abstrata Super Classe
Mar/97
Beauclair
126
Metodologia de Programao OO
ERRADO ! bottom-up Viso Detalhada Sub-Classes
Mar/97
Beauclair
127
Metodologia de Programao OO
Programao em OO envolve ambos os nveis de abstrao, trabalhando com top-down e bottom-up. Programao em OO envolve: Identificar as classes Determinar atributos e aes Determinar relacionamentos entre as classes Arrumar as classes em uma forma hierrquica
Mar/97
Beauclair
128
Metodologia de Programao OO
identificar as classes
um processo iterativo !
determinar relacionamentos
determinar hierarquias
Mar/97 Beauclair 129
Mar/97
Beauclair
131
compilador
classe sintaxe, ???
sistema operacional
classe processos, classe dispositivos, ???
Mar/97 Beauclair 133
Mar/97
Beauclair
135
Mar/97
Beauclair
137
Mar/97
Beauclair
139
Determinao de Hierarquias
uma extenso da primeira etapa (identificao das classes) mas necessita da informao obtida durante as demais etapas. Exemplos: classe Conta_Bancria classe Conta_Corrente e classe Poupana classe Carro tipo de carro um atributo e no uma classe
Mar/97 Beauclair 140
Composio e Herana
Tanto composio como herana permitem que uma classe use o cdigo de outra classe. Entretanto, composio deve ser usada quando a definio de uma classe tem outra classe, enquanto herana deve ser usada quando uma classe um tipo de outra classe. Um crculo no um tipo de ponto; um crculo tem um ponto para definir o seu centro. Um dado numrico no contm um dado genrico; um dado numrico um tipo de dado.
Mar/97
Beauclair
141
Compilao em C++
Os programas em C++ podem ser gerados de duas formas:
fonte C++ tradutor fonte C compilador objeto link executvel fonte C++
Mar/97
Beauclair
142
Um Exemplo Completo
Because a user can interact with only one window at a time, whether scorlling or entering text, you need a way to specify which window receives input. That windows is the active window. Olny one window Because a user can interact with only one window at a time, whether scorlling or entering text, you need a way to specify which window receives input. That windows is the active window. Olny one window can be active at any given time.
Mar/97
Beauclair
143
Um Exemplo Completo
Identificao das classes uma classe bvia: classe Win, onde cada window um objeto. uma classe para as interaes com o usurio, tais como teclado, mouse, etc. : classe Event, que passar ao objeto win um objeto event, para realizar uma ao correspondente. uma classe candidata: classe WinMgr, para que se possa determinar para qual objeto win um objeto event deve ser enviado.
Mar/97 Beauclair 144
Um Exemplo Completo
Identificao das classes (continuao) como o programa ir manipular posies, conveniente represent-las atravs de uma classe, ao invs de um par de inteiros: classe Point o programa ir manipular janelas que tero a forma retangular. Assim, razovel que tambm tenhamos a classe Rect.
Mar/97
Beauclair
145
Um Exemplo Completo
Determinao dos atributos e aes Objeto WinMgr guardar a posio dos objetos win manter uma ordem dos objetos win, atravs de uma pilha, de forma que o objeto win que est no alto da pilha seja o objeto ativo refazer a pilha quando o usurio desejar que outro objeto win seja ativado
Mar/97
Beauclair
146
Um Exemplo Completo
Determinao dos atributos e aes Objeto WinMgr guardar a posio dos objetos win manter uma ordem dos objetos win, atravs de uma pilha, de forma que o objeto win que est no alto da pilha seja o objeto ativo refazer a pilha quando o usurio desejar que outro objeto win seja ativado
Mar/97
Beauclair
147
Um Exemplo Completo
Determinao dos atributos e aes Objeto Win guardar a sua posio e tamanho guardar o texto que deve exibir, estando visvel ou invisvel pelo uso de scroll-bars guardar a posio absoluta do texto exibido exibir o texto responder aos movimentos de cursor e mouse
Mar/97
Beauclair
148
Um Exemplo Completo
Determinao dos atributos e aes Objeto Scroll-Bar guardar a sua posio e tamanho guardar a posio relativa do texto exibido exibir texto responder aos movimentos de cursor e mouse
Mar/97
Beauclair
149
Um Exemplo Completo
Pode-se notar vrias similaridades entre o objeto win e o objeto scroll-bar: eles sabem seus tamanhos e posio, exibem informaes e podem responder a interaes com o usurio. Ou seja, este comportamento comum aponta para a criao de uma classe base, fazendo com que as classes Win e ScrollBar sejam classes derivadas. Esta nova classe, representar a rea de interao com o usurio com uma entidade lgica.
Mar/97 Beauclair 150
Um Exemplo Completo
Determinao dos atributos e aes Objeto Interactor guardar a sua posio e tamanho guardar a posio relativa do texto exibido exibir texto responder aos movimentos de cursor e mouse
Mar/97
Beauclair
151
Um Exemplo Completo
Determinao da hierarquia Apesar de prematuro, j conseguimos determinar uma hierarquia de classes. Falta verificar se esta hierarquia se manter no decorrer do desenvolvimento. Interactor
Scroll-Bar
Mar/97 Beauclair
Win
152
Um Exemplo Completo
Determinao dos atributos e aes Objeto Event determinar qual tecla foi pressionada (se teclado) determinar qual o estado dos botes e a posio do mouse (se mouse) informar o que determinou
Mar/97
Beauclair
153
Um Exemplo Completo
Determinao da hierarquia Uma vez que esta classe possui dois tipos que parecem no ter nada em comum, interessante deriv-las de uma classe abstrata. Event
Keyboard
Mar/97 Beauclair
Mouse
154
Um Exemplo Completo
Determinao dos relacionamentos Uma window pode ter, ou no, uma scroll-bar. Isto representa um relacionamento, onde uma window contm uma scroll-bar como um objeto membro. Win, consequentemente, usa scroll-bar. A interao entre windows e scroll-bar requer duas formas de comunicao, uma vez que usando-se a scroll-bar afetamos a window e, movendo o cursor na window, afetamos a scroll-bar. Scroll-bar precisa saber da interface de win para se comunicar.
Mar/97 Beauclair 155
Um Exemplo Completo
Determinao dos relacionamentos (continuao) Events so passados aos Interactors. Ento, Interactor tem que ter uma funo membro capaz de receber um objeto Event. Interactor usa Event. WinMgr manipula objetos Win. Como podemos ter um nmero arbitrrio de Wins, no os podemos ter como objetos membro. Ao invs disso, faremos com que WinMgr consiga inserir ou deletar objetos Win. WinMgr tambm usa Event, que so ento passados para as Win.
Mar/97 Beauclair 156
Relacionamentos
WinMgr
usa usa contm
Event
Win
contm comunica com
usa
Scroll-Bar
Mar/97 Beauclair 157
Um Exemplo Completo
Neste momento, as hierarquias so muito simples, no necessitando de nenhuma reestruturao. Entretanto, necessrio decidir quais caractersticas pertencero as classes bases e quais pertencero as classes derivadas. Isto requer uma anlise mais detalhada a respeito dos atributos e aes de cada classe. Para tal anlise, inicia-se a definio das interfaces das classes, ou seja, o que ser public, private ou protected.
Mar/97
Beauclair
158
classe Interactor
class 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 159
classe Win
class Win : public Interactor { public: int paint (); int handleEvent (Event &action); void setchar (Point pos, char newchar); char retchar (Point pos); void putstr (Point pos, char *newstr); int rows (); int columns (); void setTitle (char *newtitle); private: ScrollBar *Hscroller; ScrollBar *Vscroller; char *textBuffer; int textrows, textcolumns; Point position; Point cursorPos; char *title; };
Mar/97
Beauclair
160
Mar/97
Beauclair
161
classe Win
class Win : public Interactor { public: void paint (); void handleEvent (Event &action); void setTitle (char *newtitle); private: ScrollBar *Hscroller, *Vscroller; Buffer canvas; Point position; // Posio relativa do texto visvel Point cursorPos; char *title; };
Mar/97 Beauclair 162
classe Buffer
class 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 163
classe ScrollBar
class 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
164
classe WinMgr
class WinMgr { public: void handleEvent (Event &action); void addWindow (Win *newWindow); void deleteWindow (); void repaint(); private: List winList; // classe j definida para manipulao de listas };
Mar/97
Beauclair
165
classe Event
class Event { public: virtual EventType getType () = 0; };
Uma vez que no existe nenhum tipo associado com o objeto genrico Event, a funo getType declarada como virtual. Cada classe derivada rescreve getType para retornar uma constante de identificao.
Mar/97
Beauclair
166
classe KbdEvent
class KbdEvent : public Event { public: EventType getType () { return KBD_EVENT; } unsigned int val (); private: char ascii; char scancode; };
Mar/97
Beauclair
167
classe MouseEvent
class MouseEvent : public Event { public: EventType getType () { return MOUSE_EVENT; } Point getPosition (); int getButton (); private: Point pos; int buttons; };
Mar/97
Beauclair
168
classe ScrollEvent
class 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 169
Manipulao de Eventos
void 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 170
Bibliografia
Object 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 171
Bibliografia
C++ 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
Mar/97 Beauclair 172