Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Duvida Aula 11

boa noite, nessa aula o instrutor cria o CarrinhoCompras e o CarrinhoItem , mas um CarrinhoCompras ele vai ter itens, porque então não criar o CarrinhoCompras com os itens dentro?

7 respostas

Olá.

Pode mandar as duas classes aqui? Só pra eu ver direitinho como o instrutor separou.

claro Bruno

Controller:

@RequestMapping("/add")
public ModelAndView add(Integer produtoId, TipoPreco tipo){
    ModelAndView modelAndView = new ModelAndView("redirect:/produtos");
    return modelAndView;
}

CarrinhoItem:

public class CarrinhoItem {

    private TipoPreco tipoPreco;
    private Produto produto;

    public CarrinhoItem(Produto produto, TipoPreco tipoPreco) {
        this.produto = produto;
        this.tipoPreco = tipoPreco;
    }

    public TipoPreco getTipoPreco() {
        return tipoPreco;
    }

    public void setTipoPreco(TipoPreco tipoPreco) {
        this.tipoPreco = tipoPreco;
    }

    public Produto getProduto() {
        return produto;
    }

    public void setProduto(Produto produto) {
        this.produto = produto;
    }
}

CarrinhoCompras:

package br.com.caelum.loja.models;

import java.util.LinkedHashMap;
import java.util.Map;

import org.springframework.stereotype.Component;

@Component
public class CarrinhoCompras {

    private Map<CarrinhoItem, Integer> itens = new LinkedHashMap<>();
    public void add(CarrinhoItem item) {
        itens.put(item, getQuantidade(item) + 1);
    }
    private int getQuantidade(CarrinhoItem item) {
        if(!itens.containsKey(item)) {
            itens.put(item, 0);
        }
        return itens.get(item);
    }

    public int getQuantidade() {
        return itens.values().stream().reduce(0, (proximo,acumulador) -> proximo + acumulador);
    }
}

Então, dessa forma que ele fez fica fácil você identificar se um item já está no carrinho e sua quantidade. Tratando tudo como CarrinhoItem, por exemplo, como você controlaria quantidade? Talvez você pense: bom, na hora que o usuário escolher o item, deixo pra ele selecionar a quantidade e coloca uma propriedade de quantidade na classe CarrinhoItem. Pode ser sim, porém fica pior pra você controlar casos que o usuário continua navegando no site e depois quer adicionar o mesmo produto. É bem comum nesses casos o programador não tratar e aparecer na lista o mesmo item como se fosse outro item, manja? Ao invés de adicionar mais quantidade ao existente, adiciona como um item separado. E é por isso que a classe CarrinhoCompra ajuda bastante, pois tem um mapeamento de cada CarrinhoItem com uma quantidade e, toda vez que um produto é adicionado no carrinho, essa classe sabe verificar se ele já existe na lista. Ou seja, você sempre cria novos itens CarrinhoItem, porém está mantendo apenas um CarrinhoCompra.

Não sei se ficou claro, mas a questão aí é mais de organização de código e facilitação na usabilidade.

Bruno ok, voce me esclareceu isso, mas como fica no caso pedido de um cliente se ele nao guarda nada no banco? me corrija se analisei errado, mas no exemplo dado ele apenas salva em memória correto?

seu salvar no banco em uma tabela de pedidoDeVenda, esse model por exemplo recebe uma list de itens de e salva no banco, talvez ele possa ter feito dessa forma por nao salvar nada no banco? estou realmente confuso nesse aspecto.

solução!

Isso, aí está em memória.

Então, levando em conta que esse código foi feito antes do banco, você teria que ter um modelo tipo assim, uma tabela de Pedido e uma tabela de PedidoItem, onde PedidoItem se relaciona com a tabela Pedido. Ou seja, cada PedidoItem recebe uma chave estrangeira PedidoId, contendo o id/código do Pedido. Note que Pedido aqui faz o papel de Carrinho. Ou seja, um Pedido seria o CarrinhoCompra inteiro e cada CarrinhoItem seria um PedidoItem. Essa não é a única forma de fazer isso, mas é uma forma.

E lembrando, o momento que você salvaria isso seria no momento que o usuário fecha o pedido. Aí teriam outras propriedades também, como status do pedido, outra para informações de pagamento, enfim, o banco seria maior, mas é bem por aí.

puts cara valeu, isso mesmo que havia pensado só não sabia se era isso mesmo, tabela de Pedido e outra de PedidoItem.

muito obrigado!!!

Que bom :)

Qualquer coisa, estamos aí.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software