[UML - Diagrama de Classes] Composição x Agregação  XML
Índice dos Fóruns » Metodologias de Desenvolvimento e Testes de Software
Autor Mensagem
Carnevalli
JavaBaby

Membro desde: 27/09/2007 10:39:30
Mensagens: 90
Offline

Bom, pessoal.

Não mexo com UML há muito tempo e tenho encontrado uma certa dificuldade para modelar nos meus diagramas de classes as associações com multiplicidade 1 para * ( vários ).

Sempre fico em dúvida se coloco uma associação normal, uma associação com agregação ou uma associação com composição.

Sei que, nesses relacionamentos, quando uma classe é o todo e a outra representa uma parte do todo, há espaço para agregação ou composição. Mas tenho dificuldades para identicar quando é correto utilizar cada um, ou, até mesmo, não utilizar nenhum dos dois, deixando simplesmente a associação.

Neste tópico gostaria que postassem algumas dicas para ajudar no reconhecimento desses elementos, além das que são mostradas nos livros de UML, como o "Guia do Usuário".

Consultei esses sites antes de criar esse tópico:
http://www.ericksasse.com.br/agregao-x-composio/
http://www.plugmasters.com.br/sys/materias/667/1/Escolha-o-que-usar,-Agrega%E7%E3o-ou-Composi%E7%E3o

Mas a explicação deles é praticamente a mesma da literatura que consultei.

Desde já agradeço!

Abraços,
gibaholms
JavaTeenager
[Avatar]

Membro desde: 13/11/2007 13:37:48
Mensagens: 151
Localização: Santos - SP
Offline

Eu costumo pensar da seguinte forma... imagine um cenário em que eu tenho 2 objetos: "A" e "B", e estou na dúvida da relação entre eles.... faça as seguintes perguntas:

1 - Se eu "deletar" o A, terei que "deletar" também o B ?
Sim = composição
Não = pode ser agregação ou nada... goto pergunta 2
Exemplo: pedido e compras... um pedido pode ter várias compras, mas se eu deletar o pedido, preciso deletar as compras (não faz sentido eu ter um objeto compra sem que ele esteja em nenhum pedido... sua única razão de existir é "compôr" um pedido).

2 - O objeto B tem alguma utilizade sozinho ?
Sim = associação comum
Não = agregação
Exemplo: carro e rodas... se eu deletar um carro, não preciso deletar suas rodas, pois elas podem servir pra outro carro. Isso me fez vir para a pergunta 2, porém uma roda tem utilizade sozinha ? Geralmente não, ela serve sempre para "agregar" uma funcionalidade a outro objeto, como a funcionalidade de andar ao carro (ou a um outro veículo qualquer), ou até mesmo a funcionalidade para crianças sentarem em um "balanço de árvore", etc....

O caso de composição é o mais claro, agora o de agregação muitas vezes vai da interpretação do analista, pois alguém poderia contestar que uma roda tem sim uma utilidade sozinha para algum caso bizarro que ele observou, ou que existe no "mundo particular dele".

espero ter ajudado.. abraço


SCJA 1.0 | SCJP 4 | SCWCD 5 | SCBCD 5 | Oracle Weblogic Portal 10g Developer
[WWW] [MSN]
andersonarf
Smalltalk
[Avatar]

Membro desde: 05/10/2008 19:17:03
Mensagens: 3
Offline

sei que esse tópico é meio antigo, mas acho que postando poderei ajudar algum "desesperado"...rs

Tipos de Associação:
1) Associação Simples (representada por um traço entre as classes)
2) Agregação (representada por um losango aberto no lado do todo)
3) Composição (representada por um losando cheio no lado do todo)

Vamos à diferenciação entre eles...
1) Associação simples:
-estabelece uma relação semântica estrutural entre classes.
Ex: uma Pessoa trabalha para uma Companhia, uma Companhia tem vários Escritórios, etc.

2) Agregação:
-estabelece uma relação todo-parte entre classes, sendo que a parte pode existir sem o todo.
Ex: Carro e Roda. Uma Roda é parte de um Carro, porém pode a Roda existe por si só fora do Carro. Você pode por exemplo remover a roda de um carro para colocar em outro.

3) Composição:
-estabelece uma relação todo-parte entre classes, sendo que a parte NÃO existe sem o todo.
Ex: Pedido e Itens de Pedido. Se você destruir o Pedido, os Itens são destruidos junto, eles não tem sentido se não houver um Pedido.

Portanto,
respondendo à pergunta do nosso amigo...
Se NÃO HOUVER a relação todo-parte (excluindo os casos de herança e outras associações que não foram citadas) -> ASSOCIAÇÃO SIMPLES
Se HOUVER a relação todo-parte -> temos que ver se a parte pode existir sem o todo....
Se a parte existir sem o todo -> AGREGAÇÃO
Se a parte não existir sem o todo -> COMPOSIÇÃO

Espero ter ajudado!!!
Abraços
Anderson R. Ferreira

Anderson Rodrigues Ferreira
Sun Certified Java Programmer
[MSN]
Daniel_MV
JavaEvangelist
[Avatar]
Membro desde: 30/04/2007 07:43:01
Mensagens: 425
Offline

Achei esse tópico pois estou fazendo uma modelagem e cai exatamente nessa situação.

Uma coisa que não entendi, nesse exemplo clássico do Pedido e Item Pedido.

Pedido <---------- ItemPedido
1..*

Isso significa que para um pedido eu posso ter 1 ou mais itens nesse pedido.

Em termos práticos, em um diagrama de classes, eu faço esse tipo de modelagem, ou eu defino logo a classe Pedido com um atributo do tipo: List<ItemPedido> ?????

