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

Dúvida no Ex. 4 da Aula 9 - Herança

Olá, estamos criando um novo campo no banco de dados "tipo de produto", quando já temos a categoria em perfeito funcionamento.

Por que não usamos a categoria para definir o tipo de produto que vamos ter?

6 respostas

Oi Lucas, por que nesse caso o tipo do produto é muito mais do que um texto falando se o produto é um ebook ou um livro físico, para cada tipo precisamos escrever regras de negócios diferentes. Por isso optamos por criar classes diferentes que herdam de livro pois assim podemos usar polimorfismo ao nosso favor vou tentar exemplificar vamos olhar o seguinte código:

public function CalculaImposto(Livro $livro) {
    if($livro->getCategoria()->getNome() == "Ebook") {
        $imposto = $livro->getPreco() * 0.03;
    }
    else if($livro->getCategoria()->getNome() == "Fisico") {
        $imposto = $livro->getPreco() * 0.07;
    }
}

Se tivessemos 30 tipos diferentes, como que ia ficar esse método? repare que toda vez que criarmos um tipo diferente vamos ter que lembrar de mexer nesse método. Criando classes separadas podemos fazer algo como:

class Livro {
    public abstract function calculaImposto();
}
class Ebook extends Livro {
    public function calculaImposto() {
        return $this->getPreco() * 0.03;
    }
}
class LivroFisico extends Livro {
    public function calculaImposto() {
        return $this->getPreco() * 0.07;
    }
}

Repare que agora o meu método não precisa mais executar nenhum if.

function calculaImposto(Livro $livro) {
    return $livro->calculaImposto();
}

Agora a nossa função calculaImposto parou de crescer, independente da quantidade de tipos/categorias que temos, essa que é a vatangem de criar outra classe no lugar de apenas usar a categoria para definir o tipo.

Qualquer dúvida estou a disposição.

Abraços e bons estudos

Depois que vi o curso completo fui arrumar algumas coisas que achei estranho no código então eu implementei de uma forma que a categoria significava o "tipoProduto" e também criei as classes separadas no caso a classe "Livro, Ebook e LivroFisico" e continuei usando a categoria.

Tipo usei a mesma lógica que tinha visto na aula mas quando ele utilizava o campo tipoProduto eu utilizava a categoria. Nesse caso dá no mesmo não é?

Oi Lucas, Consegue colocar o código aqui para dar uma olhada? =) ou o link do github?

Abraços.

Sim, esse aqui é o código que fiz no adiciona_produto

<?php require_once("cabecalho.php");
require_once("logica-usuario.php");
require_once("autoload.php");
require_once("conecta.php");

verificaUsuario();

    $categoria = new Categoria();
    $categoria->setId($_POST['categoria_id']);

    $categoriaDao = new CategoriaDAO($conexao);
    $categoriaNova = $categoriaDao->buscaCategoria($categoria->getId());

    $nome = $categoriaNova->getNome();
    $produto = new $nome(($_POST["nome"]), ($_POST["preco"]));
    $produto->setIsbn($_POST['isbn']);


    $produto->setDescricao($_POST["descricao"]);
    $produto->setCategoria($categoria);

    if (isset($_POST['usado'])) {
        $usado = "true";
    } else {
        $usado = "false";
    }

    $produto->setUsado($usado);
    $produtoDao = new ProdutoDAO($conexao);

    if ($produtoDao->insereProduto($produto)) { ?>
         <p class="text-success">Produto <?= $produto->getNome(); ?>, R$ <?= $produto->getPreco(); ?>,00 adicionado com sucesso! </p>    
     <?php } else {
        $msg = mysqli_error($conexao);
     ?>
         <p class="text-danger">Produto <?= $produto->getNome(); ?>, R$ <?= $produto->getPreco(); ?>,00 não adicionado! <?=$msg?></p>    
     <?php }
include("rodape.php"); ?>

Tipo é praticamente igual, mas ao inves de pegar esse outro campo eu pego a categoria->getNome() e coloco numa variavel nome que depois é usada pra criar o objeto.

Só queria saber se minha lógica pode ser usada.

solução!

Então Lucas, funciona. A unica coisa que me incomoda é atrelar a categoria com o tipo porque se toda categoria obrigatoriamente for uma classe nova não faz sentido ter a classe Categoria pois o próprio tipo do objeto já é a categoria, como todo Ebook é uma instância da classe Ebook, todo Computador é uma instância da classe Computador e assim por diante. Mas isso vai da modelagem de cada um. Espero que tenha ajudado.

Entendi, muito obrigado!

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