Como você resolve de maneira fácil quando o assunto e Agregação e Composição
29 respostas
Marcio_Duran
:shock: Falando em coleções e arranjos simples, é sempre uma dificuldade para entender uma regra que melhor se encaixe quando o assunto é Agregação e Composição.
:arrow: Então que regra é mais fácil para interpretá-los, isso é uma discussão que alguns gurus da UML, já até então abordaram exaustivamente em obras e livros.
Vc tem cunhado? Se tiver vai ser fácil entender.
O seu cunhado está agregado a sua família, ele não compõe a sua família.
Já você compõe sua família.
tnaires
allanmarques:
Vc tem cunhado? Se tiver vai ser fácil entender.
O seu cunhado está agregado a sua família, ele não compõe a sua família.
Já você compõe sua família.
:D
No contexto de sua aplicação, você pode ter instâncias de SuaFamilia com o atributo "seuCunhado" igual a null ( agregação ), mas nenhuma delas terá o atributo "voce" igual a null ( composição ).
Giulliano
COMPOSIÇÃO: O outro lado só existe se aquele que esta com ele existir.
AGREGAÇÃO: O objeto esta associado mas possue estado independente de quem esta associado a ele.
acho q é isso.
Marcio_Duran
allanmarques:
Vc tem cunhado? Se tiver vai ser fácil entender.
O seu cunhado está agregado a sua família, ele não compõe a sua família.
Já você compõe sua família.
Acho que isso foi inocente, mas acabou se aproximando de um conceito até mais plausível
No contexto de sua aplicação, você pode ter instâncias de SuaFamilia com o atributo "seuCunhado" igual a null ( agregação ), mas nenhuma delas terá o atributo "voce" igual a null ( composição ).
:!: Este é um exemplo que cabe pra Ruby também ?
Giulliano
foi bom mesmo…
só que VOCÊ existe mesmo sem suaFamilia existir, mas sua família não existe se VOCE não existir. Pense nisso.
Marcio_Duran
Giulliano:
COMPOSIÇÃO: O outro lado só existe se aquele que esta com ele existir.
AGREGAÇÃO: O objeto esta associado mas possue estado independente de quem esta associado a ele.
acho q é isso.
Coloca uma situação sem ter que ser conceitual, dando um enfoque criativo algo que até em um caso de uso acho teria melhor relação.
Marcio_Duran
Giulliano:
foi bom mesmo…
só que VOCÊ existe mesmo sem suaFamilia existir, mas sua família não existe se VOCE não existir. Pense nisso.
Mas de outra forma, como você poderia dizer então !!!
Giulliano
a classe VOCÊ existe e a classe CUNHADO existe, já a classe SUAFAMILIA é associada (composição) com a classe VOCÊ.
quanto ao código continua a mesma coisa, só mudaria na implementação.
allanmarques
Os conceitos de agregação e composição também dependem muito do domínio em que estamos. Ex:
Se o meu domínio é uma concessionária de carros, motor não existe sozinho, ele compõe o carro. O carro também não existe sem
o motor.
Já se o meu domínio é um ferro-velho, motor pode existir sozinho como também pode estar agregado a um carro.
M
malsan
Não me lembro de ter visto tanta atrocidade junta antes… talvez na Segunda Gerra Mundial!
Agregação: a parte pode pertencer a mais de um todo.
Composição: a parte pertence a um único todo.
O resto das cláusulas são efeitos destas regras ou pura balela!
Um abraço a todos!
victorwss
malsan:
Não me lembro de ter visto tanta atrocidade junta antes… talvez na Segunda Gerra Mundial!
Agregação: a parte pode pertencer a mais de um todo.
Composição: a parte pertence a um único todo.
O resto das cláusulas são efeitos destas regras ou pura balela!
Um abraço a todos!
Associação: um objeto não faz parte do outro, porém eles se conhecem.
Andre_Brito
Acho que o que eu vou dizer pode parecer besteira, mas
Agregação quando A conhece objetos do tipo B e que, quando um for “destruído” não acarretará na “destruição” de outro.
Composição é quando, se A for “destruído”, B vai ser também.
Não sei onde li isso… Mas pelo que eu me lembre foi o conceito pelo qual consegui entender um pouco.
v1c70r_f
allanmarques:
Vc tem cunhado? Se tiver vai ser fácil entender.
O seu cunhado está agregado a sua família, ele não compõe a sua família.
Já você compõe sua família.
Excelente exemplo!!! Caramba, precisamos mais disso pra aprender OO!!! Fica muito mais fácil.
paulofafism
Outro exemplo envolvendo familia poderia ser hehee
Composição e quando vc casa com sua esposa se morre e sua esposa morre junto
Agreção é quando vc casa vc ganha de brinde sua sogra hehee
O exemplo é bom, mas ainda acho que não é 100% exato. Afinal, você continuaria a existir sem sua família, e sua família continuaria a existir sem você também (apenas seria um pouco mais triste ou mais feliz, dependendo de como você os trata :))
O exemplo é bom, mas ainda acho que não é 100% exato. Afinal, você continuaria a existir sem sua família, e sua família continuaria a existir sem você também (apenas seria um pouco mais triste ou mais feliz, dependendo de como você os trata :))
Sem ele não seria "a família dele" e sim outra família qualquer.
Marcio_Duran
Sem ele não seria “a família dele” e sim outra família qualquer.[/quote]
:arrow:Não busque a explicação de composição ou agregação se situando em código, mesmo porque o efeito a regra pode realmente mudar.
gomesrod
Ssalgado:
Sem ele não seria “a família dele” e sim outra família qualquer.
Bom… não entendo profundamente esse assunto, então tenham paciencia se eu estiver falando besteira, mas acho o seguinte: uma relação de composição não traz a idéia de “um não vive sem o outro” ?
Assim: Se José não existe a família continua existindo. Ela se torna “uma outra família qualquer que não a de José”, mas isso não é apenas um detalhe? Da mesma forma, sem ele o cunhado também não é mais o cunhado dele, mas o cunhado de um outro qualquer - nem por “José tem um cunhado” foi considerado Composição.
Não sei se fui claro o suficiente…
Um exemplo do que considero composição:
-> José tem uma cabeça.
José não vive sem a cabeça, a cabeça não vive sem José, e caso José não exista a cabeça dele não poderá simplesmente tornar-se a cabeça de um outro cara.
Faz sentido isso?
Valeu!
luistiagos
este exemplo não é muito trivial… para composição prefiro adotar o exemplo de um carro por exemplo… um carro é composto por motor, bateria, freio, suspensão que são objetos essencias para a criação do carro… alguns objetos podem ser opicionais como: som, ar condicionado… etc… e outros são funcionais como freios, motor… etc… tanto uns como outros são feitos exclusivamente para comporem o carro… portanto se o carro não existir seus componentes tambem não iram existir…
danieldestro
Sinceramente não achei o exemplo da família correto para, metaforicamente, explicar a diferença entre composição e agregação.
Em OO o conceito é um pouco diferente.
Como bem disse o amigo:
O que não é verdade para o exemplo da família.
Exemplo prático de COMPOSIÇÃO:
NotaFiscal --> ItemNotaFiscal
Não existe o item se a NF não existe.
Exemplo prático de AGREGAÇÃO:
Carro --> Motor
O motor existe, independente do carro existir, pode até ser retirado de um e colocado em outro carro.
peerless
danieldestro:
Sinceramente não achei o exemplo da família correto para, metaforicamente, explicar a diferença entre composição e agregação.
Em OO o conceito é um pouco diferente.
Como bem disse o amigo:
O que não é verdade para o exemplo da família.
Exemplo prático de COMPOSIÇÃO:
NotaFiscal --> ItemNotaFiscal
Não existe o item se a NF não existe.
Exemplo prático de AGREGAÇÃO:
Carro --> Motor
O motor existe, independente do carro existir, pode até ser retirado de um e colocado em outro carro.
Hmm… um carro continua sendo um carro sem motor? Talvez se o exemplo fosse neon, xenon, adesivos
danieldestro
Ele deixa de ser carro?
Ok, talvez um melhor exemplo para agregação fosse:
Cesta --> Frutas
peerless
O exemplo do carro sem motor, fica parecido com o do ser humano sem coração. Não bate muito bem.
danieldestro
Bom, ai estamos tratando de dois conceitos TOTALMENTE diferentes, e a capacidade de abstrair isso e levar para um modelo computacional é o que ajuda a criar um sistema mais conciso.
luistiagos
Concordo… por isto dei o exemplo do carro… outro exemplo pode ser um ser humano…
Composição: um homem e composto por coração, cerébro, nariz, ouvidos, figado… etc…
Agregação: ao homem pode ser agregado peças de vestuario como camisetas, calças, sapatos… etc…
rodrigoy
Amigos, façam o mesmo que o Fowler e esqueça Agregação. O próprio Rumbaught disse "considere a agregação um placebo da UML". A agregação simplesmente é um relacionamento do tipo "parte-todo". Isso geralmente não tem efeito colateral no seu código. Exemplo:
Equipe < >----- Pessoa
Uma equipe nada mais é que um agrupamento de pessoas. Se isso for gerar confusão no seu projeto simplesmente esqueça isso. Já a composição, como vocês notaram, é uma associação muito forte, como se ambos os objetos trabalhassem como uma coisa única.
Pedido <#>------- ItemPedido
Não existe ItemPedido que não esteja associado a um Pedido e quando o Pedido morrer, todos os ItemPedido associados morrem junto.
Editado: A agregação não tem efeito colateral, a composição sim.
Andre_Brito
Rodrigo, não tem efeito colateral? Isso quer dizer que se eu tiver uma coleção de objetos que outro objeto acessa usando composição, mas quiser manter a lista de objetos mesmo quando o objeto que acessa a coleção for destruído não causará problema no meu código?
Eu sempre achei que sim…
Se bem que não faz muito sentido manter uma coleção de objetos que sempre foi e somente será acessada por um objeto. Estou certo nesse detalhe?
rodrigoy
André, eu errei no texto e já editei… a composição tem efeito colareral a agregação não.