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



A 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.

Guilherme Bacellar Moralez

Guilherme Bacellar Moralez - Bacharel em Ciências da Computação, Desenvolvedor .NET há 4 anos, MCAD, Autor de Livros e Artigos, Arquiteto de Software do Projeto D.NET (Framework de Desenvolvimento .NET).
Blog:
http://dotnetmax.bacellar.org/