Dúvida em possível Composição

Salve a todos!

Estou enroscado com uma dúvida, creio que esteja comendo bola… vamos a ela:

Tenho um objeto Produto e outro Objeto chamado AtributosProduto (pois os atributos variam muito então os atributos serão cadastrados no banco).
Logo de cara eu pensei: “Rá, é composição de Produto para AtributosProduto”, porém agora fiquei na dúvida por um motivo: eu poderei cadastrar/editar/remover atributos no sistema e a composição diz que todas as ações do objeto “parte” deverá ficar no “todo”, trocando em miúdos, a classe Produtos é quem iria controlar os Atributos, mas eu não achei certo instanciar produtos para cadastrar um atributo. Se eu estiver certo na minha dúvida, então não é mais uma composição, correto ? Passaria a ser uma agregação, creio eu.

Alguém para me ajudar nessa ?

Abraço!

Você precisa sim de um Produto para acrescentar um AtributoProduto, pois o AtributoProduto não tem “vida” propria, seria algo assim:

[code]AtributoProduto atr = new AtributoProduto();

Produto p = //obtem o produto
p.addAtributo(atr);

//atualiza o Produto no banco[/code]

Opa jairelton,

Sim, essa é exatamente a dúvida: um atributo não tem vida sozinho como você mesmo disse, porém, vamos imaginar a situação:

[quote]Tela: Adicionar Atributos
Nome do novo atributo:
[Cadastrar][/quote]

Na Controller dessa tela eu teria que chamar a classe de produtos inteira para adicionar um Atributo, pois o método AdicionarAtributo faz parte de Produto. E nesse caso ainda, não teria nenhuma atualização nos produtos, pois é adição de um novo atributo.

Isso não estaria errado ?
E a propósito, isso é composição mesmo né, não falei besteira não, ou falei ? hehehe

brigadão pelo help!

Teria uma alteração em produto sim, pois AtributoProduto “faz parte” de Produto, portanto o que está sendo alterado é o Produto.

Se você tem um produto “Caneta” e você altera o atributo “Cor” do produto, o produto não foi alterado?

E “chamar a classe produto inteira” não é nenhum drama, fica tranquilo.

Talvez fosse mais adequado chamar de agregação, inves de composição, mas isso é uma questão mais de interpretação.

[quote=“jairelton”]Teria uma alteração em produto sim, pois AtributoProduto “faz parte” de Produto, portanto o que está sendo alterado é o Produto.

Se você tem um produto “Caneta” e você altera o atributo “Cor” do produto, o produto não foi alterado?[/quote]
Então, neste caso sim, pois eu alterei a cor do produto.
Mas deixa eu apresentar outro exemplo:

Temos os atributos: Cor e altura no banco numa tabela que tem apenas os atributos.
Daí o o cara vai lá e adiciona no sistema o atributo Largura. De inicio os produtos não terão essa informação definida, pois há uma tabela intermediária que indicará o ID do atributo e o ID do produto para fazer as associações (puxa, é agregação mesmo =]).

Nesse meu caso o atributo é uma parte de Produto realmente, mas é uma parte gerenciável a parte, entende ? Mesmo assim essa agregação existe, correto ?

hehe, neurose minha mesmo. Preciso parar com isso =)

Vi em um livro de OOP que Composição era quando a “parte” não existia sem o “todo”, e agregação quando a “parte” era instanciada fora do “todo” e essa “parte” era agregada ao “Todo” por meio de um método, algo como:

[code]CestaCompras (todo)
Produto (parte)

CestaCompras->insereProduto(Produto p)[/code]

Mas você não é o primeiro a me falar que está invertido, talvez seja erro do autor do livro. Ele diz ainda que na agregação a ligação entre o “todo” e “parte” no banco é feita por uma tabela auxiliar que conterá as chaves estrangeiras… enfim …

Muito obrigado pela ajuda!