Desenvolvimento - C#
.Net Framework Inside: Comparações Avançadas em .NET (IEquatable)
Veremos neste artigo como a utilização da Interface System.IEquatable pode auxiliar no desenvolvimento de objetos de negócio.
por Guilherme Bacellar Moralez
Veremos neste artigo como a utilização da Interface System.IEquatable pode auxiliar no desenvolvimento de objetos de negócio.
por Guilherme Bacellar MoralezA comparação em .NET é algo que muitas vezes os programadores deixam de lado, renegadas às simples comparação de endereço de memória (a == b).
Contudo,
o .Net Framework nos fornece mecanismos muito mais poderosos para essas
comparações, que além de elegantes nos ajudam na manutenção futura dos códigos
e na prevenção de possíveis bugs em nossos algoritmos.
System.IEquatable<T>– Comparando Objetos
Utilizemos um cenário com um objeto de negócio (Usuario):
C#
public class Usuario
{
private string _Nome;
private string _Email;
private byte _Idade;
private int _ID;
public string Nome
{
get { return _Nome; }
set { _Nome = value; }
}
public string Email
{
get { return _Email; }
set { _Email = value; }
}
public byte Idade
{
get { return _Idade; }
set { _Idade = value; }
}
public int ID
{
get { return _ID; }
set { _ID = value; }
}
}
VB.NET
Public Class Usuario
Private _Nome As String
Private _Email As String
Private _Idade As Byte
Private _ID As Integer
Public Property Nome() As String
Get
Return _Nome
End Get
Set(ByVal value As String)
_Nome = value
End Set
End Property
Public Property Email() As String
Get
Return _Email
End Get
Set(ByVal value As String)
_Email = value
End Set
End Property
Public Property Idade () As Byte
Get
Return _Idade
End Get
Set(ByVal value As Byte)
_Idade = value
End Set
End Property
Public Property ID () As Integer
Get
Return _ID
End Get
Set(ByVal value As Integer)
_ID = value
End Set
End Property
End Class
Como objeto de negócio, um Usuario será igual ao outro se, e somente se, o ID (chave primária) for igual nos dois objetos. Utiliza-se muito esse mecanismo em áreas de prevalência de dados.
Em uma situação típica, executaríamos o código abaixo para verificar se os usuários são iguais.
C#
if (userI.ID == userII.ID)
{
// Usuários Iguais
}
else
{
// Usários Diferentes
}
VB.NET
If (userI.ID = userII.ID) Then
" Usuários Iguais
Else
" Usuários Diferentes
End If
Nada de errado com o a forma de se realizar essa verificação, contudo, não está orientado a objetos e se por acaso a chave primária (que identifica um usuário) mudar teremos um grande problemas em mãos.
A fim de minimizar esse problema, podemos adotar a interface (System.IEquatable<T>) e nosso objeto de usuário ficará:
C#
public class Usuario : IEquatable<Usuario>
{
private string _Nome;
private string _Email;
private byte _Idade;
private int _ID;
public string Nome
{
get { return _Nome; }
set { _Nome = value; }
}
public string Email
{
get { return _Email; }
set { _Email = value; }
}
public byte Idade
{
get { return _Idade; }
set { _Idade = value; }
}
public int ID
{
get { return _ID; }
set { _ID = value; }
}
public bool Equals(Usuario obj)
{
return obj.ID == this.ID;
}
VB.NET
Public Class Usuario
Implements IEquatable(Of Usuario)
Private _Nome As String
Private _Email As String
Private _Idade As Byte
Private _ID As Integer
Public Property Nome() As String
Get
Return _Nome
End Get
Set(ByVal value As String)
_Nome = value
End Set
End Property
Public Property Email() As String
Get
Return _Email
End Get
Set(ByVal value As String)
_Email = value
End Set
End Property
Public Property Idade() As Byte
Get
Return _Idade
End Get
Set(ByVal value As Byte)
_Idade = value
End Set
End Property
Public Property ID() As Integer
Get
Return _ID
End Get
Set(ByVal value As Integer)
_ID = value
End Set
End Property
Public Function Equals(ByVal other As Usuario) As Boolean Implements IEquatable(Of Usuario).Equals
Return IIf(other.ID = Me.ID, True, False)
End Function
End Class
A partir deste momento, podemos utilizar a seguinte forma para a mesma comparação anterior:
C#
if (userI.Equals(userII))
{
// Usuários Iguais
}
else
{
// Usários Diferentes
}
VB.NET
If (userI.Equals(userII)) Then
" Usuários Iguais
Else
" Usuários Diferentes
End If
Desta forma, temos uma comparação entre objetos de negócio de uma forma orientada a objetos e cuja regra de comparação fica restrita no próprio objeto. Acima de tudo, a regra ainda está TypeSafe graças a interface Generics utilizada.