Aqui nós estávamos no momento
em que a gente tinha definido o exercício,
os requisitos técnicos, então.
Criar uma classe chamada Universidade
que terá como atributo um nome.
Até, na exposição anterior,
a gente saía direto pro código.
Agora a gente sabe que não é assim que funciona a vida.
A gente tem antes que projetar
a coisa, tá.
Como é que eu projeto a classe Universidade em UML.
Bom, eu já exemplifiquei na prática lá
com classes Jogo, Jogador, Inimigo.
Agora eu tô mostrando a classe Universidade
pra você aqui em UML.
É assim que eu faria lá na StarUML, ou em outra ferramenta CASE.
Tá aqui o nome da classe.
Tá aqui o conjunto de atributos,
nesse caso é um conjunto unitário, por ora, pelo menos.
Nome vetor de 30.
Aqui eu fiz ele do jeitão C++, tá,
pra ficar mais compreensível pra vocês,
mas vocês já viram que lá na StarUML
ele exige que você faça
no formato mais pró-UML mesmo
que é mais parecido com Pascal, ou como ALGOL, conforme já dito.
Aqui a construtora, uma destrutora,
set e getNome().
Além da classe Universidade,
que tá aqui modelada, ali implementada,
tem o exercício ali
que é o relacionar a classe Pessoa para com a Universidade.
Cada objeto pessoa poderá ser associado
a um objeto de Universidade.
E aqui tá uma observação técnica, né.
Classe Pessoa terá um ponteiro para um objeto, ou variável, da classe Universidade.
Então, e a gente já tinha esse código, tá.
Tinha feito em aula passada, tá ali, ó,
pUnivFiliado, ponteiro de Universidade
tem o setUnivFiliado(), tem o OndeTrabalho().
Esse código aqui já foi discutido inclusive no finalzinho da última exposição.
Se não tá lembrando bem, para esse vídeo
volta no vídeo anterior e dá uma verificada lá.
Como é que a gente modela a classe Pessoa?
Tá aqui a classe Pessoa.
Todos os atributos dela
Aqui eu já tô modelando a classe Pessoa mais
respeitando mesmo a sintaxe da UML
tem aqui as construtoras, tá, têm duas.
Uma com parâmetro outra sem parâmetro.
Destrutora que é naturalmente sem parâmetro.
Inicializa() tem um conjunto de parâmetros.
Calc_Idade com um conjunto de parâmetros
e outros atributos que eu andei criando.
Aqui eu resolvi, por algum motivo dado,
na minha modelagem colocar um id também.
Tem, então, um set e getId().
Aí eu tenho um informaIdade().
Tenho set e getNome().
Modelei umas coisinhas a mais em relação do que já tinha
Só tem um detalhe, que é bastante pertinente.
Vocês tão vendo que nesse momento aqui
eu não modelei o ponteiro.
Vocês não tão vendo aí o ponteiro de Universidade.
Porque aqui eu tô modelando só a classe Pessoa,
eu não tô modelando ainda
a associação que ela tem...
o relacionamento de associação que ela tem para com Universidade.
Isso eu vou considerar agora na sequência.
Vejam aqui em termos de código,
conforme vocês já sabem lá da Principal,
que eu tenho aqui um exemplo de classe Pessoa que é o objeto Simao.
Perdão, um exemplo de instância de classe Pessoa que é o objeto Simao.
Eu tenho, aqui, um exemplar
de instância da classe Universidade que é o objeto UTFPR.
E, aqui, eu crio uma associação entre...
Perdão, aqui eu crio uma associação,
aqui onde eu tô sublinhando com o mouse,
entre o Simao e a UTFPR,
porque eu passo pro Simao o endereço da UTFPR
a partir da função setUnivFiliado().
Isso, em termos de objetos,
gera o que ocorre ali, a hora que eu executo esse código
eu faço aqui isso, tá. Eu faço que o pUnivFiliado
ele aponte para o endereço da UTFPR.
Aí vocês vejam que isso aqui, ó,
é que esse Diagrama de Cubos aqui.
Eu até posso entender se você quiser como um Diagrama de Objetos da UML.
Em termos de UML, tá,
eles não vão usar cubos, vão usar quadradinhos mesmo,
mas aqui eu tô representando cada objeto com o nome dele
e a classe que ele pertence.
Professor, mas se tem uma Diagrama e Objetos,
por que, então, que eu tenho Diagrama de Classes?
Porque os objetos eles podem explodir em quantidade
e o Diagrama de Classes permite que eu mostre,
de maneira coletiva, todos os objetos.
mostrando apenas sua classe e o relacionamento dessa classe com outra classe.
Por exemplo, eu posso modelar a classe
Pessoa e a classe Carro,
dizendo que uma Pessoa pode possuir
Carro ou Carros.
E aí... mas aí eu não preciso modelar todas as pessoas que existem
nem todos os carros que existem.
Faz uma modelagem mais genérica da coletividade.
Bem entendido.
Muito bem,
se, então, modelar objeto a objeto é difícil
como é que eu modelo essa associação aqui
em termos de classes?
Tá ali, ó.
Eu vou ter aqui
essa associação chamada conhecer.
Diagrama de Classes que modela, nesse caso, analisa
o relacionamento de associação entre objetos de Pessoa
e de Universidade por meio de suas classes.
Então, está ali, ó.
Cada Pessoa conhece zero ou uma Universidade.
Isto é um Diagrama de Classes. Tem uma observação.
Tendo em vista que o Diagrama oculta detalhes de implementação,
ficando mais próximo do sistema real analisado,
ele pode ser considerado como um Diagrama de Classes de Análise.
Essa é a grande diferença entre a Análise e o Projeto.
Análise tá modelando a coisa em alto nível.
Eu sei que uma Pessoa se relaciona ela conhece Universidade,
mas como isso é feito, tecnicamente falando, eu não tô contando.
Não tô aqui colocando que tem ponteiro ali
referência escondida, nem nada assim.
Tô, simplesmente dizendo, mais em alto nível, analisando
que existe uma associação, né,
entre Pessoa e Universidade.
Muito bem.
Aqui, inclusive,
eu tô colocando só do ponto de vista da Pessoa
Pessoa conhece zero ou uma Universidade,
mas eu posso, muito embora isso seja polêmico,
também contar aqui que a Universidade
é conhecida por zero ou mais Pessoas.
Quero explicar o seguinte:
isso aqui é um relacionamento direcional.
Por que direcional?
Você tem uma seta aqui, ó.
Pessoa que conhece a Universidade, a Pessoa que tem ciência da Universidade.
Neste tipo de modelagem eu tô dizendo que a Universidade
não tem ciência da Pessoa.
É direcional.
Se eu quisesse que a Pessoa conhece a Universidade
e a Universidade também conhece a Pessoa,
deveria ter outra seta no sentido contrário aqui,
ou simplesmente não ter seta pra lado nenhum.
Agora a cardinalidade são coisas distintas, tá.
Aqui eu tô dizendo que a Pessoa conhece zero ou uma Universidades
e a Universidade vai ser conhecida
por zero ou mais Pessoas.
Independentemente de ela ter ciência disso ou não.
Muito bem.
Então, aqui eu expliquei o que é relacionamento direcional
e aqui tem cardinalidade
que eu olho do ponto de vista de Pessoa com relação à Universidade
e da Universidade com relação à Pessoa.
De fato, eu posso ter zero ou uma ou outras Pessoas relacionadas com Universidade
até onde a gente requisitou ou modelou.
Ainda, vejam que isso aqui é Diagrama de Análise.
Eu não tô dizendo nada, aqui, como
a Pessoa vai conhecer Universidade,
e já no próximo slide eu mudo tudo
de Análise pra Projeto.
Aqui, inclusive, a fronteira
nesse exemplo de Análise e Projeto é bem...
bem sutil que ela se dá aqui com uma...
um atributo que vem aqui e coloca, ó.
pUnivFiliado do tipo Universidade.
Inclusive ele tá ali como público, ó.
Corrigir lá e deixar como privado.
Tá vendo, ó.
Agora sim ficou mais técnico,
e eu pus inclusive um comentário.
Isso aqui é um comentário em UML, tá.
Eu tenho esse recurso disponível lá no meu...
minha ferramenta CASE, perdão.
que eu anexo comentário ali à associação
e digo o seguinte, ó: Implementação via Ponteiro.
Professor, mas tem outras maneiras de implementar
a associação que não seja ponteiro? Tem.
Tem por referência escondida.
Por endereço ip.
Até por arquivos, muito embora não seja muito usual.
Bom, então isso é só pra vocês entenderem, tá, a diferença entre
Análise e Projeto.
Aqui a gente já tá projetando, já.
Eu tô pensando como é que a coisa vai funcionar em termos de C++
ou outra linguagem orientada a objetos que eu vou trabalhar.
Exercício.
Esse exercício ficou posto na aula passada.
Criar dois objetos de Universidade
associando um para Einstein e outro para Newton.
O Einstein trabalhou em Princeton
e o Newton trabalhou em Cambridge, conforme já discutido.
Isso não chega a modificar muito lá
a nossa... a relação de classes, tá.
Aqui já tá, em termos de classe,
já tá comportado, aí, na...
no tocante a associação de Pessoa com a própria Universidade.
Como cada Pessoa pode conhecer zero ou uma Universidade
e a Universidade pode ser conhecida por várias Pessoas,
aqui vai ser mais uma instanciação de objetos, tá,
que vão tá respeitando aquelas
limites matemáticos que é aquelas cardinalidades e dados na associação.
Muito bem.
Então, nesse caso, em termos de código
o que vai modificar
é que eu crio aqui o Princeton e o Cambridge
que são objetos de Universidade.
agora o Einstein conhece Princeton
e o Newton conhece o Cambridge, o que permite ali
o Einstein encontrar OndeTrabalho() e também o Newton.
Em termos de objetos, se a gente quiser olhar em Diagrama de Objetos, né.
Ainda que esse Diagrama de Objetos aqui não esteja respeitando
bem, bem, bem a sintaxe gráfica da UML.
A UML não vai usar cubos, vai usar só os quadradinhos, mas enfim.
Aqui, como são poucos objetos, ainda dá pra gente representar assim, tá.
Em termos de objetos e não sendo só de classes.
Ali, ó. O Simao
associado a UTFPR, o Einstein associado ao Princeton
e o Newton associado ao Cambridge.
E todos fazem parte de um objetão Principal aqui, tá,
já discutido em aula anterior.
O objeto da classe Principal agrega-fortemente,
se compões efetivamente,
dos objetos Simao, Einstein e Newton.
E também de UTFPR, Princeton e Cambridge. Bem entendido.
Uma agregação-forte, comumente chamada de Composição,
é caracterizada pelo fato do objeto agregado,
via de regra, só poder ser agregado, efetivamente, por um agregador.
Então, isso aqui é agregação-forte, de fato.
O coração de vocês, por exemplo.
Ele tá agregado ou tá associado a vocês?
Ele tá agregado-fortemente a vocês.
Você se compões, inclusive, de coração
pulmões, tronco, membros, cabeça.
A gente já viu, então,
que a gente tem dois tipos de relacionamentos entre objetos, tá.
Até, então, pelo menos,
que é a associação.
Por exemplo ali, Simao se associa com UTFPR,
Einstein se associa com Princeton e Newton se associa com Cambridge.
E você tem a agregação-forte, ou composição,
que é o caso do sistema, aí, Principal
se compõe desses seis objetos que vocês tão vendo em tela.
Existe um outro tipo de agregação, que é a chamada de agregação-fraca.
Na agregação-forte, via de regra,
o objeto agregado participa só de um agregador.
O seu coração tá agregado só a você.
Os seus pulmões tá agregado só a você.
Os seus rins está agregados só a você.
O motor de um carro tá agregado só àquele carro.
Se eu tirar o motor daquele carro e colocar em um outro carro
ele deixa de estar agregado naquele carro e passa estar agregado-fortemente só no outro carro.
Dentro de um sistema isso é possível.
Agora tem agregação-fraca
aonde, um sistema pode tá agregado a mais de um sistema,
ou melhor dizendo, agregação-fraca
o objeto pode tá agregado a mais de um agregador.
Vou dar um exemplo, tá.
Família.
Você está agregado a sua família
ou você está associado a sua família?
A amizade que você tem com um colega é uma associação.
Já família, quando você constitui uma família,
aí o relacionamento é um pouco mais sério.
Inclusive, tem efeitos de várias ordens, inclusive efeitos legais.
Você não pode abandonar seus pais quando são idosos,
por questões morais, bem entendido, mas também legais.
que é abandono de idoso, né.
Você não pode abandonar seus filhos por questões morais, muito que evidentemente,
por questões também legais, tá.
Abandono de menor, abandono de incapaz e assim vai.
Então, se você olhar, do ponto de vista
mais formal, você pertence à sua família.
Você pertencia ali à família que você nasceu, por exemplo,
ou que lhe criou, que lhe acolheu,
por nascimento, por adoção, por algum meio. Não é isso?
Então, você pertence àquela família.
Só que quando você, por exemplo, casa.
Você constitui uma outra família.
Então, nesse caso, você tá pertencendo à sua família de origem
e também à essa nova família que você constituiu.
Às vezes você pertence a uma família do ponto de vista biológico
e pertence a outra família do ponto de vista de adoção.
Às vezes as pessoas que vão morar em outro país
legalmente, lá, elas são... ficam responsáveis por...
sob a responsabilidade de uma dada família naquele país.
Então, ela tem a família dela no Brasil
e tem a família que ficou responsável por ela lá no país
que ela tá morando, que ela migrou
e continua pertencendo às duas famílias.
Então, a agregação-fraca
é essa agregação onde você pertence
a um dado sistema ou objeto, como o objeto Família.
Só que você pode pertencer a vários objetos, ou mais de um, pelo menos,
como é o caso aí, no exemplo dado, de família.
Pode pertencer a uma família, duas, três, quatro famílias.
Só precisa entender a diferença com agregação-forte.
Um coração tá agregado-fortemente em mim
no sistema pessoa, objeto Pessoa.
Coração, via de regra,
ele não vai tá agregado a mais de uma Pessoa.
Bom, aqui vocês entenderam, então, que existe associação,
agregação que pode ser forte ou fraca.
Nesse caso que tá aí em quadro,
na tela ele é uma agregação-forte.
Agregação-forte, em UML,
você modela em termos de classe,
com esse losango fechado, isso é forte.
Se fosse fraco, o losango seria não-pintado.
Seria o losango aqui só com as bordas pintadas.
ou o losango em aberto, tá.
Aqui eu tô dizendo que Principal agrega
fortemente, se compõe,
por três Universidades e de três Pessoas.
Inclusive a agregação aqui ela é direcional,
porque a Universidade ela não tem noção,
não tem ciência,
que ela está agregada na Principal.
Tecnicamente falando a Universidade não tem ponteiro pra Principal,
mas tudo bem.
Esse modelo ele não é muito bom, né, porque a gente tá fixando em três.
Se eu quiser criar mais uma Pessoa
mais uma Universidade, meu modelo não permite.
Então, eu posso generalizar o modelo.
Tá aqui, ó. Esse modelo já tá generalizado.
Então, você tem zero ou mais
Universidade agregadas no Principal.
Professor, mas o Principal tem que ter pelo menos uma Universidade.
Imaginem que o requisito exigiu isso.
Então você muda a cardinalidade, tá.
Em vez de ser zero, você põe um aqui.
Um, pontinho, pontinho, asterisco. (1..*)
Um ou mais.
A cardinalidade tem que respeitar
as quantidades de objetos que, de fato, vão se relacionar entre si.
Aqui o Principal vai agregar,
por isso que está exposto aí na tela,
zero ou mais Universidades e zero ou mais Pessoas.
Isso pra vocês saberem como é que faz a agregação-forte em UML.