1
resposta

[Projeto] Desafio de Conta Bancária - Concluído

import java.util.Scanner;

public class Desafio {
    public static void main(String[] args) {
        String nome = "Ashley Feitosa";
        String tipoConta = "Corrente";
        double saldo = 3000;
        int opcao = 0;

        System.out.println("******************************");
        System.out.println("\nNome do cliente: " + nome);
        System.out.println("Tipo de conta: " + tipoConta);
        System.out.println("Saldo atual da conta: " + saldo);
        System.out.println("\n******************************");

        String menu = """
                *** Digite uma opção ***
                
                1 - Consultar saldo
                2 - Transferir valor
                3 - Receber/Depositar valor
                4 - Realizar pagamento
                5 - Encerrar
                """;

        Scanner leitura = new Scanner(System.in);

        while (opcao != 5) {
            System.out.println(menu);
            opcao = leitura.nextInt();

            if (opcao == 1) {
                System.out.println("O saldo atual é " + saldo);

            } else if (opcao == 2) {
                System.out.println("Você tem " + saldo + " na sua conta.");
                System.out.println("Qual o valor que deseja transferir?");
                double valor = leitura.nextDouble();

                if (valor > saldo) {
                    System.out.println("Saldo insuficiente!");
                } else {
                    saldo -= valor;
                    System.out.println("Novo saldo: " + saldo);
                }

            } else if (opcao == 3) {
                System.out.println("Valor recebido/depositado:");
                double valor = leitura.nextDouble();
                saldo += valor;
                System.out.println("Novo saldo: " + saldo);

            } else if (opcao == 4) {
                System.out.println("Qual o valor que deseja pagar?");
                double valor = leitura.nextDouble();

                if (valor > saldo) {
                    System.out.println("Saldo insuficiente para pagamento!");
                } else {
                    saldo -= valor;
                    System.out.println("Pagamento concluído!");
                    System.out.println("Seu saldo atual é: " + saldo);
                }

            } else if (opcao == 5) {
                System.out.println("Encerrando sistema...");
                System.out.println("Sistema encerrado!");

            } else {
                System.out.println("Opção inválida!");
            }
        }

        leitura.close();
    }
}

Foi assim que ficou o meu código, acabei adicionando algo mais, a opção de realizar pagamento, só não sei se ficou bom e usável aí.

1 resposta

Primeiramente, parabéns pelo trabalho! Sua lógica está muito refinada, até me impressionou o seu código e como você foi além do que lhe foi proposto no desafio.

Com relação a “só não sei se ficou bom” e “usável”, a questão é que, da forma que seu código está atualmente, ele é muito confuso. Pense comigo: se você fosse contratada por uma empresa para refatorar um código e esse código fosse esse seu código acima, ou você tivesse de explicá-lo para alguém, você conseguiria? Pense não como a pessoa que fez o código, mas como alguém aleatório que foi o sortudo para remodulá-lo. O que quero dizer é que, por mais boa que a lógica seja, esse código está muito confuso e de difícil leitura por conta do encadeamento e lógica acoplada num único método.

Isso é um fator a se relevar, porque você não está fazendo um código para a máquina, mas sim para outras pessoas. Pensar nisso pode lhe abrir os olhos, e, pensando nisso, o “usável”, sim, ele está, mas o “só não sei se ficou bom” é o ponto a se tocar. Ele está bom se for seus primeiros contatos com a linguagem, mas, de forma crítica, há pontos a se revisar para obter algo mais performático, mesmo que esse “performático” seja só em relação ao fator leitura de código.

Melhorias

1. Validar valores negativos e zero
Com a lógica atual, é possível depositar valores negativos, como -500, e isso não faz muito sentido, ou mesmo pagar ou transferir R$ 0. A correção seria:

Função utilitária:

private static boolean valorInvalido(BigDecimal valor) {
    return valor == null || valor.compareTo(BigDecimal.ZERO) <= 0;
}

Uso:

if (valorInvalido(valor)) {
    System.out.println("Valor deve ser maior que zero.");
    continue;
}

2. Trocar if/else por switch
Em alguns casos, trocar um encadeamento de if/else por um switch ajuda a dar mais legibilidade ao código:

switch (opcao) {
    case 1:
        System.out.println("O saldo atual é " + saldo);
        break;

    case 2:
        // transferir
        break;

    case 3:
        // depositar
        break;

    case 4:
        // pagar
        break;

    case 5:
        System.out.println("Encerrando sistema...");
        break;

    default:
        System.out.println("Opção inválida!");
}

3. Separar lógica em métodos
Ao invés de deixar toda a lógica concentrada no seu main, dividi-la em métodos, assim fica mais fácil de manter.

Exemplo:

private static BigDecimal transferir(Scanner leitura, BigDecimal saldo) {
    System.out.println("Você tem " + saldo + " na sua conta.");
    System.out.print("Qual o valor que deseja transferir? ");
    BigDecimal valor = leitura.nextBigDecimal();

    if (valor.compareTo(BigDecimal.ZERO) <= 0) {
        System.out.println("Valor inválido!");
        return saldo;
    }

    if (valor.compareTo(saldo) > 0) {
        System.out.println("Saldo insuficiente!");
        return saldo;
    }

    saldo = saldo.subtract(valor);
    System.out.println("Novo saldo: " + saldo);
    return saldo;
}

Uma pequena parte da logica do seu codigo refatorada:

public class Desafio {

    public static void main(String[] args) {
        String nome = "Ashley Feitosa";
        String tipoConta = "Corrente";
        BigDecimal saldo = new BigDecimal("3000.00");

        String menu = """
                *** Digite uma opção ***
                
                1 - Consultar saldo
                2 - Transferir valor
                3 - Receber/Depositar valor
                4 - Realizar pagamento
                5 - Encerrar
                """;

        try (Scanner leitura = new Scanner(System.in)) {
            int opcao;

            do {
                opcao = lerOpcao(leitura, menu);

                switch (opcao) {
                    case 1 -> System.out.println("O saldo atual é " + saldo);
                    case 2 -> saldo = transferir(leitura, saldo);
                    case 3 -> saldo = depositar(leitura, saldo);
                    case 4 -> saldo = pagar(leitura, saldo);
                    case 5 -> System.out.println("Sistema encerrado!");
                    default -> System.out.println("Opção inválida!");
                }

            } while (opcao != 5);
        }
    }