Como faer para pedido pode ter serviço ou produto ou ambos

imagine o cenário de exemplo:

uma assistência técnica de computadores… onde o técnico (que herda de pessoa) pode adicionar em um pedido/ordem/ou-qlqr-outro-nome um produto e/ou serviço. na verdade ele pode adicionar vários produtos e vários serviços na ordem/pedido…

então eu tenho uma entidade produto, uma entidade serviço… e minha duvida é… as duas iriam herdar de “item” por exemplo? eu até sei fazer de várias formas, mais não sei qual seria a mais correta!!.. minha duvida aqui é esta… qual seria a mais correta…

ai no pedido eu teria uma lista de itens e cada item tem um enum falando se aquele item é um produto ou um serviço…

to meio perdido de como seria a melhor forma…

[quote=alandiniz]imagine o cenário de exemplo:

uma assistência técnica de computadores… onde o técnico (que herda de pessoa) pode adicionar em um pedido/ordem/ou-qlqr-outro-nome um produto e/ou serviço. na verdade ele pode adicionar vários produtos e vários serviços na ordem/pedido…

então eu tenho uma entidade produto, uma entidade serviço… e minha duvida é… as duas iriam herdar de “item” por exemplo? eu até sei fazer de várias formas, mais não sei qual seria a mais correta!!.. minha duvida aqui é esta… qual seria a mais correta…

ai no pedido eu teria uma lista de itens e cada item tem um enum falando se aquele item é um produto ou um serviço…

to meio perdido de como seria a melhor forma…[/quote]

Herança é algo muito perigoso. Isto é um conceito que precisa estar presente. Para usar herança vc tem que ter certeza absoluta do que está querendo.
Para isso vc precisa dominar o conceito de identidade.

Tecnico pode herdar de pessoa, mas precisa ? mesmo ? Não pode simplesmente conter um objeto pessoa ?
Ordem contém itens. Produto é um item ? Ou item contém um produto ? Normalmente o item tem a quantidade do produto que o cara está comprando. produto não tem isso, logo item não é um produto. Item contém um produto.

Ordem contém items e item contém produto.
Mas e serviço ? é um produto ? como fazer o item conter produtos mas também serviços ?

Se produto e serviço tivesse uma classificação maior comum poderiamos usar essa.

Agora entra um pouco de conceito. A palavra “produto” é genérica e se divide em “bem” e “serviço”. Portanto a empresa só vende produtos, mas eles podem ser bens ou serviços. ( básicamente coisas que se consomem e coisas que se usam). Então concluimos que serviço é filho de produto e que precisamos do conceito de bem

então : Ordem contém items e item contém produto. Produto pode ser um Bem ou um Serviço.

Vc não precisa de enum no item. Se precisar destinguir use a classe produto e métodos booleanos .isService fazer coisas como

 
if  (produto.isService() ){
      Servico servico = produto.asService();
}

Em geral vc deve sempre pensar que A contém B. Apenas quando A precisa conter dois tipos de B é que a herança é usada em B para criar B1 e B2 que herdam de B e ambos podem ser colocados em A. Mas a maioria das vezes isso não é necessário porque a composição é mais flexivel que a herança.

Hmm… .entendo… mais por exemplo o serviço não pode ser “filho” de produto… pq produto por exemplo tem estoque, tem várias coisas que o serviço não tem… basicamente o serviço é (id, nome, valor)…

no exemplo que eu dei um serviço seria por exemplo
1 - formatação - 70.00

agora um produto pode ser (id, grupo, nome, preco, estoque)
1 - mouse - microsoft - 40.00 - 10

to dando um exemplo BEM simples…

agora imagina a situação… o cara deixa o pc dele pra formatar e qr comprar um mouse mais quer pagar tudo e pegar na retirada… então eu tenho uma ordem de serviço já com um produto (mouse) e já com um serviço (formatação). bom já vamos considerar aqui que pode ter mais de um produto e mais de um serviço…

então a ordem pode ter vários produtos e serviços…

agora to em duvida nessa parte… o correto seria dizer que minha ordem contém um item do tipo produto e um item do tipo serviço?

e como representar isso a nível de banco? fica meio difícil em uma linguagem orientada e um banco estruturado :frowning:

[quote=alandiniz]Hmm… .entendo… mais por exemplo o serviço não pode ser “filho” de produto… pq produto por exemplo tem estoque, tem várias coisas que o serviço não tem… basicamente o serviço é (id, nome, valor)…
[/quote]

não, vc não entendeu. Produto não tem estoque, Bem que tem. Se não gosta de “Bem” use “consumivel” ou “bemConsumivel”. bemConsumivel é filho de Produto e é ele que tem estoque.

serviço é (id, nome, valor) <-- cadê o preço ?
bemConsumivel (id, grupo, nome, preco, estoque)

Por outro lado vc pode simplesmente criar uma tabela estoque e de preço

Estoque( id_Produto, quantidade)
Preco( id_Produto, quantidade)

É que as suas tabela são muito simples, na realidade existem diferentes preços e diferentes quantidade de estoque.

Mas voltando ao ponto, a herança é Produto no topo e BemConsumivel e Serviço em baixo.

na vdd o serviço é id, nome, preço (é que me expressei mal e chamei de valor) rsrs

então acho que seria

uma entidade principal
Produto
id, nome, etc…

uma entidade
BemConsumivel
id, Produto, etc…

uma entidade
Servico
id, Produto, etc…

uma entidade (ak nao sei mto bem o nome)
Estoque
id, produto, quantidade

uma entidade(tbm nao sei o nome legal e talvez ate junto com a estoque)
Preco
id, produto, preco