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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
ASP .NET Core 2 - MiniCurso Básico - Macoratti
ASP .NET Core - Macoratti
C# - Aplicando os conceitos da POO na prática - Macoratti.net
C# - Aplicando conceitos OOP e Polimorfismo na prática - Macoratti.net