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

Composição estranha

Olá. Apesar de funcionar e eu entender o funcionamento, achei um pouco estranho a composição entre a classe "CalculadorDeImpostos" e a classe "SeguroDeVida".Pelo que foi ensinado durante o curso, a interface obriga às classes que "assinam o contrato" a implementar um método e, por sua vez, para não repetir código, delegamos esta implementação para uma classe externa (composição). Esta classe externa, então, é obrigada a implementar o método como exigido pela interface.

No exemplo do professor Nico, a classe "CalculadorDeImposto" (classe externa onde se escreve a implementação do método) que deveria implementar o método exigido não somente não implementa o método (não existe a implementação de "getValorImposto()" nesta classe), como devolve a implementação do mesmo pras próprias classes que a chamam (a implementação de "getValorImposto()" está na própria "SeguroDeVida").

Segue o código de como eu acho que seria a resolução, seguindo o mesmo modelo do projeto "bytebank-herdado":

public interface Tributavel {

    double getValorImposto();
}
public class CarteiraDeAcoes implements Tributavel {

    private CalculadorDeImpostos calculador;

    public CarteiraDeAcoes() {
        this.calculador = new CalculadorDeImpostos();
    }

    @Override
    public double getValorImposto() {
        return this.calculador.getValorImposto();
    }

}
public class CalculadorDeImpostos {
    //variavel qualquer possivelmente utilizada no calculo
    private double variavelQualquer;

    public double getValorImposto() {
        //implementacao do metodo que retorna um double como exemplo
        double calculoQualquer = 1.0;
        return calculoQualquer;
    }

Estou errado em achar estranho implementar o método "getValorImposto" na própria classe "SeguroDeVida", quando existe uma classe criada teoricamente pra isso? Minha resolução está correta?

Obrigado

2 respostas
solução!

Oie Carlos, tudo bem com você?

Seu código está muito bom e usou perfeitamente os conceitos de composição explicados durante o curso, entretanto nessa aula essa classe "CalculadorDeImpostos" não foi criada para servir de implementação do método da interface e sim efetuar uma lógica própria que é calcular o imposto total, ou seja a soma do imposto pago pelo seguro da vida e do conta corrente. Aliás, nessa classe é usado composição quando é chamado o método "getValorImposto", evitando assim a reutilização de código.

public class CalculadorDeImposto {

        private double totalImposto;

        public void registra(Tributavel t) { // Variável com referência de Tributavel

            double valor = t.getValorImposto(); // Uso de composição para evitar que a lógica do método getValorImposto tenha que ser reescrita nessa classe
            this.totalImposto += valor;

        }

}

Importante ressaltar a composição não é uma classe, ela é o ato de delegar trabalho para outro objeto, deixando seu código mais elegante, menor e mais seguro. Em UML falamos em um relacionamento de composição quando uma classe pertence à outra.

Uma dica para perceber se uma classe tem uma relação de composição com a outra quando existe um diagrama UML envolvido é observar as setinhas dos diagramas de classe, observe a diferença:

  • Essa setinha entre o "CalculadorImposto" e "Tributável" significa dependência, ou seja, a Classe "CalculadorImposto" usa algum serviço da Interface "Tributavel.

    Foto do diagrama

  • Essa setinha com um losango preenchido na ponta significa o relacionamento de composição, ou seja, se as Classes "Cliente", "Administrator" e "Gerente" forem destruídas a Classe "AutenticaçãoUtil" também será, pois a parte (AutenticaçãoUtil) pertence ao todo (Cliente, Administrador e Gerente).

Foto do diagrama

Essa diferenciação geralmente acontece apenas nos diagramas, pois quando passamos ao código muitas vezes consideramos tudo sendo "composição", mas se existe um diagrama de classes no projeto sendo desenvolvido é bom dar uma olhadinha para evitar possíveis dúvidas envolvendo a utilidade das classes. Outra coisa importante é que o diagrama de classe é algo subjetivo e muitas vezes o projeto acaba não seguindo o que foi definido no diagrama.

Se quiser saber mais sobre as setinhas, relacionamentos e diagrama de classes recomendo essa leitura.

E por último respondendo resumidamente sua pergunta, se a classe tiver sido criada especificamente para implementação de métodos de uma interface então sim, seria estranho ela não fizesse essas implementações,. Mas nesse caso a classe "CalculadorImpostos" não foi feito para isso, ela tem uma lógica própria e um objetivo diferente.

Espero que eu tenha ajudado, qualquer dúvida ou problema fico a disposição :)

Bons estudos!

Muito obrigado pela solução e pela indicação de estudos, Igor! Me ajudou bastante! O professor Nico é um dos meus preferidos na Alura, mas nessa parte do curso realmente não ficou claro que a composição poderia ser implementada dessa maneira "menos tradicional".