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

Ainda tenho um pouco de dúvida sobre interfaces.

Olá a todos! Ainda estou com dúvida sobre a implementação das interfaces. No caso, a interface é uma classe abstrata que não possui implementação e somente a assinatura, o conceito consegui entender. Entretanto, ainda não me caiu a ficha sobre a vantagem da utilização da interface, para mim, parece somente um ctrl+c e ctrl+v. Por exemplo, suponha que queiramos fazer a manutenção em 3 classes de um código e nessas 3 classes temos a implementação implements de 1 interface. Por que a manutenção ficaria mais fácil ? No final das contas, o programador não teria que alterar uma classe de cada vez, com interface ou sem interface?

4 respostas

Hector, boa tarde.

O conceito de Interfaces ele fica mais compreensivel quando você entra nos conceitos de Design Patterns. Ali você consegue enxergar que uma Interface você pode utilizar conceitos de Polimorfismo. Vou te dar o seguinte exemplo:

Uma determinada empresa, fazem 3 validações para poder realizar um aumento para determinado colaborador

1-) O colaborador precisa ter no minimo 01 ano de empresa. 2-) O colaborador precisa estar defasado no salario. 3-) O colaborador precisa ter atingido a meta de no minimo 85%

Imagine que para isso você iria criar uma classe com a regra de negôcio.

public class ReajusteSalario(){
    public void validar(Colaborador colaborador, double valorReajuste){
        // linha que contem if se colaborador precisa ter no minimo 01 ano de empresa. 
        
        // linha que contem if se colaborador precisa estar defasado no salario.
        
        // linha que contem if se colaborador precisa ter atingido a meta de no minimo 85%
        
        // caso não foi barrada em nenhum if
        double salarioAtual = colaborador.getSalario();
        double salarioNovo = salarioAtual + valorReajuste;
        
        colaborador.atualizarSalario(salarioNovo);
    }
}

Olhando essa classe, ela fica muito verbosa e dificil a manutenção no codigo, tendo em vista que quanto mais regra de negocio existe, mais if's você irá precisar inserir.

Mas agora criando uma interface.

public interface ValidacaoReajuste(){
    void validar(Colaborador colaborador, Double valorReajuste);
}

E os if's você irá separar por classe como por exemplo:

public class ValidacaoReajusteUmAnoEmpresa implements ValidacaoReajuste{

    public double validar(Colaborador colaborador, Double valorReajuste){
        // codigo da validação
    }
}
public class ValidacaoReajusteSalarioDefasado implements ValidacaoReajuste{

    public double validar(Colaborador colaborador, Double valorReajuste){
        // codigo da validação
    }
}
public class ValidacaoReajusteBateuAMeta implements ValidacaoReajuste{

    public double validar(Colaborador colaborador, Double valorReajuste){
        // codigo da validação
    }
}

Voltando a classe que você tinha feito anteriormente que é a ReajusteSalario, você consegue implementar dessa maneira.

public class ReajusteSalario(){

    private List<ValidacaoReajuste> validacoes;
    
    public ReajusteSalario(List<ValidacaoReajuste> validacoes){
        this.validacoes = validacoes
    }
    
    public void validar(Colaborador colaborador, double valorReajuste){
        this.validacoes.forEach(valida -> {
            valida.validar(colaborador, valorReajuste);
            });
            
        double salarioAtual = colaborador.getSalario();
        double salarioNovo = salarioAtual + valorReajuste;
        
        colaborador.atualizarSalario(salarioNovo);
    }
}

Tendo em vista que agora utilizando o Polimorfismo, pois todas as classes implementam de ValidacaoReajuste podendo chamar elas em uma lista. Ou seja, caso for criado mais uma regra de negôcio, você só precisa criar mais uma classe com a regra e implementar de ValidacaoReajuste e no metodo colaborador.atualizarSalario(salarioNovo); é possivel colocar quais regras você quer que sejam adotadas.

Por exemplo:

public void atualizarSalario(double aumento) {
        List<ValidacaoReajuste> validacoes = new ArrayList<>();
        validacoes.add(new ValidacaoReajusteUmAnoEmpresa());
        validacoes.add(new ValidacaoReajusteSalarioDefasado());
        validacoes.add(new ValidacaoReajusteBateuAMeta());
        
        ReajusteSalario reajusteSalarial = new ReajusteSalario(validacoes);
        reajusteSalarial.validar(this, aumento);
    }

Caso não deu pra entender, só falar.

Acho que entendi, o que você fez foi transformar todos os ifs em classes e depois criou uma interface para deixar as aquelas classes padronizadas (no mesmo tipo) e assim criar uma lista que recebe todas as classes transformadas pela interface ? Então, a interface serve para padronizar diferentes tipos de classes para facilitar futuras manipulações ?

Hector,

Exatamente foi isso que eu fiz, como elas tem a mesma funcionalidade que é validar. Dá para fazer isso.

Agora a respeito de classes é isso e muito mais! E um assunto muito abrangente, que é muito legal.

Outro exemplo de interface!. Eu fiz uma aplicação utilizando JavaFX, e nisso para fazer a troca de mensagens com uma tela e outra foi utilizado Interfaces. Então eu sugiro que você quando for chegada a hora, estude Design Patterns. Você irá se impressionar!

solução!

Excelente amigo, muito obrigado pela ajuda!