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.