vejamos um exemplo:
public void baixarCliente(){
boolean abertas = false;
for (Fatura fatura : cliente.getFaturas()){
if (fatura.getStatus().equals(Status.EM_ABERTO)){
abertas = true;
break;
}
}
if (abertas)
throw new FaturasEmAbertoException();
cliente.setBaixado(true);
cliente.setDataBaixa(new Date());
MailSender mail = new MailSender("Baixa.modelo");
mail.send(cliente.getEmail());
}
Este Código por exemplo ao ler ele com cuidado podemos entender e ele faz o que é necessário.Mas poderia ser simplificado para poder transmitir mais conhecimento. Vejam como ficaria refatorado.
public void baixarCliente(){
if (clientePossuiFaturasEmAberto())
throw new FaturasEmAbertoException();
registraBaixaDoClienteEEnviaEmailParaOCliente();
}
private void registraBaixaDoClienteEEnviaEmailParaOCliente(){
cliente.setBaixado(true);
cliente.setDataBaixa(new Date());
enviaEmailParaOClienteNotificandoABaixa();
}
private void enviaEmailParaOClienteNotificandoABaixa(){
new MailSender("Baixa.modelo").send(cliente.getEmail());
}
private boolean clientePossuiFaturasEmAberto(){
for (Fatura fatura : cliente.getFaturas())
if (fatura.getStatus().equals(Status.EM_ABERTO))
return true;
return false;
}
Com um código como esse fica mais claro as operações que estão sendo executadas. Ao ler o código que faz a baixa do cliente:
if (clientePossuiFaturasEmAberto()) throw new FaturasEmAbertoException(); registraBaixaDoClienteEEnviaEmailParaOCliente();fica claro as verificações que são feitas.
ao desenvolver pense em fazer isso, pois os benefícios serão vistos na manutenção do seu sistema.