Pedido
------------
idPedido;
dataPedido;
valor;
List<ItemPedido>
etc...


Grato
r063rio
Thread.start()

Membro desde: 26/06/2009 14:30:39
Mensagens: 42
Offline

Nesse caso, haverá 2 classes (e entidades de banco): uma para pedido, outro para itemPedido. A entidade itemPedido será referenciada na classe Pedido.
Vc pode fazer assim(vou colocar em código, mas dá pra imaginar como ficaria no diagrama):
Public class Pedido {
itemPedido iPedido; //já tendo implementado pedido em uma outra classe

Em termos de banco, itemPedido será referenciada como uma chave estrangeira em Pedido.
Ok?
pgnt
Debugger
[Avatar]

Membro desde: 18/01/2007 04:27:33
Mensagens: 57
Offline

Legal o tópico, estou com dois casos de associações que gostaria que avaliassem

--------------------------------------------------------
CASO 1: Autor X Livro X Errata
--------------------------------------------------------
O autor publica o Livro porém o Livro não é composto pelo autor - neste caso é uma associação simples.
Já uma Errata só existe se houver Livro, a não existência do Livro faz a Errata perder o sentido - é então um caso de composição.

Engraçado neste caso é que a Errata pode ou não compor o Livro, já que um livro pode existir sem Errata. Nestas condições está certo tratar Errata como composição mesmo?


--------------------------------------------------------
CASO 2: Prova X Local da prova (Sala de Aula)
--------------------------------------------------------
Eu não preciso da Sala de Aula para compor a Prova, é uma associação normal (ok?!)
MAS
Se eu disser que a Prova de biologia só pode ser aplicada na Sala de biologia, como ficaria essa Associação, alguém sabe?

Valeu!
abs

This message was edited 1 time. Last update was at 10/03/2010 19:40:06

tnaires
GUJ Master
[Avatar]

Membro desde: 22/12/2003 08:05:58
Mensagens: 1678
Localização: Porto Alegre/RS - Natal/RN
Offline

http://www.guj.com.br/posts/list/116560.java

Tarso Nunes Aires

Blog - http://cabritin.wordpress.com/
Delicious - http://delicious.com/tnaires
Twitter - @tnaires

felipeabm
Smalltalk

Membro desde: 28/03/2010 17:40:10
Mensagens: 3
Offline

Eu usaria um critério menos formal.

Um Livro pode ou não ter uma Errata [A Errata pode ou não fazer parte do livro]. Então será uma associação simples ou agregação a depender do nível de associação que você queira dar.

Pouca associação, num contexto mais geral, associação simples. Muita associação, num contexto mais geral, então é uma agregação.

Um livro precisa de pelo menos um Autor para existir e também assumir a autoria. O autor pode até ajudar a distinguir livros com nomes iguais. Então é uma composição. Um livro sem autor, mesmo desconhecido, nunca existiria.

Autor: desconhecido. Mas a composição não deixa de existir.

A mesma coisa serve para um Produto que não existiria se não fosse feito pelo Fabricante. É uma composição.

Mas a associação não tem muito haver com os atributos do objeto.

O fato do Carro ser composto de rodas não exige um atributo do tipo Rodas. O que o atributo diz é algo semantico: "Um carro é composto por rodas", 'Um carro é composto por motor". Mas os atributos, formas de implementação, podem ser construídos de várias formas. Exemplo: atributo Roda[4] rodas. atributo List<Roda> rodas. atributo Rodas[4] pneus.

Então não confundam a associação com a exigência de determinado atributo.

Uma prova é um objeto cujos atributos são: cabeçalho, título, questões.

A aplicação de uma prova depende de alguns objetos: a prova, o local, o tipo de prova, etc.

Prova
- cabeçalho
- título
- questões
- Disciplina disciplina

AgendaProva/AplicaçãoProva
- id
- Prova prova
- Local local
- DataHora datahora
- Turma turma
- PeriodoLetivo periodo

Uma prova está agregada a uma disciplina. "É a prova X da disciplina de biologia".
A Aplicação de uma prova é composta da prova, local de realização, data, turma e periodo letivo em que ela será realizada. A aplicação da prova vai ocorrer de acordo com estes moldes.

Obserque que embora prova tenha vários atributos, eu não preciso incluí-los na associação. Pois, associação não implica em atributos. Já na Aplicação a relação é tão forte que cada associação tem um atributo que o relaciona ao objeto Aplicação.

eu faria uma modelagem semelhante a esta

pgnt wrote:Legal o tópico, estou com dois casos de associações que gostaria que avaliassem

--------------------------------------------------------
CASO 1: Autor X Livro X Errata
--------------------------------------------------------
O autor publica o Livro porém o Livro não é composto pelo autor - neste caso é uma associação simples.
Já uma Errata só existe se houver Livro, a não existência do Livro faz a Errata perder o sentido - é então um caso de composição.

Engraçado neste caso é que a Errata pode ou não compor o Livro, já que um livro pode existir sem Errata. Nestas condições está certo tratar Errata como composição mesmo?

CASO 2: Prova X Local da prova (Sala de Aula)
--------------------------------------------------------
Eu não preciso da Sala de Aula para compor a Prova, é uma associação normal (ok?!)
MAS
Se eu disser que a Prova de biologia só pode ser aplicada na Sala de biologia, como ficaria essa Associação, alguém sabe?

Valeu!
abs

 
Índice dos Fóruns » Metodologias de Desenvolvimento e Testes de Software
Ir para:   
Powered by JForum 2.1.8 © JForum Team