1
resposta

[Dúvida] Acho que fiz da maneira mais desorganizada possivel

O programa funcionou da maneira que foi pedida mas acho que fiz da maneira mais complicada e confusa possivel haha queria a opiniao de um dos professor sobre o codigo e o que poderia ser melhorado

`public class ControleCartao { String itemComprado;

private String getItemComprado() {
    return itemComprado;
}

private int getLimiteCartao() {
    return limiteCartao;
}

private static int getValorDoProduto() {

    return valorDoProduto;
}

public void totalFatura(){
  limiteCartao = this.limiteCartao - this.valorDoProduto;
}

@Override
public String toString() {
    return ("\n" + itemComprado + " - " + valorDoProduto);
}

int limiteCartao = 0;
static int valorDoProduto = 0;

} `

public class Main extends ControleCartao {
    public static void main(String[] args) {

         int operacoes = 4;

        List<String> lista = new ArrayList<>();
        Scanner scanner = new Scanner(System.in);
        ControleCartao controlecartao = new ControleCartao();

        System.out.println("Digite o limite do cartão.");
        controlecartao.limiteCartao = scanner.nextInt();


       while( operacoes != 0 ) {

           System.out.println("Digite o item comprado.");
           controlecartao.itemComprado = scanner.next();
           System.out.println("Digite o valor do produto.");
           controlecartao.valorDoProduto = scanner.nextInt();


           if (controlecartao.limiteCartao <= controlecartao.valorDoProduto) {
               System.out.println("Saldo insuficiente");
               break;
           } else if (controlecartao.limiteCartao >= controlecartao.valorDoProduto) {
               System.out.println("Compra Realizada");
               controlecartao.totalFatura();
           }

           System.out.println("Digite 0 para sair e 1 para continuar comprando");
           operacoes = scanner.nextInt();

           lista.add(controlecartao.toString());

           }

         Collections.sort(lista);
        System.out.println("\nCompras Realizadas\n*******************\n");
        System.out.println(lista.toString());
        System.out.println("\nSeu saldo do cartão é: " + controlecartao.limiteCartao);
       }
    }
1 resposta

Olá, Danilo! Vejo que você conseguiu fazer o programa rodar corretamente, isso é ótimo! Parabéns pelo esforço. Vamos agora analisar o seu código e ver como podemos melhorá-lo.

A primeira coisa que notei é que você tem variáveis de instância (limiteCartao e valorDoProduto) sendo acessadas diretamente, o que não é uma boa prática em Java. É recomendado encapsular essas variáveis e acessá-las através de métodos getters e setters. No entanto, você já criou os métodos getters, mas não os utilizou.

Outra coisa que notei é que você está usando a classe Main para estender a classe ControleCartao. Isso não é uma boa prática, pois a classe Main geralmente é usada para iniciar a aplicação e não deve estender outras classes.

Além disso, a classe ControleCartao tem responsabilidades demais. Ela está lidando com a lógica de negócios (como o cálculo do saldo do cartão) e também com a entrada de dados do usuário. Isso viola o princípio de responsabilidade única. Seria melhor dividir essas responsabilidades entre diferentes classes.

Aqui está um exemplo de como você poderia reestruturar seu código:

public class ControleCartao {
    private int limiteCartao;
    private int valorDoProduto;
    private String itemComprado;

    public ControleCartao(int limiteCartao) {
        this.limiteCartao = limiteCartao;
    }

    public String getItemComprado() {
        return itemComprado;
    }

    public void setItemComprado(String itemComprado) {
        this.itemComprado = itemComprado;
    }

    public int getLimiteCartao() {
        return limiteCartao;
    }

    public int getValorDoProduto() {
        return valorDoProduto;
    }

    public void setValorDoProduto(int valorDoProduto) {
        this.valorDoProduto = valorDoProduto;
    }

    public void totalFatura(){
        this.limiteCartao -= this.valorDoProduto;
    }

    @Override
    public String toString() {
        return ("\n" + itemComprado + " - " + valorDoProduto);
    }
}

public class Main {
    public static void main(String[] args) {
        int operacoes = 4;
        List<String> lista = new ArrayList<>();
        Scanner scanner = new Scanner(System.in);

        System.out.println("Digite o limite do cartão.");
        ControleCartao controlecartao = new ControleCartao(scanner.nextInt());

        while( operacoes != 0 ) {
            System.out.println("Digite o item comprado.");
            controlecartao.setItemComprado(scanner.next());
            System.out.println("Digite o valor do produto.");
            controlecartao.setValorDoProduto(scanner.nextInt());

            if (controlecartao.getLimiteCartao() <= controlecartao.getValorDoProduto()) {
                System.out.println("Saldo insuficiente");
                break;
            } else if (controlecartao.getLimiteCartao() >= controlecartao.getValorDoProduto()) {
                System.out.println("Compra Realizada");
                controlecartao.totalFatura();
            }

            System.out.println("Digite 0 para sair e 1 para continuar comprando");
            operacoes = scanner.nextInt();

            lista.add(controlecartao.toString());
        }

        Collections.sort(lista);
        System.out.println("\nCompras Realizadas\n*******************\n");
        System.out.println(lista.toString());
        System.out.println("\nSeu saldo do cartão é: " + controlecartao.getLimiteCartao());
    }
}

Neste exemplo, criei um construtor para a classe ControleCartao que aceita o limite do cartão como argumento. Também criei métodos setters para itemComprado e valorDoProduto. Na classe Main, criei uma instância de ControleCartao usando o construtor e usei os métodos setters para definir itemComprado e valorDoProduto.

Espero que isso ajude a tornar o seu código mais claro e organizado. Lembre-se, a prática leva à perfeição, então continue codificando e experimentando!

Espero ter ajudado e bons estudos!

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