Skip to content

Instantly share code, notes, and snippets.

@marcospereira
Created January 26, 2012 16:58
Show Gist options
  • Save marcospereira/1683776 to your computer and use it in GitHub Desktop.
Save marcospereira/1683776 to your computer and use it in GitHub Desktop.
Como remover a anemia do seu código
// 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