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

Sobre o tópico 5: Herança e o Liskov Substitutive Principle

Mesmo alterando a arquitetura das classes de herança para composição, o problema do método "rende" continua (no exemplo do curso), pois depois de aplicada a composição, o método não existe e vai dar erro na classe "ProcessadorDeInvestimentos.php".

Gostaria de ver a resolução disso pelo professor.

2 respostas
solução!

Olá José tudo bom ? Muito bem observado! Realmente a classe ProcessadorDeInvestimentos vai reclamar pois na classe ContaEstudante o método rende não existe. Nosso código roda porque o php é uma linguagem com tipagem dinâmica mas se fossemos colocar um tipo para o Array qual tipo seria? Não tem como pois ambas as classes não tem relação nenhuma entre si. Antes quando usávamos herança poderíamos ter um Array de ContaComum e como ContaEstudante herda de ContaComum poderiamos ter os dois tipos dentro do Array. Lembre-se que a tipagem da linguagem é dinâmica mas para o seu negócio (no caso o banco) a tipagem existe e é importante! Portanto quando percorrer um Array que irá chamar o método rende precisamos de alguma forma garantir que todas as instâncias dentro do Array são instâncias de ContaComum. E nesse caso quando acontecer o erro na classe ProcessadorInvestimento é melhor do que fazer um if e acabar deixando um bug passar como no exemplo abaixo:

public function processa() {
    $contas = $this->contasDoBanco();
    foreach($contas as $conta) {
        if($conta instanceof ContaComum) {
            $conta->rende();
        }
    }
}

Nesse caso o processador de investimentos vai ignorar qualquer conta que não é a ContaComum, mas essa é a regra de negócio? Essas contas deveriam ser realmente ignoradas? Pior do que um erro ser lançado é uma lógica ser executada de forma errada e sem nos avisar!

Além disso pensando no design das nossas classes, agora a classe ContaEstudante não tem o método rende, o que é bem diferente de ter o método e lançar uma exception.

Fazendo uma breve análise sobre a regra de negócio, não seria melhor manter a herança e a implementação do método "rende" para a "ContaEstudante" render "zero"? Até porque um dia esse tipo de conta pode passar a render.