C# 9 está muito mais expressiva, dispensando categorias inteiras de testes de unidade

Esta publicação está disponível em vídeo, ampliada e revisada, no canal da EximiaCo.


Problemas recorrentes, resolvidos muitas vezes, geralmente têm soluções implementadas de maneira similar. Em implementações de DTOs, somente para leitura, por exemplo, é comum:

  • definir construtores onde cada parâmetro corresponde a uma das propriedades do tipo;
  • implementar versões customizadas da função de igualdade;
  • definir métodos auxiliares para criação de novas instâncias a partir de outras existentes.

O código, mesmo que escrito no “piloto automático” por programadores mais experientes, abre possibilidade para erros de codificação e lógica, demandando, para evitar prejuízos, a escrita de mais testes de unidade.

using System;
class Program
{
    static void Main()
    {
        var fn1 = new FullName("Elemar", "Rodrigues Severo Júnior");
        var fn2 = fn1.WithLastName("Jr.");
        var fn3 = fn2.WithLastName("Rodrigues Severo Júnior");

        Console.WriteLine(fn1.Equals(fn2));
        Console.WriteLine(fn1.Equals(fn3));
    }
}

public class FullName : IEquatable<FullName>
{
    public string FirstName { get; }

    public string LastName { get; }

    public FullName(string firstName, string lastName) =>
       (FirstName, LastName) = (firstName, lastName);

    public bool Equals([AllowNull] FullName other)
    {
        if (other == null)
        {
            return false;
        }

        return
            FirstName == other.FirstName &&
            LastName == other.LastName;
    }

    public FullName WithFirstName(string firstName) =>
        new FullName(firstName, LastName);

    public FullName WithLastName(string lastName) =>
        new FullName(FirstName, lastName);
}

A evolução da C# tem trazido para a linguagem a solução de problemas recorrentes tornando as implementações menos imperativas e mais declarativas.

Na C# 9, por exemplo, teremos:

  • init-only properties que tornaram desnecessários construtores apenas para a inicialização dos campos;
  • O modificador data que, entre outras coisas, fornecerá implementações especializadas de Equals e GetHashcode;
  • with-expressions que permitirá criação de novas instâncias a partir de outras existentes;
  • new-expressions que inferem o tipo de um objeto a partir do tipo declarado para a variável.

Tudo isso deixando o código muito mais breve.

using System;

FullName fn1 = new
{
    FirstName = "Elemar",
    LastName = "Rodrigues Severo Júnior"
};

var fn2 = fn1 with { LastName = "Jr."};
var fn3 = fn2 with { LastName = "Rodrigues Severo Júnior" };

Console.WriteLine(fn1.Equals(fn2));
Console.WriteLine(fn1.Equals(fn3));

public data class FullName 
{
    public string FirstName { get; init;  }
    public string LastName { get; init; }
}

Aliás, o método Main tornou-se opcional. A partir da C# 9, há suporte direto para o que o time da Microsoft chama top level programs. Nesses cenários, o parâmetro args continua disponível implicitamente.

Finalmente, há ainda uma novidade que permite tornar a construção de DTOs ainda mais econômica. São os positional records.

using System;
using static System.Console;

var fn1 = new FullName("Elemar", "Rodrigues Severo Júnior");

var fn2 = fn1 with { LastName = "Jr."};
var fn3 = fn2 with { LastName = "Rodrigues Severo Júnior" };

WriteLine(fn1.Equals(fn2));
WriteLine(fn1.Equals(fn3));

public data class FullName(string FirstName, string LastName);

Tudo isso representa menos código para ser escrito pelo programador. Também implica na redução na quantidade de testes de unidade necessários para evitar erros de codificação ou lógica. Logo, maior produtividade.

Por outro lado, a cada nova versão a especificação da linguagem fica maior, assim como a curva de aprendizagem. Concordamos que o último exemplo, definitivamente, não parece C#?

Compartilhe este insight:

Comentários

Participe deixando seu comentário sobre este artigo a seguir:

Subscribe
Notify of
guest
1 Comentário
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Pedro Igor
Pedro Igor
3 anos atrás

Esse último código me lembrou um pouco a linguagem Scala.

AUTOR

Elemar Júnior
Fundador e CEO da EximiaCo atua como tech trusted advisor ajudando empresas e profissionais a gerar mais resultados através da tecnologia.

NOVOS HORIZONTES PARA O SEU NEGÓCIO

Nosso time está preparado para superar junto com você grandes desafios tecnológicos.

Entre em contato e vamos juntos utilizar a tecnologia do jeito certo para gerar mais resultados.

Insights EximiaCo

Confira os conteúdos de negócios e tecnologia desenvolvidos pelos nossos consultores:

Arquivo

Pós-pandemia, trabalho remoto e a retenção dos profissionais de TI

CTO Consulting e Especialista em Execução em TI
EximiaCo 2024 - Todos os direitos reservados
1
0
Queremos saber a sua opinião, deixe seu comentáriox
()
x
Oferta de pré-venda!

Mentoria em
Arquitetura de Software

Práticas, padrões & técnicas para Arquitetura de Software, de maneira efetiva, com base em cenários reais para profissionais envolvidos no projeto e implantação de software.

Muito obrigado!

Deu tudo certo com seu envio!
Logo entraremos em contato

C# 9 está muito mais expressiva, dispensando categorias inteiras de testes de unidade

Para se candidatar nesta turma aberta, preencha o formulário a seguir:

C# 9 está muito mais expressiva, dispensando categorias inteiras de testes de unidade

Para se candidatar nesta turma aberta, preencha o formulário a seguir:

Condição especial de pré-venda: R$ 14.000,00 - contratando a mentoria até até 31/01/2023 e R$ 15.000,00 - contratando a mentoria a partir de 01/02/2023, em até 12x com taxas.

Tenho interesse nessa capacitação

Para solicitar mais informações sobre essa capacitação para a sua empresa, preencha o formulário a seguir:

Tenho interesse em conversar

Se você está querendo gerar resultados através da tecnologia, preencha este formulário que um de nossos consultores entrará em contato com você:

O seu insight foi excluído com sucesso!

O seu insight foi excluído e não está mais disponível.

O seu insight foi salvo com sucesso!

Ele está na fila de espera, aguardando ser revisado para ter sua publicação programada.

Tenho interesse em conversar

Se você está querendo gerar resultados através da tecnologia, preencha este formulário que um de nossos consultores entrará em contato com você:

Tenho interesse nessa solução

Se você está procurando este tipo de solução para o seu negócio, preencha este formulário que um de nossos consultores entrará em contato com você:

Tenho interesse neste serviço

Se você está procurando este tipo de solução para o seu negócio, preencha este formulário que um de nossos consultores entrará em contato com você:

× Precisa de ajuda?