2
respostas

[Projeto] Projeto final do desafio

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner leitura = new Scanner(System.in);
        System.out.println(Constantes.extratoInicial);
        Conta minhaConta = new Conta();
        int operacao;

        do {
            System.out.println(Constantes.textoOperacoes);
            System.out.println(Constantes.msgSelecionarOperacao);
            operacao = leitura.nextInt();

            switch (operacao) {
                case Constantes.operacaoConsultarSaldo:
                    OperacoesConta.retornarSaldo(minhaConta.consultarSaldo());
                    break;
                case Constantes.operacaoReceberValor:
                    OperacoesConta.receberValor(leitura, minhaConta);
                    break;
                case Constantes.operacaoTransferirValor:
                    OperacoesConta.transferirValor(leitura, minhaConta);
                    break;
                case Constantes.operacaoSair:
                    System.out.println(Constantes.msgSessaoEncerrada);
                    break;
                default:
                    System.out.println(Constantes.msgOperacaoInvalida);
            }

        } while (operacao != Constantes.operacaoSair);
        leitura.close();
    }

}

import java.util.Scanner;

public class OperacoesConta {
    public static boolean testarSaldoSuficiente(double valor, double saldo) {
        return valor > saldo;
    }

    public static void retornarSaldo(double saldo) {
        System.out.println(saldo);
    }

    public static void receberValor(Scanner leitura, Conta conta) {
        System.out.println(Constantes.msgValorAReceber);
        double valorReceber = leitura.nextDouble();
        conta.receberValor(valorReceber);
        System.out.println(Constantes.msgSaldoAtualizado + conta.consultarSaldo());
    }

    public static void transferirValor(Scanner leitura, Conta conta) {
        System.out.println(Constantes.msgTransferirValor);
        double valorTransferir = leitura.nextDouble();

        if (testarSaldoSuficiente(valorTransferir, conta.consultarSaldo())) {
            System.out.println(Constantes.msgSaldoInsuficiente);
        } else {
            conta.transferirValor(valorTransferir);
            System.out.println(Constantes.msgSaldoAtualizado + conta.consultarSaldo());
        }
    }
}
public class Conta {

    private double saldo;

    public Conta () {
        saldo = 2500.00;
    }

    public double consultarSaldo() {
        return this.saldo;
    }

    public void receberValor(double valor) {
        if (valor > 0) {
            this.saldo += valor;
        }
    }

    public void transferirValor(double valor) {
        if ((valor > 0) && (this.saldo >= valor)) {
            this.saldo -= valor;
        }
    }

}

public class Constantes {
    public static final String extratoInicial = """
            ***********************
            Dados iniciais do cliente:
            
            Nome: Thiago Souza
            Tipo conta: Corrente
            Saldo inicial: R$ 2500,00
            ***********************
            """;

    public static final String textoOperacoes = """
            Operações

            1- Consultar saldos
            2- Receber valor
            3- Transferir valor
            4- Sair
            """;

    public static final int operacaoConsultarSaldo = 1;
    public static final int operacaoReceberValor = 2;
    public static final int operacaoTransferirValor = 3;
    public static final int operacaoSair = 4;
    public static final String msgValorAReceber = "Informe o valor a receber: ";
    public static final String msgTransferirValor = "Informe o valor que deseja transferir: ";
    public static final String msgSaldoInsuficiente = "Não há saldo suficiente para fazer essa transferência.";
    public static final String msgSaldoAtualizado = "Saldo atualizado: ";
    public static final String msgSelecionarOperacao = "Digite a opção desejada: ";
    public static final String msgOperacaoInvalida = "Opção inválida.";
    public static final String msgSessaoEncerrada = "Sessão encerrada.";
}
2 respostas

Olá, Thiago. Como vai?

Parabéns por concluir e compartilhar o seu projeto final do desafio! Analisei o seu código e achei excelente a forma como você estruturou a sua aplicação.

Gostaria de destacar alguns pontos muito positivos na sua solução:

  • Separação de Responsabilidades: Criar classes distintas como Conta, OperacoesConta e Constantes mostra que você já está aplicando conceitos avançados de organização de projeto e código limpo. Isso facilita muito a leitura, os testes e a futura manutenção do sistema.
  • Uso de Constantes: Isolar os textos e as opções numéricas na classe Constantes é uma excelente prática profissional. Isso evita os famosos "números mágicos" e impede que regras fiquem perdidas no meio da lógica principal.
  • Encapsulamento: Manter o atributo saldo como private na classe Conta e permitir sua alteração apenas através de métodos específicos (receber e transferir) é exatamente o propósito da Orientação a Objetos.

Para agregar valor ao seu aprendizado, deixo duas sugestões práticas para você pensar nos seus próximos projetos:

1. Valores flexíveis pelo Construtor:
Atualmente, a sua classe Conta inicia sempre com o saldo fixo de 2500.00. Para tornar essa classe ainda mais genérica e reutilizável (por exemplo, criar contas para outros clientes com saldos diferentes), você pode exigir esses dados no momento da criação da conta através do construtor:

public class Conta {
    private double saldo;

    // Construtor recebendo o valor inicial
    public Conta(double saldoInicial) {
        this.saldo = saldoInicial;
    }
    
    // ... restante dos métodos
}

Na sua Main, a chamada ficaria: Conta minhaConta = new Conta(2500.00);

2. Tipos de dados para cálculos financeiros:
Para este curso inicial, utilizar o tipo double é a abordagem correta e esperada. No entanto, como curiosidade para o seu futuro profissional: no mercado de trabalho evitamos usar double para lidar com dinheiro. Isso acontece porque números de ponto flutuante podem sofrer perdas de precisão em operações matemáticas (por exemplo, um cálculo simples gerando um resultado como 0.30000000000000004). Em sistemas bancários reais em Java, a classe mais recomendada para evitar esses erros de arredondamento é a BigDecimal. Vale a pena pesquisar sobre ela mais para a frente!

Seu raciocínio lógico está ótimo. Continue praticando com essa mesma dedicação.

Espero que possa ter lhe ajudado!

Oi, Evandro! Tudo bem e por ai?

Muito obrigado pelas dicas! Vou aplicá-las aqui no projeto!