Thiago Cantero

Tecnologia e Entretenimento

Arquitetura de SoftwareBanco de DadosData MapperDesenvolvimento WebPadrões de ProjetoPHPProgramação

ORM, Data Mapper – Parte II

Dando continuidade ao artigo anterior, neste iremos tratar sobre o padrão Data Mapper. Bom, e o que seria este padrão de Projeto?

Diferentemente do Active Record, você precisa escrever mais código para operações de CRUD, no entanto você obtém em longo prazo, um código mais fácil de manter, modificar, e totalmente desacoplado de seu Framework. Possibilitando a adoção de uma outra solução.
Vejamos o diagrama abaixo:

Como podemos observar, há uma Classe de Pessoa (Entity Class), classe de entidade, lá expressa o que há em nosso banco de dados, na herança desta, vem a classe Pessoa DataMapper que tem todos os métodos de manipulação de dados, é bem verdade que no caso do Active Record, a Classe Abstrata faz toda estas tratativas para você, contudo no padrão Data Mapper, você tem mais liberdade, pois a Classe de manipulação é independente da classe que abstrai as informações do banco de dados, atendendo assim o princípio de responsabilidade única, dentre outras características citadas no artigo anterior.

Para fins didáticos, vejamos como fica isto em PHP:

<?php

class Pessoa
{
 public $nome;
 public $sobrenome;
 public $idade;
};

Acima temos a Entity Class Pessoa, nela listamos os campos de nossa tabela, levando em consideração que nosso id tenha seu atributo definido no seu Banco como auto incremento. Podemos agora mapear a entidade Pessoa, para isso iremos criar a classe do mapeador (Data Mapper).

class PessoaMapper extends Pessoa
{
 /**
 * PessoaMapper - Exemplo Didático, na hipótese de herdar de uma EntityClass
 *
 * @version    1.0
 * @package    DataMapper
 * @author     Thiago Cantero Mari Monteiro
 * @copyright  Copyright (c) 2022 Thiago Cantero Mari Monteiro
 * @license    http://www.thiagocantero.com.br/sobre
 */   
   public static function findById($id)
   {
      //Aqui iremos armazenar o resultado do select 
      $query = "SELECT * FROM pessoa WHERE id = $id";
      
      //Criamos a Instância em memória com a palavra reservado new do PHP
      //e realizamos o mapeamento dos atributos da tabela
      $pessoa = new Pessoa();
      $pessoa->nome = $bdResult['nome'];
      $pessoa->sobreNome = $bdResult['sobrenome'];
      $pessoa->idade = $bdResult['idade'];
      return $pessoa;
   }
}

Podemos incluir outros métodos para dar mais funcionalidades, o exemplo não se esgota por aqui. Vamos incluir um método para apagar o registro:

public static function deleteById($id)
  {
     //Aqui iremos apagar o registro que foi injetado no método estático pelo id do registro.
     $query = "DELETE FROM pessoa WHERE id = $id";
     
  }

Simples, não?
Assim para os demais métodos que queira criar, obviamente que em relação ao Active Record há muito mais escrita de código, mas temos que conhecer o melhor dos dois mundos, a maioria dos ORM utilizam Data Mapper, como o EntityCore, NHibernate do .Net, o Hibernate do Java, Doctrine do PHP, uma infinidade de linguagens e suas respectivas camadas de acesso aos Dados.

Obviamente que este artigo não se esgota, se faz necessário o estudo da documentação que lhe for mais pertinente, como a linguagem qual você desenvolve, o Framework, o ORM, enfim. Estes artigos serviram apenas para de maneira introdutória, dar um passo inicial para a compreensão do papel do ORM e sua atuação na camada de abstração de dados, este mesmo conceito se aplica a qualquer cenário.

Por hoje é isso, abraços. : )