Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Como consumir nossas entidades que usam Interface Seggregation?

Pense em um Service que agora lida com Informe de Rendimentos. E modificamos nosso Funcionario pra que ele tenha uma coleção de reajustes que recebeu.

public class Funcionario {
   private List<Reajuste> reajustes;
}
public class InformeRendimentosService {
   public BigDecimal extrato(Funcionario funcionario) {
      BigDecimal impostoPago = BigDecimal.ZERO;
      for(Reajuste reajuste : funcionario.getReajustes()) {
         impostoPago = impostoPago.add(reajuste.valorImpostoDeRenda());
      }
      return impostoPago;
   }
}

Bom, o código acima não funciona bem, sequer compila, pois o método 'valorImpostoDeRenda()' não existe em Reajuste, existe apenas em ReajusteTributavel. Porém a lista de reajustes do funcionário pode conter tanto Anuenios quanto Promoções. Qual a melhor saída pra esse caso?

3 respostas

Oi Leandro,

Bom, nesse caso como a classe serviceprecisa trabalhar apenas com ReajusteTributavel, ela vai precisar de alguma forma filtrar apenas esse tipo de reajuste.

Daria para fazer dese jeito:

List<ReajusteTributavel> reajustes = funcionario.getReajustes().filter(r -> r instanceof ReajusteTributavel).collect(Collectors.toList());
for(Reajuste reajuste : reajustes) {
    impostoPago = impostoPago.add(reajuste.valorImpostoDeRenda());
}

Bons estudos!

Obrigado pela resposta tão rápida!

Daria pra fazer como você sugeriu. Depois eu pensei e daria pra fazer assim também:

public class Funcionario {
   private List<Reajuste> reajustes;
   public reajustesTributaveis() {
      return this.reajustes.filter(r -> r instanceof ReajusteTributavel).collect(Collectors.toList());
   }
}

O dia que mudar a regra de retornar quais foram os reajustes tributáveis pra um funcionário, está só lá. (Sei lá, imagine um atributo booleano active). Só fico na dúvida ainda se essa deveria ser uma responsabilidade de Funcionario...

Me parece que não é responsabilidade de um funcionário saber quais foram os reajustes tributáveis. Mas ao mesmo tempo parece ruim ter essa regra diluída em pontos do sistema (Imagine que além do InformeDeRendimentosService algum outro service também precisa dessa informação...)

solução!

Oi Leandro,

Pois é, aí acaba caindo num dilema, pois em ambos os casos tem vantagens e desvantagens :D Não vai ter uma solução única que é 100% "perfeita", devendo você avaliar qual delas vai seguir.

Eu particularmente optaria pela opção que você sugeriu, de criar um método na classe Funcionario, para evitar as possíveis duplicações.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software