II- Padrão ODMG
Object Definifion Language - ODL
II.1 O Modelo de
Objeto
Conceitos
Classe
Interface
[Atributo]
[Relacionam.]
[Atributo]
[Assinatura de
Método]
[Chave]
[Assinatura de
Método]
Repositório
[Herança]
[Herança]
Classe e Interface
• Toda classe é concreta
– Repositório é o único elemento
obrigatório
• Toda interface é abstrata
– Classe abstrata (UML)
Atributo Coleção
• Uma coleção pode ser set, bag, list, array
– Um conjunto (set) tem elementos desordenados,
e somente uma ocorrência de cada elemento
– Um bag permite mais de uma ocorrência de um
elemento, mas as ocorrências ainda são
desordenadas
– Uma lista (list) permite mais de uma ocorrência
de um elemento, mas as ocorrências são
ordenadas
– Um array é uma lista com tamanho máximo prédeterminado
Ordem
Repetição Tamanho
Set
Bag

List


Array



• {1, 2, 1} e {2, 1, 1} são um mesmo bag
• {1, 2, 1} e {2, 1, 1} não são a mesma
lista
Relacionamento
• Relacionamentos são entre classes e
binários
– Dois objetos de classes diferentes ou da
mesma classe são associados de alguma
forma
– Explicitamente representados por um
par de referências inversas
Método
• Somente assinatura de métodos (nome do
método, parâmetros, exceções) é conceito
do modelo
– O corpo de um método pode ser implementado
usando qualquer linguagem de programação OO
(Java, C++, PL/SQL etc)
• Métodos do tipo get_atributo()
(métodos observer) e do tipo
set_atributo() (métodos mutator) são
implicitamente definidos
Chave
• Uma classe pode ter uma ou mais
chaves (key(s))
• Uma chave pode também ser definida
por um relacionamento ou um método
– Um relacionamento ou um método podem
fazer parte de uma chave composta
Repositório
• A toda classe, deve ser definido um
repositório (extent)
Herança
• Uma classe pode herdar de uma única
classe (class extends class)
• Uma classe pode herdar de múltiplas
interfaces (class implements
interface)
• Uma forma limitada de herança
múltipla
–
Uma classe e várias interfaces
Omissões do Modelo
• Não tem o conceito de relacionamento
agregação / composição
• Não tem o conceito de relacionamento
ternário
• Não tem o conceito de método de classe
– Não é propriamente um defeito!
• Conceito limitado de herança múltipla
• Não tem o conceito de classe de associação
II.2 A Linguagem ODL
• Interface
interface Métodos_Filme
{
float duração_em_horas()
raises(duração não encontrada)
/* converte duração em min para duração em hh:min */;
nomes_estrelas(out Set<Estrela>)
/* retorna o conjunto das estrelas de um filme */;
nome_estúdio(out string)
raises (estúdio não encontrado)
/* retorna o nome do estúdio que realizou o filme */;
...
};
Classe
• Classes nativas
–
–
–
–
–
–
–
–
–
Integer
Float
String
Boolean
Date
Enumeration
Struct
Collection
XML
class Filme : Métodos_Filme
(extent Filmes key (título, ano))
{
attribute string título;
attribute integer ano;
attribute integer duração;
attribute enumeration Cor{colorido, preto-e-branco}
corfilme;
relationship Set<Estrela> estrelado_por
inverse Estrela::estrelou_em;
relationship Estúdio realizado_por inverse
Estúdio::realizou;
}
• A classe Filme podia ter sido definida
sem a interface, isto é, com todos os
métodos definidos dentro da classe
class Estrela : Métodos_Estrela
(extent Estrelas key nome)
{
attribute string nome;
attribute Struct
End {string rua, string cidade} endereço;
relationship Set<Filme> estrelou_em
inverse Filme::estrelado_por;
}
class Estúdio : Métodos_Estúdio
(extent Estúdios key nome)
{
attribute string nome;
attribute Estrela::End endereço;
relationship Set<Filme> realizou inverse
Filme::realizado_por;
}
• Pergunta: A estrutura End poderia
ser definida como uma interface?
Como?
Atributo Coleção
• Attribute Bag<tipo_do_elemento>
atrib
• Attribute List<tipo_do_elemento>
atrib
• Attribute Array<tipo_do_elem, N>
atrib
Atributo versus
Relacionamento
•
•
•
•
•
Attribute List<float> é legal
Relationship List<float> é ilegal
Attribute List<Filme> é ilegal
Relationship List<Filme> é legal
Relationship só pode envolver classe
definida pelo usuário (classe), por
exemplo Relationship List<Filme>
• Attribute só pode envolver classes
nativas
Relacionamento
Ternário?
• Como determinar a multiplicidade de
um relacionamento ternário?
– Agregando duas classes, por vez
• Filme-Estrela, Estúdio
• Filme-Estúdio, Estrela
• Estrela-Estúdio, Filme
– Não conseguimos raciocinar
ternariamente
• Como ODL não oferece relacionamento
ternário, devemos usar uma regra de
transformação 1 relacionamento ternário
 3 relacionamentos binários
