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!