Jump to content

Archived

This topic is now archived and is closed to further replies.

MichelleAraujo

Orientação a Objetos e Banco de Dados

Recommended Posts

Olá pessoal, tudo bem?

Gostaria de tirar uma dúvida com vocês que vem me "pertubando" a um tempo.

Quando trabalhamos com tabelas, a orientação de muitos especialistas é criar um classe para manipular os dados armazenados.
Minha dúvida é a seguinte: vamos dizer que tenho um banco de dados com mais de 20 tabelas. Dessas tabelas, algumas tem informações iguais entre si (o ID de uma outra tabela) e que em algumas tabelas somente vou fazer um select. Nesse caso, vou criar várias classes com apenas um método. Para cada classe, estou criando uma página que cria as interfaces. Por exemplo, se tenho a classe Carro.class.php eu vou ter uma página carros.php para chamar os métodos da classe Carro.

Minha dúvida é a seguinte: dessa forma é o ideal? Não ficaria um sistema com muitas classes? Poderia, por exemplo, dentro da classe Carro colocar métodos que fazem um select em outras tabelas que tem como coluna ID_Carro?

 

Vou esclarecer mais:
Tenho as seguintes tabelas:

*Carro, que tem as colunas ID_Carro, Nome, Quantidade.

*Roda, que tem as colunas ID_roda, ID_carro (em que carro ela está), Nome, Aro
*Volante, que tem as colunas ID_volante, ID_carro (em que carro ela está), Nome

Na primeira, eu vou fazer CRUD mas nas duas últimas só irei fazer um select. É indicado eu fazer uma classe Roda e Volante e suas respectivas páginas rodas.php e volantes.php?

Obrigada.

Share this post


Link to post
Share on other sites

1. Não é um problema "ter muitos objetos".

2. Orientação a objetos não é orientação a classes.

3. Existem patterns específicos para resolver esse tipo de problema. Não necessariamente você precisa de um objeto para cada tabela, não precisa ser esse ORM um para um. você pode ter um objeto que se divide em outras tabelas sim.

4. A view tanto faz.. ela é independente do objeto.

5. Pense em objetos e não em classes.

Share this post


Link to post
Share on other sites

Complementando o que já foi respondido, a orientação à objetos tem como intuito abstrair a solução de um problema (no seu caso o mapeamento relacional para o OO) para um contexto mais próximo do mundo real.

 

Existem muitos patterns para resolver esse seu problema, cada um com benefícios e malefícios. Normalmente se resumirão entre abstração X granularidade.

 

Por exemplo, o pattern DataMapper faz o serviço do mapeamento de forma excelente com uma alta abstração. Mas o seu efeito colateral é a alta granularidade de objetos/entidades envolvidas (Mapper <--> DomainObject) e os padrões que auxiliam no controle do data mapper (DomainFactory, IdentityMap, UnityOfWork, IdentityObject, DomainObjectAssembler, etc..). Com esse pattern, você pode separar perfeitamente as entidades de persistência das entidades utilizadas pelo seu software.

 

Por outro lado, existe, também os padrões TableDataGateway e RowDataGateway, que possuem uma granularidade menor que o DataMapper e, em consequência, uma abstração menor. Mas também é um ORM um para um.

 

Eu, particularmente, gosto do pattern DataMapper, inclusive dediquei um capítulo do tcc da minha pós para exemplificar o ganho na abstração relacional X OO.

 

Mudando um pouco o assunto, talvez a sua maior dificuldade não esteja na abstração em si, mas na arquitetura utilizada no seu projeto. Com os seus exemplos, não me parece utilizar uma arquitetura em camadas.

Share this post