– O relacionamento é elevado a classe
• Eventuais perdas de informação
decorrentes da transformação devem ser
supridas com regras de integridade
Filme
Estrela
Contrato
M Valor
N
P
o_estúdio
Estúdio
A chave de Contrato é
Filme-Estrela-Estúdio
• Definição da classe Contrato
Class Contrato
(extent Contratos key (o_filme, a_estrela,
o_estudio))
{
attribute float valor;
relationship Filme o_filme inverse …;
relationship Estrela a_estrela inverse …;
relationship Estudio o_estudio inverse …;
};
• Na classe Filme
Relationship Set<Contrato> contratos
inverse Contrato::o_filme;
• Na classe Estrela
Relationship Set<Contrato> contratos
inverse Contrato::a_estrela;
• Na classe Estúdio
Relationship Set<Contrato> contratos
inverse Contrato::o_estúdio;
• De um modo geral
– Suponha uma relacionamento ternário R
entre as classes C1, C2 e C3. Podemos
substituir R por uma classe C e 3
relacionamentos binários N:1 de C (N)
para cada uma das Ci (1). Os atributos
de C são os atributos do relacionamento
ternário. C também se relaciona com
cada Ci
Herança de Classe
class Des_Animado extends Filme
{...
relationship Set<Estrela> dublado_por;
...};
• Como interpretar o relacionamento
Des_Animado estrelado-por Estrela?
Herança de Classe /
Interface
• Class C2 : I1 : I2 : I3 extends C1
– Uma forma limitada de herança múltipla
Regras de Integridade
• Chave. Dado o conjunto de atributoschave de uma classe, não pode haver
dois objetos da classe com o mesmo
valor da chave, e o valor da chave
deve ser obrigatoriamente informado,
quando da criação do objeto
• Valor opcional. Todos os
atributos/relacionamentos de uma classe
que não são chave são opcionais, isto é,
seus valores não precisam ser
obrigatoriamente informados. Cabe aos
projetistas definir como indicar que o valor
de um atributo não é informado
– enumeration Cor{preto_e_branco, colorido, null}
corfilme
– integer duração /* um valor negativo informa
que a duração de um objeto da classe Filme não
é informada */
• Par de Referências Inversas. Garante
que, se um objeto x de uma classe A
aponta para um objeto y de uma
classe B  A e B não
necessariamente diferentes  então
y aponta para x, e y não apontará
para nenhum objeto da classe A que
não aponte para ele. O par de
referências inversas permite a
correta navegação de A para B, e de
B para A
• Integridade Referencial. A única
forma de garantir integridade
referencial é definindo pares de
referências inversas. A garantia é
restrita: se dois objetos apontam um
para o outro (ciclo), nenhum dos dois
pode ser destruído individualmente,
pois romperia o ciclo; a única
possibilidade é a destruição dos dois
‘ao mesmo tempo’ (dentro de uma
transação)
• Integridade de domínio. Classes nativas e
classes definidas pelo usuário
• Regras Gerais. ODL não tem nada como
uma linguagem de definição de regras
gerais de integridade (por exemplo,
"salário maior que o mínimo", "um gerente
não pode ganhar menos que seus
subordinados", etc). As regras de
integridade devem ser embutidas, pelos
projetistas, nos corpos dos métodos
construtores
Exercícios
• Suponha que conceitualmente você
tem um array, mas o modelo lógico
objeto-relacional só oferece o tipo
tabela, que é um bag ou um conjunto.
Explique como você simularia o array
como um bag ou um conjunto
• Dado um pedido de compra
Código
Cliente
Data_emissão Data_entrega
Linha Item Quantidade Total Parcial
xx
xxx
xx
xx.xxx,xx
xx
xxx
xx
xx.xxx,xx
...
xx
xxx
xx
xx.xxx,xx
Total Geral: xxx.xxx,xx
definir a classe ODL PedidoDeCompra
• Descreva em ODL a classe
Empregado, com os atributos
matricula, nome, salario e gerente. A
classe deve ter obrigatoriamente um
método que encontra a matrícula, o
nome e o salário do gerente de um
empregado
• Considere o seguinte diagrama
UML
Imagine que A é Fornecedor, B é Produto,
e Associação é Fornecimento. Descreva este
diagrama de classes em ODL. Este exercício serve
para mostrar que Classe Associação é um conceito
dispensável, ou não essencial
• Crie uma classe-ODL, Calendário, fazendo
observar as particularidades dos
ambientes onde um calendário é aplicado.
Exemplos:
– Calendário comercial - Dias úteis: de segunda a
sexta, menos os feriados;
– Calendário hospitalar - Dias úteis: todos os
dias;
– Calendário escolar - de segunda a sexta, menos
os feriados, e eventualmente sábado; exceções:
todo o mês de janeiro e todo o mês de julho
• Defina a classe Pessoa, incluindo a
árvore genealógica
Download

bag