1
resposta

[Projeto] Faça como eu fiz: validação de saque

class ContaBancaria
{
    private decimal saldo;

    internal SegurancaConta seguranca;

    public ContaBancaria(string titular, decimal saldo)
    {
        this.saldo = saldo;
        Titular = titular;
        seguranca = new SegurancaConta();
    }

    public string Titular { get; private set; }

    public void Sacar(decimal valor)
    {
        if(seguranca.ValidarSaque(valor))
        {
            saldo -= valor;
            Console.WriteLine("Saque realizado com sucesso.");
            Console.WriteLine($"Saldo atual: {saldo:C}");
        }
        else
        {
            Console.WriteLine("Saque negado pela política de segurança.");
        }
    }

}

internal class SegurancaConta
{
    private const int VALOR_MAXIMO_PERMITIDO = 1000;

    internal bool ValidarSaque(decimal valor)
    {
        return valor < VALOR_MAXIMO_PERMITIDO;
    }
}

ContaBancaria conta = new ContaBancaria("Carlos Silva", 2500);
conta.Sacar(1500); // inválido
conta.Sacar(800);  // válido
1 resposta

Olá, Eduardo. Como vai?

Parabéns por concluir mais esse projeto! Sua implementação demonstra uma compreensão avançada de como o Encapsulamento pode ser usado para distribuir responsabilidades entre classes, um princípio conhecido como Responsabilidade Única (SRP).

Gostaria de destacar os pontos mais técnicos e positivos da sua solução:

  • Delegação de Lógica: Ao criar a classe SegurancaConta, você evitou que a ContaBancaria ficasse sobrecarregada com regras de validação complexas. Isso torna o código muito mais fácil de testar e manter.
  • Uso de Constantes: Definir VALOR_MAXIMO_PERMITIDO como uma const é uma excelente prática. Isso evita o uso de "números mágicos" espalhados pelo código e facilita uma futura alteração no limite de saque em um único lugar.
  • Modificadores de Acesso: O uso do internal para a classe de segurança e para o campo dentro da conta mostra que você está pensando na visibilidade do código dentro do projeto, protegendo essas regras de serem acessadas indevidamente por bibliotecas externas.

Para levar seu aprendizado um passo adiante, notei um pequeno detalhe na sua regra de negócio:

Atualmente, o método Sacar verifica apenas se o valor está dentro do limite da SegurancaConta. Em um sistema real, você também precisaria verificar se o saldo disponível é suficiente para cobrir o saque.

Uma forma elegante de integrar isso seria:

public void Sacar(decimal valor)
{
    // Verifica primeiro o saldo e depois a política de segurança
    if (valor <= saldo && seguranca.ValidarSaque(valor))
    {
        saldo -= valor;
        Console.WriteLine("Saque realizado com sucesso.");
    }
    else if (valor > saldo)
    {
        Console.WriteLine("Erro: Saldo insuficiente.");
    }
    else
    {
        Console.WriteLine("Saque negado pela política de segurança.");
    }
}

Sua evolução nos conceitos de Orientação a Objetos está muito sólida. Você está saindo do básico e já construindo arquiteturas que fazem sentido para aplicações profissionais.

Espero que possa ter lhe ajudado!