Dúvida com modelagem OO

Salve turma !

“Modelando” umas classes aqui, acabei chegando num ponto onde fiquei com dúvida sobre o que fazer. Eu até achei uma saída que daria certo, mas não tenho certeza se é uma forma boa de usar, bem, vamos lá:

Tenho Produtos onde um Cliente pode solicitar uma Amostra deste produto. (3 entidades: Produto, Cliente e Amostra)
Amostra tem agregado um Cliente e um Produto (1 amostra = 1 produto = 1 cliente - sempre !)

Cliente gostando da Amostra, solicita o Pedido do mesmo. Entretanto, ele poderá aprovar várias amostras e fechar tudo num mesmo Pedido.
Então: 1 Pedido = 1 ou * Amostras (só existe Pedido de amostras aprovadas, nunca Produto vira direto pedido)

Inicialmente eu pensei:

Pedido -- Amostra[] amostras -- date data -- ...

Pensei isso com o seguinte pensamento: “Amostra já tem cliente e produto, então, não preciso jogar novamente isto em pedido”. Não sei se é legal isto, mas por fim acabei pensando em outra solução, até porque essa tem um problema: a quantidade de cada Amostra aprovada. Logo:

[code]PedidoItem
– Amostra amostra
– int quantidade
– float valor

Pedido
– PedidoItem[] itens
– date data
– …[/code]

Penso ser o mais prudente a ser fazer, não sei, parece óbvio demais hahaha…
Dúvidas:

  1. Jogo o Cliente para Pedido.cliente ou deixo em Amostra mesmo ? (Pedido.getItem(0).getAmostra().getCliente().getNome()) [Acho que isto quebra um príncipio de projeto - aquele de que não deve-se conhecer muitos vizinhos, não ?]

  2. Repare que no PedidoItem tem um “float valor”. Esse valor é baseado no Produto, pois tenho uma regra interna lá: Se o cara pedir 100 unidades é um preço, se pedir 200 é outra se pedir + de 300 é outra. O produto sabe das quantidades VS Preço, então esse “valor” em PedidoItem deve ser um calculo feito pelo Produto, penso. Ou não ?

Dúvidas de principiante :confused:
Alguém pode me dar uma mão ?

Abraços !

  1. Um Cliente faz um Pedido com N Amostras, logo o cliente está ligado com o pedido, e o pedido às amostras e não às amostras diretamente ao pedido.

  2. O Pedido recebe o valor por uma outra classe, que não é produto. Seria uma classe de negócio que fecha o pedido do cliente e calcula o valor total, setando pedido.setValor().

Então é necessário haver uma relação direta: Pedido.cliente e não “aproveitar” o relacionamento Amostra.cliente.

Sim, o pedido está relacionado com as amostras que irão compor o mesmo. Mas realmente não sei o que mudaria no modelo que citei no tópico. Alguma sugestão ?

Então essa regra ficaria na classe responsável por criar o novo Pedido.

A ideia de se trabalhar com PedidoItem parece-me correta, ou não ?

— Edit ----

Estive rabiscando uns papéis aqui e pensei nisto:

Pseudo-Java

[code]public class Teste {
public static void main(…) {
pedidoItem.adiciona(Amostra, qtde);
pedidoItem.adiciona(Amostra_outra, qtde2);
pedido.adiciona(pedidoItem);
pedido.setCliente(Cliente);
}

}

public class PedidoService {

 public Pedido cria(Pedido pedido) {
      // verificacoes procurando itens e cliente (uma vez que Pedido compõe ambos)
      itens = pedido.getItens();
      
      while (itens.hasNext()) {
           float preco = itens.getProduto().precoPara(itens.qtde);
           itens.setPreco(preco);
      }

      // continua...
 }

}[/code]

Funcionar, funcionaria, mas o relacionamento ali estaria correto, penso. O que acham ?

Abraços !