Link to post
Share on other sites

  • Similar Content

    • By sergiosfpereira
      Boa tarde a todos,
       
      Estou estudando MVC e me deparei com a seguinte situação:

      Tenho uma View que precisa receber dados de dois Models diferentes, então no controller desta View eu tenho a função abaixo:
      public function teste($id) { $this->view->a = $this->getOneA($id); $this->loadModel('b'); $this->view->b = $this->model->getOneB($id); $this->view->render('app/teste'); } O cenário acima me retorna o esperado, pega os dados de A e de B e os deixa disponiveis para a View.
       
      Está correto utilizar esse método ?
       
      Se sim, eu deveria carregar o Model "b" no __construct do controller "a"  ou diretamente na função do controller "a" como neste exemplo?
       
      Se não, qual a melhor maneira de obter dados de diferentes Models?
       
      OBS: todos os controllers são filhos do controller principal e todos os models são filhos do model principal.
       
      E me perdoem se eu estiver falando bobagem, como disse, estou aprendendo e a finalidade aqui é didatica e agradeço a quem puder contribuir.
    • By marsolim
      Oi gente tudo bem? to com uma dúvida aqui. acho que isso vai soar meio idiota mas sabe o checkbox que a gente coloca pro usuário fazer cadastro por exemplo com o "Confirmo que li e estou de acordo blablabla". a gente deve armazenar esse 'aceito' no banco de dados ou basta ele estar na página e ser validado na hora do cadastro?
       
      bem e paz pra todos
    • By unset
      Olá, uma dúvida tenho uma classe que faz upload de imagens e cadastra no banco, como eu faço para executar uma outra classe ação função etc somente apos verificar que todo o upload dos arquivos foi realizado com sucesso?
    • By ramonjba
      Bom dia! Pessoal, estou muito precisando da ajuda dos Srs. Tenho uma tabela, onde a cada minuto, meu script insere dados referente a consulta SNMP de determinado equipamento. Tenho uma pagina, onde os dados que a consulta coletou diferente do dado atual, é mostrado na tabela. O que acontece é o seguinte, estou utilizando o GROUP BY para selecionar apenas os dados diferentes da coluna 'canalEquipamento', mas, o problema é que, se eu estiver com o Canal registrado na tabela em 5540, realizar a alteração para o 5500, e depois voltar para o 5540, minha consulta não retorna o dado duplicado. Não posso simplesmente mostrar todas as consultas na tabela, pois como eu disse, a inserção de dados na tabela é realizada a cada minuto, dessa forma, iria ter vários dados repetidos e uma consulta enorme. Então, o que eu preciso fazer, é que: a consulta retorne os dados , que o último não seja repetido, por exemplo: Tenho do registro 1 até 50, a coluna Canal está registrada em 5500, no registro 51 até o 500, o canal mudou para 5540, e do 501 até o 700, o canal voltou para o 5500. O que eu precisaria que a consulta retornasse, seria por exemplo:

      Consulta 1 - Canal 5500
      Consulta 51 - Canal 5540
      Consulta 501 - Canal 5500
       
      Segue a imagem do exemplo do problema atual, de como a query está retornando no momento (ela está listando apenas o primeiro registro do canal, se repetir o canal, ele não aparece mais).
      QUERY: SELECT ip_equipamento, canalEquipamento, lastSNMP FROM equipamentoSNMP WHERE idEquipamento='317' GROUP BY canalEquipamento ORDER BY idConsulta DESC
       

    • By maxsybam
      Fala pessoal, eu estou desenvolvendo um sistema de estoque para a minha universidade para o meu TCC.
      Neste sistema tenho telas de consultas. Em uma das consultas seria uma consulta por um item especifico, fiz um select para selecionar qual o item a ser consultado no banco, mas na hora que clico no botão de consultar, ele está trazendo todos os itens cadastrados e eu gostaria que voltasse só o que está relacionado ao que foi selecionado.
       
      CÓDIGO DO SELECT
       
      <form action="item_resultado.php" action="POST">
        <b></br></br>
         Item <select name="item">
           <?php
            require_once("connect.php");
            $con_bd = connect();
            $select_catergoria= "SELECT * FROM tb_item";
            $result = mysqli_query($con_bd,$select_catergoria);
            if ($result){
              foreach($result as $item1){
              echo"<option value='".$item1['id_item']."'>".$item1['desc_item']."</option>";
            }
            }
            ?>
         </select><label>
        </b>
        </br></br><input type="submit" name="btconsultar" value="Consultar">
          </form>
       
       
       
       
      CÓDIGO DA TELA item_resultado.php
       
      <div class="corpo">
          <?php
      require_once("connect.php");
      $conbd=connect();
      if(empty($modelo)){
        $consulta="SELECT * FROM tb_item";
      }else{
        $consulta="SELECT * FROM tb_item INNER JOIN tb_categoria ON categoria_item=nome_categoria WHERE desc_item AND alc_item AND volume_item AND responsavel_item AND guia_item AND safra_item AND obs_item";
      }
      $consultando=mysqli_query($conbd,$consulta);
      echo "<table id='tabela'><tr><th>Item</th><th>Categoria</th><th>%ALC</th><th>Volume</th><th>Responsável</th><th>Guia</th><th>Safra</th><th>Observação</th></tr>";
      foreach ($consultando as $result_consult) {
        echo "<tr><td>" . $result_consult['desc_item'] . "</td>";
        echo "<td>" . $result_consult['categoria_item'] . "</td>";
        echo "<td>" . $result_consult['alc_item'] . "</td>";
        echo "<td>" . $result_consult['volume_item'] . "</td>";
        echo "<td>" . $result_consult['responsavel_item'] . "</td>";
        echo "<td>" . $result_consult['guia_item'] . "</td>";
        echo "<td>" . $result_consult['safra_item'] . "</td>";
        echo "<td>" . $result_consult['obs_item'] . "</td></tr>";
      }
      echo "</table>";
      ?>
      </div>
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.