Conheça mais sobre C#

Conheça mais sobre C#

7 de novembro de 2017

C#, do concreto ao abstrato

 A linguagem C# é uma das principais linguagens presentes na plataforma .NET e objetiva ser simples e moderna. No momento da criação deste artigo, ela encontra-se na sua sétima versão e oferece inúmeros recursos para que possamos trabalhar de forma abstrata.

Antes de entrarmos nas características da linguagem, precisamos ter em mente que a linguagem ou tecnologia é apenas um meio para solucionarmos os nossos problemas de negócio. O maior desafio é entender o problema de maneira bem detalhada e desenhar uma solução técnica capaz de não apenas solucioná-lo, mas além disso de uma maneira simples e que possa ser reaproveitada, facilmente evoluída e simples de ser mantida.

Pensar no código de uma maneira abstrata é ter a percepção de que uma solução aplicada a um determinado contexto pode, de alguma maneira mais genérica, ser aplicada a outros contextos semelhantes.

Vamos tomar por exemplo um trecho de código que recupera os nomes de uma listagem de clientes:

public string[] GetNamesFromCustomers(Customer[] customers)
{
...
}

O código acima está aparentemente ok, mas se observarmos com um olhar mais abstrato, poderemos extrair uma série de melhorias, a começar pela utilização de arrays, sendo portanto a primeira alteração realizada:

public List<string> GetNamesFromCustomers(List<Customer> customers)
{
...
}

Ótimo, agora temos um código ligeiramente melhor, mas ainda com bastante referências para modelos concretos, tal como a classe List. Podemos abstrair um pouco mais, utilizando uma interface mais pura:

public IEnumerable<string> GetNamesFromCustomers(IEnumerable<Customer> customers)
{
...
}

Melhor, no entanto temos uma redundância de informações. Como entrada recebemos uma listagem de clientes, mas o nome da operação ainda reforça essa afirmação, desnecessariamente. Melhoramos ainda mais dessa forma:

public IEnumerable<string> GetNames(IEnumerable<Customer> customers)
{
...
}

O código está conciso e funcional, mas seleciona apenas os nomes dos clientes. Poderia ser necessário extrairmos outras informações tais como e-mail, telefone, CPF ou qualquer outra da listagem de clientes. Visto esse cenário, tornaremos a informação de seleção genérica, delegando a responsabilidade para o chamador informar o que deseja:

public IEnumerable<TResult> Get<TResult>(
IEnumerable<Customer> customers, Func<Customer, TResult> selector)
{
...
}

Agora temos um código um pouco mais complexo, mas claramente mais abstrato. A primeira abstração percebida é o tipo de retorno genérico “TResult”. Quem consumir essa operação fica obrigado a passar uma função que será responsável por selecionar um objeto do tipo TResult em cada item da coleção de clientes.

Há ainda duas mudanças que podemos aplicar nesse código, uma relativa a nomenclatura e outra com relação a tipagem da coleção. O termo “Get” já não faz mais sentido, sendo o termo “Select” o mais apropriado, uma vez que esse código agora seleciona algo da coleção. Além disso, esse código não precisa tratar especificamente uma coleção de clientes, mas sim qualquer tipo de coleção (ganharemos mais um item genérico). Ao final, temos o seguinte código refatorado:

public IEnumerable<TResult> Select<T, TResult>(
IEnumerable<T> elements, Func<T, TResult> selector)
{
...
}

Mas espera, nós conhecemos esse código! Isso mesmo, estamos falando de LINQ, o conjunto de métodos de extensão extremamente poderosos e abstratos da plataforma .NET. Essa biblioteca é composta não somente por esse método de seleção, mas sim de inúmeros métodos capazes de realizar diversas operações complexas em quaisquer tipos de coleções.

Em suma, o maior desafio na verdade não está no entendimento da linguagem e no seu uso, mas sim na capacidade de entender os desafios de negócio e aplicar os recursos técnicos que a linguagem nos oferece para solução. Além disso, não podemos apenas solucionarmos o problema sem pensarmos nas próximas melhorias e manutenções, precisamos também pensar em como podemos solucionar o problema da maneira mais abstrata e reutilizável possível, essa é a chave para um código de sucesso.

Espero que tenham gostado do artigo C#, do concreto ao abstrato!

Facebooklinkedin