Data Transfer Objects (DTOs) são um padrão de design amplamente utilizado para transferir dados entre diferentes partes de um sistema. Eles são usados para encapsular dados e simplificar a comunicação entre camadas de uma aplicação ou entre sistemas diferentes. DTOs são especialmente úteis para reduzir a quantidade de dados enviados, garantir a integridade dos dados e facilitar a manutenção do código.
Ao construir DTOs em C#, a escolha entre record
e class
pode impactar significativamente a clareza e a segurança do código. Embora os exemplos a seguir usem um sistema bancário, os benefícios dos records
se aplicam a qualquer tipo de sistema. Vamos explorar três razões para optar por records
ao construir DTOs, ilustradas com exemplos práticos:
1️⃣ Comparação por Valor:
Em qualquer sistema, comparar objetos com base em seus valores é uma necessidade comum. Com records
, a comparação por valor é feita automaticamente, o que reduz a necessidade de código adicional e diminui o risco de erros.
Exemplo com class
:
public class TransacaoDto
{
public string IdTransacao { get; }
public decimal Valor { get; }
public DateTime Data { get; }
public TransacaoDto(string idTransacao, decimal valor, DateTime data)
{
IdTransacao = idTransacao;
Valor = valor;
Data = data;
}
public override bool Equals(object? obj)
{
if (obj is TransacaoDto transacao)
{
return IdTransacao == transacao.IdTransacao &&
Valor == transacao.Valor &&
Data == transacao.Data;
}
return false;
}
public override int GetHashCode() => HashCode.Combine(IdTransacao, Valor, Data);
}
Exemplo com record
:
public record TransacaoDto(string IdTransacao, decimal Valor, DateTime Data);
Por que record
é melhor?
Os records
já implementam a comparação por valor automaticamente, simplificando o código e garantindo que a comparação de dados seja feita de maneira correta e eficiente.
2️⃣ Imutabilidade por Padrão:
DTOs frequentemente representam dados que não devem ser alterados após sua criação. records
são imutáveis por padrão, o que garante que os dados permaneçam consistentes e seguros.
Exemplo com class
:
public class ContaDto
{
public string NumeroConta { get; }
public string Titular { get; }
public decimal Saldo { get; private set; }
public ContaDto(string numeroConta, string titular, decimal saldo)
{
NumeroConta = numeroConta;
Titular = titular;
Saldo = saldo;
}
// Para garantir imutabilidade, não deve haver métodos para modificar as propriedades
}
Exemplo com record
:
public record ContaDto(string NumeroConta, string Titular, decimal Saldo);
Por que record
é melhor?
Com records
, a imutabilidade é garantida sem a necessidade de lógica adicional, tornando o código mais seguro e menos propenso a erros.
3️⃣ Sintaxe Concisa e Leitura Limpa:
Definir DTOs com records
resulta em um código mais direto e fácil de ler, o que é benéfico para a manutenção e a clareza do código.
Exemplo com class
:
public class ClienteDto
{
public string Id { get; }
public string Nome { get; }
public string Email { get; }
public ClienteDto(string id, string nome, string email)
{
Id = id;
Nome = nome;
Email = email;
}
}
Exemplo com record
:
public record ClienteDto(string Id, string Nome, string Email);
Por que record
é melhor?
A sintaxe dos records
é mais concisa e direta, o que reduz a verbosidade do código e melhora a legibilidade.
4️⃣ Desconstrução:
A desconstrução permite extrair as propriedades de um record
diretamente em variáveis, tornando o acesso aos dados mais fácil e direto.
Exemplo com class
:
public class TransacaoDto
{
public string IdTransacao { get; }
public decimal Valor { get; }
public DateTime Data { get; }
public TransacaoDto(string idTransacao, decimal valor, DateTime data)
{
IdTransacao = idTransacao;
Valor = valor;
Data = data;
}
public void Deconstruct(out string idTransacao, out decimal valor, out DateTime data)
{
idTransacao = IdTransacao;
valor = Valor;
data = Data;
}
}
var transacao = new TransacaoDto("TX123", 1000.00m, DateTime.UtcNow);
transacao.Deconstruct(out var id, out var valor, out var data);
Exemplo com record
:
public record TransacaoDto(string IdTransacao, decimal Valor, DateTime Data);
var transacao = new TransacaoDto("TX123", 1000.00m, DateTime.UtcNow);
var (id, valor, data) = transacao;
Por que record
é melhor?
A desconstrução é suportada nativamente em records
, tornando o código mais limpo e simples de usar.
Conclusão: Independentemente do tipo de sistema que você está desenvolvendo, os records
oferecem vantagens significativas sobre as classes para construir DTOs. Com comparação por valor automática, imutabilidade por padrão, sintaxe concisa e suporte à desconstrução, records
ajudam a escrever código mais limpo, seguro e eficiente.
Top comments (0)