Entendendo o conceito de Mappers
No desenvolvimento de software, especialmente em aplicações que interagem com bancos de dados, a necessidade de converter dados entre diferentes representações é uma constante e é aqui que entram em cena os mappers. Mas você sabe que são exatamente esses elementos e qual a sua importância?
O que é um Mapper?
Um mapper, em sua essência, é um padrão de projeto que tem como objetivo mapear objetos de um domínio para outro. Ele atua como uma ponte entre duas representações distintas de dados, facilitando a comunicação e a transformação entre elas.
Analogia: Imagine que você precisa traduzir um texto de português para inglês. O mapper seria o dicionário, que contém as correspondências entre as palavras em ambas as línguas.
Por que usar Mappers?
- Abstração de detalhes: Os mappers escondem a complexidade da conversão de dados, permitindo que o desenvolvedor se concentre na lógica de negócio.
- Reutilização de código: Um mapper bem projetado pode ser reutilizado em diferentes partes da aplicação, evitando a duplicação de código.
- Flexibilidade: Ao isolar a lógica de mapeamento, os mappers facilitam a adaptação da aplicação a mudanças nos modelos de dados.
- Melhora da testabilidade: Os mappers podem ser testados isoladamente, garantindo a qualidade do código.
Mappers e ORMs
ORMs (Object-Relational Mappers) como o Prisma são exemplos clássicos de utilização de mappers. Eles automatizam o processo de mapeamento entre objetos em memória (representação orientada a objetos) e registros em um banco de dados relacional.
Como o Prisma funciona como um mapper:
- Definição de modelos: Você define modelos que representam as tabelas do seu banco de dados, especificando os campos e seus tipos.
- Mapeamento automático: O Prisma gera código para mapear esses modelos para as respectivas tabelas, permitindo que você interaja com o banco de dados usando objetos.
- Consultas e atualizações: Ao executar consultas ou atualizar dados, o Prisma gera as consultas SQL correspondentes e mapeia os resultados para os seus objetos.
Quando criar um mapper personalizado?
Embora ORMs como o Prisma ofereçam um poderoso mecanismo de mapeamento, pode haver situações em que um mapper personalizado seja necessário:
- Transformações complexas: Quando as transformações entre os objetos envolvem lógica complexa ou cálculos específicos.
- Múltiplas representações: Se os dados precisam ser representados de diferentes formas para diferentes partes da aplicação.
- Legado: Em sistemas legados com estruturas de dados complexas, um mapper pode facilitar a integração com novas tecnologias.
Bora para um Exemplo Prático 👇
import { PrismaService } from './prisma.service'; import { Injectable } from '@nestjs/common'; import { Notification } from './notification.entity'; @Injectable() export class PrismaNotificationsRepository { constructor(private prisma: PrismaService) {} async create(notification: Notification) { await this.prisma.notification.create({ data: { id: notification.id, category: notification.category, // ... outras propriedades }, }); } }
Detalhando o Processo:
1. Objeto de Domínio: A classe
Notification
representa um objeto de domínio, ou seja, uma representação do conceito de notificação no nosso sistema.2. Modelo de Dados: A tabela
notification
no banco de dados é o modelo de dados correspondente à entidade Notification
.3. Mapeamento: O Prisma realiza o mapeamento entre essas duas representações:
4. Leitura: Quando passamos um objeto
Notification
para o método create
, o Prisma extrai as propriedades desse objeto.5. Conversão: Essas propriedades são convertidas para um formato compatível com o banco de dados (SQL).
6. Escrita: A consulta SQL gerada é executada, inserindo um novo registro na tabela
notification
.Visualizando o Mapeamento:
Objeto Notification (memória) -----> Consulta SQL (banco de dados) id: string id: UUID category: string category: varchar // ... outras propriedades
O Prisma como Facilitador:
- Abstração: O Prisma esconde a complexidade da geração de consultas SQL, permitindo que nos concentremos na lógica do nosso domínio.
- Tipo Segurança: Garante que os dados sejam mapeados corretamente para os tipos de dados definidos no banco de dados.
- Flexibilidade: Permite personalizar o mapeamento em casos mais complexos.
Em resumo o código demonstra como o Prisma, atuando como um mapper, facilita a persistência de dados, convertendo objetos do nosso domínio em registros em um banco de dados relacional. Essa transformação é essencial para que a aplicação possa armazenar e recuperar informações de forma eficiente.
Os mappers são ferramentas poderosas que simplificam o desenvolvimento de software, permitindo que os desenvolvedores se concentrem na lógica de negócio. Ao entender os conceitos básicos e os benefícios dos mappers, você estará melhor preparado para construir aplicações mais robustas e escaláveis.