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

[Dúvida] Dúvida sobre projeto de cartão de crédito

Escrevi um código que a professora jaque passou, é sobre um sistema de cartão de credito. Eu fiz sozinho todo o código tentando implementar o máximo de conceitos que aprendi sobre POO. E o código ficou assim:

public class Aux {
    private double valor;
    private String descricao;

    public Aux(String descricao, double valor) {
        this.descricao = descricao;
        this.valor = valor;
    }

    public double getValor() {
        return valor;
    }

//Polimorfismo para que apareça a mensagem desejada, para isso foi necessario mudar o metodo to string
    @Override
    public String toString() {
        return descricao + ": R$" + valor + System.lineSeparator();
    }
}
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class Lista {
    
    private List<Aux> historico_de_compras = new ArrayList<>();
    
    public void setadiciona(String descricao, double valor){
        historico_de_compras.add(new Aux(descricao, valor));
    }

    public void ordena() {
        historico_de_compras.sort(Comparator.comparing(Aux::getValor));
    }

    public List<Aux> getHistorico_de_compras() {
        return historico_de_compras;
    }
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        double saldo = 0;
        int i = 0;
        int contador = 0;

        Lista lista = new Lista();
        Scanner escreva = new Scanner(System.in);

        System.out.println("Digite o limite do seu cartão");
        double saldoDoCartao = escreva.nextDouble();

        while (i == 0) {

            System.out.println("Digite 0 para realizar uma compra ou digite 1 para sair");
            i = escreva.nextInt();

            if (i != 0 && i != 1) {
                System.out.println("Digite um número válido");
                i = 0;
            } else if (i == 0 ) {
                System.out.print("Digite o nome do produto");
                escreva.nextLine();
                String produto = escreva.nextLine();
                System.out.println("Digite o preço do produto");
                double preco = escreva.nextInt();
                if (preco > saldoDoCartao) {
                    System.out.println("Saldo insuficiente");
                    i = 1;
                } else {
                    saldoDoCartao = saldoDoCartao - preco;
                    lista.setadiciona(produto, preco);
                    contador ++;
                }

            }
        }

        if (contador == 0) {
            System.out.println("nenhuma compra feita");
        }else {
            System.out.println("lista de produtos comprados");
            lista.ordena();
            for (int j = 0; j < contador; j++) {
                System.out.println(lista.getHistorico_de_compras().get(j));
            }

        }
    }
}

Executei o código e funcionou normalmente. Só que depois que eu consegui concluir esse desafio eu fui ver como a professora fez e vi que o meu ficou muito diferente. A minha dúvida é se o código que escrevi pode ser considerado um código bem escrito. Se houver algo que eu possa melhorar no código eu ficaria muito contente se compartilha-se comigo, desde já agradeço.

2 respostas
solução!

Oii André,

Parabéns por ter desenvolvido a solução sozinho! Isso é fundamental para o aprendizado. É perfeitamente normal que o seu código fique diferente do da instrutora. Na programação, existem muitas formas de chegar ao mesmo resultado.

O seu código funciona e aplica conceitos importantes, mas, como você pediu uma análise sobre "código bem escrito" e boas práticas de Orientação a Objetos (OO), separei alguns pontos para você evoluir.

1. Nomenclatura (Nomes das coisas)

Este é um dos pilares do "Código Limpo" (Clean Code). O nome deve dizer exatamente o que a classe ou variável faz.

  • Classe Aux: O nome Aux (auxiliar) é muito genérico. No contexto do projeto, essa classe representa uma Compra. O ideal seria nomeá-la Compra. Assim, quem ler o código saberá que new Compra("TV", 2000) faz mais sentido que new Aux(...).
  • Variável historico_de_compras: Em Java, a convenção padrão é usar o camelCase (começa minúsculo e as próximas palavras com maiúscula, sem sublinhados). O ideal seria historicoDeCompras. O uso de snake_case (com underline) é comum em Python ou SQL, mas evitado em Java.
  • Método setadiciona: O prefixo set geralmente indica substituição de valor. O add indica adição em lista. Um nome melhor seria apenas adicionaCompra ou registraCompra.

2. Responsabilidade das Classes (O Coração da OO)

A maior diferença estrutural entre o seu código e o da instrutora.

No seu código (Main), a lógica de verificar se há saldo suficiente está solta:

if (preco > saldoDoCartao) { ... }

Na Orientação a Objetos, tentamos trazer a regra de negócio para dentro da classe que detém os dados.

  • A abordagem da instrutora: Ela cria uma classe CartaoDeCredito. Essa classe tem o limite, o saldo e a listaDeCompras. O método para adicionar compra fica dentro do Cartão. O Cartão é quem diz: "Posso fazer essa compra?".
  • Sua abordagem: Você criou uma classe Lista que apenas guarda os itens, mas o controle do dinheiro (saldo) ficou na classe Main.

Por que mudar? Se amanhã você criar uma interface gráfica ou um aplicativo web, terá que reescrever a lógica do if (preco > saldo) em vários lugares. Se essa lógica estiver dentro de uma classe CartaoDeCredito, você só chama cartao.comprar(valor) e ele se vira.

3. Ordenação: Comparable vs Comparator

Você usou:

historico_de_compras.sort(Comparator.comparing(Aux::getValor));

Isso é excelente.

  • A aula: Ensinou implements Comparable para definir uma "ordenação natural" da classe.
  • Você: Usou um Comparator externo. Isso é ótimo porque permite ordenar por valor, depois por nome, depois por data, sem ter que mudar a classe original. Ponto positivo para você aqui.

O seu código é funcional e mostra que você sabe manipular listas e loops. Pra torná-lo um código orientado a objetos "profissional", o próximo passo é tirar a lógica de if/else da Main e delegar para as classes.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Muito obrigado Lorena pelo feedback.