Comparar objetos em c #

IComparable c #

Continuando com nosso curso de programação , veremos como, usando a API C #, podemos implementar métodos que não servem para comparar objetos. Vamos pensar que comparar é ver se duas entidades (objetos) são iguais. Se eles não forem iguais, um falso será retornado, mesmo que sejam de tipos diferentes. Faz sentido comparar se um gato e uma pessoa são iguais. Mas também faz sentido não fazê-lo .

Tudo isso é subjetivo e, como dissemos, dependerá muito do escopo e do escopo de nossa aplicação. Se, por exemplo, estamos fazendo uma aplicação dedicada ao manejo de animais, não seria interessante lançar uma exceção quando começamos a comparar vacas com porcos, porque os requisitos funcionais de nossa aplicação também estabelecem que uma massa de porcos e vacas deve ser comparada. para saber se os alimentos estão sendo distribuídos corretamente. Do meu ponto de vista, nunca é interessante lançar uma exceção , a linguagem fornece outros mecanismos para evitar a necessidade de declarar exceções.

Para implementar nosso método de comparação de objetos, vamos pensar na API do C # e nas classes e interfaces que ela fornece. Revendo a API, temos a interface IComparable que nos obriga a implementar o método int CompareTo (Object o) . Imagine a classe Person com uma propriedade salarial única e que nos permita compará-la apenas com outras pessoas, todo o resto gerará uma exceção.

class Persona : IComparable
{
    public double Sueldo { get; set; }


    public int CompareTo(Object o)
    {
        if (o == null) return 1;

        Persona c = o as Persona;
        if (c != null) 
            return this.Sueldo.CompareTo(c.Sueldo);
       else
            throw new ArgumentException("El parámetro pasado no es una persona");
    }
}

Isso é válido, mas o assunto desse método exige que quem o implementa coloque um objeto ao compará-los e torne necessário executar uma conversão … Lembre-se de que executar uma conversão é muito caro e faz com que o nosso programa perca consistência, será mais propenso a falhas. Também estamos permitindo a comparação de dois objetos diferentes, o que viola as condições que nós mesmos estabelecemos ao projetar essa classe.

Relacionado:  Atom e Sublime, conto minha experiência com esses dois editores de código

Desde a segunda revisão da API C # (versão 2.0 do .NET Framework), existe uma implementação genérica de IComparable , IComparable <T> . Os tipos básicos de C # implementam essa interface é o motivo pelo qual não faz sentido comparar um int com uma String se você não realiza uma conversão de tipo anteriormente … Muitos autores e programadores acreditam que a definição baseada no polimorfismo IComparable quebrou com muitas regras básicas de programação orientada a objetos e talvez fosse necessário criar uma nova interface baseada em modelo que permitisse limitar a genicidade ao declarar e implementar os métodos de interface.

class Persona : IComparable<Persona>
{
    public double Sueldo { get; set; }

    public int CompareTo(Persona p)
    {
            return this.Sueldo.CompareTo(p.Sueldo);
    }
}

O que fazemos é declarar nossa classe Pessoa que implementa o IComparable com base na genicidade, limitando o tipo da classe que o implementa (Pessoa) para garantir que só possamos comparar pessoas com pessoas. Isso é realmente útil e poderoso quando se trata de manter a consistência de nossas classes, além de melhorar o desempenho do aplicativo, pois executar uma conversão ou lançar uma exceção requer um tempo de computação alto. Também nos dá poder de linguagem ao declarar hierarquias de classes e usar herança simples .

class Ingeniero : Persona { .... }

class Programador : Persona { .... }

Ambas as classes herdarão do Persona e nos permitirão (sem redefinir o método CompareTo !) Compará-las entre elas , mas apenas entre elas. Com esse comportamento, podemos criar hierarquias de classes que são comparáveis ​​apenas adicionando robustez e flexibilidade ao nosso aplicativo.

 

Você pode estar interessado:

Deixe um comentário