Existem vários princípios que ajudam na implementação de códigos mais desacoplados e tudo mais, aqui a ideia e exemplificar como podemos fazer isso.
Exemplo
Imagine que estamos implementando um código que vende jornal, teremos uma entidade que representa a Banca e outra que representa a Carteira de um cliente.
Implementação acoplada
public void pagaJornal(BigDecimal valorJornal, Carteira carteira){
if(carteira.getSaldo().compareTo(valorJornal) > 0){
cateira.debitaSaldo(valorJornal);
}else{
// exception SaldoInsuficiente
}
}
Nessa primeira abordagem a Banca pega a carteira do cliente verifica se tem o valor necessário e caso sim tira o valor do jornal de dentro da certeira do cliente, talvez isso não seja tão legal pois a Banca sabe muito sobre a carteira do cliente.
Implementação desacoplada
Agora vamos implementar uma solução de uma forma mais desacoplada.
class Carteira{
private BigDecimal saldo;
public void paga(BigDecimal valorADebitar) throws SemSaldoException {
if(this.saldo.compareTo(valorADebitar) > 0){
this.saldo = this.saldo.substract(valorADebitar);
}else{
throw new SemSaldoException();
}
}
}
class Banca{
public void pagaJornal(BigDecimal valorJornal, Carteira carteira){
try{
carteira.paga(valorJornal);
}catch(Exception e){
// exception SaldoInsuficiente
}
}
}
Nessa segunda abordagem a regra de saldo fica dentro da própria carteira, dessa forma a entidade Carteira está mais livre para cuidar da sua responsabilidade, caso seja necessário incluir essa mesma funcionalidade em outra parte do projeto agora será mais simples.
Referência
Principio de Demeter https://pt.wikipedia.org/wiki/Lei_de_Demeter
Engenharia Moderna https://www.amazon.com.br/Engenharia-Software-Moderna-Marco-Valente/dp/6500019504
Curtiu ? Me segue nas redes 😉