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

Elemar Júnior

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#?

Em resumo

O fato
Problemas comuns, resolvidos de maneira recorrente, tem “padrões de codificação repetidos” que, embora adotados por programadores experientes, abrem espaço para erros de lógica, demandando mais testes de unidade.
A novidade
A partir da C# 9, muitos dos padrões de codificação para criação de tipos de dados, somente leitura, estarão incorporados a linguagem.
Os benefícios
Com C# 9, a implementação de tipos de dados, somente leitura, ficará mais fácil, demandando menos código e menos testes. Isso impacta diretamente na produtividade. O único ponto de atenção é a curva, cada vez maior, de aprendizagem.

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
2 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:

Arquitetura de Dados

Insights de um DBA na análise de um plano de execução

Especialista em performance de Bancos de Dados de larga escala
Arquitetura de Software

Estratégias para modernização do legado

Desenvolvedor .NET/NodeJs e especialista em Kafka com experiência em startups e grandes empresas
Infraestrutura e Nuvem

Migração para a nuvem, mais do que mudança tecnológica, implica em mudança da cultura organizacional

Engenheiro de nuvem, arquiteto de software e especialista em Containers e Devops

Acesse nossos canais

Simplificamos, potencializamos e aceleramos resultados usando a tecnologia do jeito certo

EximiaCo 2022 – Todos os direitos reservados

1
0
Queremos saber a sua opinião, deixe seu comentáriox
()
x

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?