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

A implementação concreta não ficaria muito grande?

A implementação concreta não ficaria muito grande?

Ex.: new ReajusteService(List.of( new ValidarPercentualReajuste(), new ValidarPeriodicidadeReajuste() // e assim por diante )).reajustarSalarioFuncionario(funcionario, aumento);

Como poderiamos resolver isso? Ou está tudo bem em ficar assim?

2 respostas
solução!

Olá Lucas, Essa é uma forma, você poderia passar uma lista ao invés de instanciar a lista no construtor, ex.

List<ValidacaoReajuste> validacoes = new ArrayList<>();
validacoes.add(new ValidarPercentualReajuste());
validacoes.add(new ValidarPeriodicidadeReajuste());

new ReajusteService(validacoes).reajustarSalarioFuncionario(funcionario, aumento);

Factories

Dá para melhorar isso um pouco passando a construção das validações para uma fábrica, ficaria algo como isso:

/** dentro do serviço de reajuste **/
List<ValidacaoReajuste> validacoes = ValidacoesReajusteFactory.getValidacoes();
new ReajusteService(validacoes).reajustarSalarioFuncionario(funcionario, aumento);

/** e no factory **/
public class ValidacoesReajusteFactory {
    public static List<ValidacaoReajuste> getValidacoes() {
        List<ValidacaoReajuste> validacoes = new ArrayList<>();
        validacoes.add(new ValidarPercentualReajuste());
        validacoes.add(new ValidarPeriodicidadeReajuste());
        return validacoes;
    }
}

Dessa forma sempre que precisar adicionar mais uma validação, você só precisaria criar a classe da validação e instanciar ela no factory.

Frameworks

Contudo isso ainda pode ser melhorado, frameworks como Spring por exemplo permite a declaração de componentes e serviços que podem ser injetados usando o @Autowired, neste caso você pode declarar as validações em um local, como um arquivo de configuração XML ou properties (o que permite gerenciar validações por ambientes), o Spring se encarrega de instanciar, manter a referência e injetar nas os objetos que precisam delas, aqui tem um guia interessante -> baeldung - Spring Dependency Injection

Ótima resposta! :)

Muito obrigado!!