Created
January 26, 2012 16:58
-
-
Save marcospereira/1683776 to your computer and use it in GitHub Desktop.
Como remover a anemia do seu código
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// anemica | |
public class Conta { | |
private BigDecimal saldo; | |
private String numero; | |
private String agencia; | |
public Conta(BigDecimal saldo, String numero, String agencia) { | |
this.saldo = saldo; | |
this.numero = numero; | |
this.agencia = agencia; | |
} | |
public BigDecimal getSaldo() { return this.saldo; } | |
public String getNumero() { return this.numero; } | |
public String getAgencia() { return this.agencia; } | |
public void setSaldo(BigDecimal saldo) { this.saldo = saldo; } | |
public void setNumero(String numero) { this.numero = numero; } | |
public void setAgencia(String agencia) { this.agencia = agencia; } | |
} | |
public class ContaService { | |
public void transferir(String contaOrigem, String contaDestino, BigDecimal valor) { | |
Conta origem = buscarConta(contaOrigem); | |
Conta destino = buscarConta(contaDestino); | |
if(origem.getSaldo() > valor) { | |
this.contaDestino.setSaldo(this.contaDestino.getSaldo() + valor); | |
this.contaOrigem.setSaldo(this.contaOrigem.getSaldo() - valor); | |
salvar(origem); | |
salvar(destino); | |
} | |
} | |
} | |
// menos anemica, mas ainda assim com encapsulamento ferrado | |
public class Conta { | |
private BigDecimal saldo; | |
private String numero; | |
private String agencia; | |
public Conta(BigDecimal saldo, String numero, String agencia) { | |
this.saldo = saldo; | |
this.numero = numero; | |
this.agencia = agencia; | |
} | |
public BigDecimal getSaldo() { return this.saldo; } | |
public String getNumero() { return this.numero; } | |
public String getAgencia() { return this.agencia; } | |
public void setSaldo(BigDecimal saldo) { this.saldo = saldo; } | |
public void setNumero(String numero) { this.numero = numero; } | |
public void setAgencia(String agencia) { this.agencia = agencia; } | |
public boolean podeTransferir(BigDecimal valor) { | |
return this.saldo > valor; | |
} | |
public void adicionarAoSaldo(BigDecimal valor) { | |
this.saldo += valor; | |
} | |
public void subtrairDoSaldo(BigDecimal valor) { | |
this.saldo -= valor; | |
} | |
} | |
public class ContaService { | |
public void transferir(String contaOrigem, String contaDestino, BigDecimal valor) { | |
Conta origem = buscarConta(contaOrigem); | |
Conta destino = buscarConta(contaDestino); | |
if(origem.podeTransferir(valor)) { | |
this.contaDestino.adicionarAoSaldo(valor); | |
this.contaOrigem.subtrairDoSaldo(valor); | |
salvar(origem); | |
salvar(destino); | |
} | |
} | |
} | |
// removendo anemia de vez | |
public class Conta { | |
private BigDecimal saldo; | |
private String numero; | |
private String agencia; | |
public Conta(BigDecimal saldo, String numero, String agencia) { | |
this.saldo = saldo; | |
this.numero = numero; | |
this.agencia = agencia; | |
} | |
public BigDecimal getSaldo() { return this.saldo; } | |
public String getNumero() { return this.numero; } | |
public String getAgencia() { return this.agencia; } | |
public void setSaldo(BigDecimal saldo) { this.saldo = saldo; } | |
public void setNumero(String numero) { this.numero = numero; } | |
public void setAgencia(String agencia) { this.agencia = agencia; } | |
public boolean transferir(Conta destino, BigDecimal valor) { | |
if (podeTransferir(valor)) { | |
this.destino.saldo += valor; | |
this.saldo -= valor; | |
return true; | |
} | |
return false; | |
} | |
private boolean podeTransferir() { return this.saldo > valor; } | |
} | |
public class ContaService { | |
public void transferir(String contaOrigem, String contaDestino, BigDecimal valor) { | |
Conta origem = buscarConta(contaOrigem); | |
Conta destino = buscarConta(contaDestino); | |
boolean transferidoComSucesso = origem.transferir(contaDestino, valor); | |
if(transferidoComSucesso) { | |
salvar(origem); | |
salvar(destino); | |
} | |
} | |
} | |
// ultimo refactoring para deixar o codigo mais "seguro" | |
public class Conta { | |
private BigDecimal saldo; | |
private String numero; | |
private String agencia; | |
public Conta(BigDecimal saldo, String numero, String agencia) { | |
this.saldo = saldo; | |
this.numero = numero; | |
this.agencia = agencia; | |
} | |
public BigDecimal getSaldo() { return this.saldo; } | |
public String getNumero() { return this.numero; } | |
public String getAgencia() { return this.agencia; } | |
public void setSaldo(BigDecimal saldo) { this.saldo = saldo; } | |
public void setNumero(String numero) { this.numero = numero; } | |
public void setAgencia(String agencia) { this.agencia = agencia; } | |
public void transferir(Conta destino, BigDecimal valor) { | |
if (podeTransferir(valor)) { | |
this.destino.saldo += valor; | |
this.saldo -= valor; | |
} else { | |
throw new SaldoInsuficienteException(origem, destino, valor); | |
} | |
} | |
private boolean podeTransferir() { return this.saldo > valor; } | |
} | |
public class ContaService { | |
public void transferir(String contaOrigem, String contaDestino, BigDecimal valor) { | |
Conta origem = buscarConta(contaOrigem); | |
Conta destino = buscarConta(contaDestino); | |
origem.transferir(contaDestino, valor); | |
} | |
} | |
// A abordagem do Play! | |
// Até o exemplo anterior, ainda iriamos precisar de uma | |
// camada acima que fizesse interface com usuário. Abstrai essa | |
// camada apenas para deixar o exemplo mais simples. | |
// No Play! as duas classes abaixo são tudo o que precisamos | |
// Teoricamente, eu não "quebrei" o encapsulamento e ainda deixei | |
// o código mais fácil de testar (o metodo transferir não | |
// precisa de nenhum setup para ser testado). | |
public class Conta { | |
public BigDecimal saldo; | |
public String numero; | |
public String agencia; | |
public Conta(BigDecimal saldo, String numero, String agencia) { | |
this.saldo = saldo; | |
this.numero = numero; | |
this.agencia = agencia; | |
} | |
public void transferir(Conta destino, BigDecimal valor) { | |
if (podeTransferir(valor)) { | |
this.destino.saldo += valor; | |
this.saldo -= valor; | |
} else { | |
throw new SaldoInsuficienteException(origem, destino, valor); | |
} | |
} | |
public static Conta buscarPorNumero(String numero) { | |
return Conta.find("numero = ? ", numero).first(); | |
} | |
private boolean podeTransferir() { return this.saldo > valor; } | |
} | |
public class ContaController extends Controller { | |
public static void transferir(String contaOrigem, String contaDestino, BigDecimal valor) { | |
Conta origem = Conta.buscarPorNumero(contaOrigem); | |
Conta destino = Conta.buscarPorNumero(contaDestino); | |
origem.transferir(contaDestino, valor); | |
render(origem, destino); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment