Oi Leonardo, tudo bem?
Boa pergunta. O primeiro exemplo declara Saldo
como propriedade automaticamente implementada (autoproperty) e, como você bem lembrou, um campo privado saldo
é criado automaticamente pelo compilador. Como esse campo não está visível, você é obrigado a usar os acessadores get e set da propriedade dentro do método Sacar()
.
Vamos dar uma olhada na propriedade:
public double Saldo { get; set; }
O maior problema que vejo aqui nem é o uso ou não do campo com underscore no lugar da propriedade. Se você usar a propriedade no lugar do campo, a diferença vai ser imperceptível.
O problema mais sério aqui é que você está expondo a propriedade com o modificador public
. Isso permite que um código externo à classe modifique diretamente o saldo da conta, o que é inaceitável, pois a classe precisa proteger esse valor.
No mínimo, você deveria esconder o acessador set, com private
ou protected
:
public double Saldo { get; private set; }
Dessa forma, somente a própria classe (ou uma subclasse poderia modificar o saldo).
Outro problema que vi foi o uso de um valor de retorno, caso o valor do saque seja maior que o saldo:
if (Saldo <= valor)
{
return false;
}
Esse tipo de código é uma herança da programação procedural (pré-OOP) e portanto considerado obsoleto. Você poderia substituir o "return false" por uma exceção, por exemplo:
if (Saldo <= valor)
{
throw new SaldoInsuficienteException();
}
Assim, em vez de tratar o valor de retorno no código cliente (o que pode não acontecer, por descuido de programação), uma exceção representa uma anormalidade na execução, e portanto obriga o desenvolvedor a capturar tratar o problema.
Note que estamos usando aqui uma classe customizada de exceção, SaldoInsuficienteException
, que é para deixar bem claro o que aconteceu. Você pode também encapsular uma mensagem de erro bem descritiva dentro da classe de exceção.
Outro ponto que observei também é que a condição if (Saldo <= valor)
não permite que o usuário saque todo o saldo. Talvez devesse, o que acha?
if (Saldo < valor)
{
throw new SaldoInsuficienteException();
}