C# -  Programação Funcional


 Neste artigo vamos apresentar alguns conceitos da programação funcional que estão presentes na linguagem C#.

A linguagem C# nunca foi uma linguagem de programação orientada a objetos pura. Desde o início, o C# tem sido uma linguagem de programação orientada a componentes.

O que significa orientado a componente ?

A linguagem C# oferece herança e polimorfismo que também são usados por linguagens de programação orientadas a objetos; além disso, oferece serviços nativos, suporte a propriedades, eventos e anotações via atributos.

Versões posteriores do C# incluiram a LINQ e Experssions e assim foi incluido o suporte à programação declarativa. Usando expressões declarativas do LINQ, o compilador salva uma árvore de expressão que é usada posteriormente por um provedor para gerar dinamicamente instruções SQL.

Então a linguagem C# não está puramente vinculada a um único paradigma de linguagem de programação, e nos
 últimos anos cada vez mais recursos associados à programação funcional foram adicionados ao C#.

Vejamos alguns deles...

Quais são os fundamentos da programação funcional ?

Os conceitos mais importantes da programação funcional se baseiam em duas abordagens:

1- Evitar a mutação do estado

2- Ter funções de primeira classe

Evitando a mutação do estado

Com a linguagem de programação F#, que é uma linguagem funcional, ao criar um tipo personalizado, um objeto desse tipo é por padrão imutável.

Assim, um objeto pode ser inicializado em um construtor, mas não pode ser alterado mais tarde. Se a mutabilidade for necessária, o tipo precisa ser explicitamente declarado como mutável.

Na linguagem C#, alguns dos tipos predefinidos são imutáveis, como o tipo string, e os metodos que são usados ​​para alterar a string sempre retorne uma nova string.

Nas coleções os métodos usados ​​pelo LINQ não alteram uma coleção, em vez disso, métodos como Where e OrderBy retornam uma nova coleção que é filtrada e uma nova coleção é ordenada.

A plataforma .NET também oferece coleções imutáveis ​​completas no namespace System.Collections.Immutable. Essas coleções não oferecem métodos que alteram a coleção. Em vez disso, novas coleções são sempre retornadas.

Qual é a vantagem de usar tipos imutáveis ?

Como é garantido que ninguém pode mudar uma instância de um tipo, várias threads podem ser usadas ​​para acessar o tipo simultaneamente sem a necessidade de sincronização. Com tipos imutáveis, também é mais fácil criar testes de unidade.

Para criar tipos personalizados, alguns recursos foram adicionados no C# 6.0 para criar tipos imutáveis.  A partir desta versão conseguimos criar uma propriedade somente leitura implementada automaticamente com apenas um acessor get:

public string Nome {get; }

Fora disso, o compilador cria um campo somente leitura que pode ser inicializado apenas no construtor e uma
propriedade com um acessor get retornando este campo.

Funções como primeira classe

Na programação funcional, as funções são de primeira classe. Isso significa que as funções podem ser usadas como argumentos de funções, funções podem ser retornadas de funções e funções podem ser atribuídas a variáveis.

Isso nem sempre foi possível na linguagem C#.

E os delegates ?

Bem, os delegates podem conter endereços de funções, delegados podem ser usados como argumentos de métodos, e delegados podem ser retornados de métodos. No entanto, você precisa estar ciente que comparando a invocação de uma função normal à invocação de um delegado, o delegado tem alguma sobrecarga associada.

Com um degetate, uma instância de uma classe delegada é criada e essa instância possui uma coleção de referências de método. Quando você chama um delegate, a coleção é iterada para chamar cada método atribuído ao delegate.

No C# 6.0, temos  membros com corpo de expressão com métodos e propriedades que apenas definiam um acessor get. Agora, com o C# 7.0, os membros com corpo de expressão podem ser usados em todos os lugares, desde que apenas uma instrução seja usada com a implementação.

Na programação funcional, muitos métodos possuem apenas uma linha, e assim esse recurso pode ser usado com frequência; o número de linhas de código é reduzido porque as chaves não são necessárias.

Assim, da mesma forma, a partir do C# 7.0 temos novos recursos como funções locais, tuplas, correspondências de padrões (pattern matching), etc.

Todos esses recursos vêm do paradigma de programação funcional, e todos são muito úteis para criar
aplicações .NET normais.  As funções locais são úteis parar  permitir um melhor manipulação de erros com métodos usando a declaração yield. Tuplas oferecem uma maneira eficiente de combinar diferentes tipos de dados, etc.

Dessa forma os recursos da programação funcional estão implementados na linguagem C# fornecendo um poderoso arcabouço de recursos que podemos usar para criar aplicações.

E estamos conversados...

"Pensai nas coisas que são de cima, e não nas que são da terra;"
Colossenses 3:2

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti