Na resposta do exercício o instrutor cria os métodos para depositar e sacar nas classes de Estado. Eu, por outro lado, criei os métodos de sacar e depositar na classe conta e estabeleci as regras de depósito (desconto de percentual) e saque (autorização de saque) nas classes de estado. Ficou com um pouquinho a mais de código, mas acredito que as responsabilidades de cada classe e método estejam bem atribuídas e legíveis. Pergunto-lhes, há algo errado com a solução que adotei (podendo me causar algum transtorno no futuro)?
<?php
class Conta
{
private $nome;
private $saldo;
private $estado;
public function __construct($nome, $saldo)
{
$this->nome = $nome;
$this->saldo = $saldo;
$this->setEstado();
}
public function getNome()
{
return $this->nome;
}
public function getSaldo()
{
return $this->saldo;
}
public function deposita($valor)
{
$valor = $this->estado->descontaDeposito($valor);
$this->saldo += $valor;
$this->setEstado();
}
public function saca($valor)
{
if($this->estado->autorizaSaque()) {
$this->saldo -= $valor;
} else {
throw new Exception ("Não é possível realizar o saque de conta com estado negativo");
}
$this->setEstado();
}
private function setEstado()
{
if($this->saldo > 0) {
$this->estado = new EstadoPositivo;
} else {
$this->estado = new EstadoNegativo;
}
}
}
<?php
require_once 'EstadoConta.php';
class EstadoPositivo implements EstadoConta
{
public function descontaDeposito($valor)
{
return $valor - $valor * 0.02;
}
public function autorizaSaque()
{
return true;
}
}
<?php
require_once 'EstadoConta.php';
class EstadoNegativo implements EstadoConta
{
public function descontaDeposito($valor)
{
return $valor - $valor * 0.05;
}
public function autorizaSaque()
{
return false;
}
}