Partilhar via


Conceitos e terminologia (transformação funcional) (LINQ to XML)

Este artigo introduz os conceitos e a terminologia das transformações funcionais puras. A abordagem de transformação funcional para transformar dados produz código que geralmente é mais rápido de programar, mais expressivo e mais fácil de depurar e manter do que a programação mais tradicional e imperativa.

Observe que os artigos nesta seção não se destinam a explicar completamente a programação funcional. Em vez disso, estes artigos identificam alguns dos recursos de programação funcional que facilitam a transformação do XML de uma forma para outra.

O que é transformação funcional pura

Na transformação funcional pura, um conjunto de funções, chamadas funções puras, definem como transformar um conjunto de dados estruturados de sua forma original em outra forma. A palavra "puro" indica que as funções são compostas, o que requer que elas sejam:

  • Auto-contidos, para que possam ser livremente ordenados e reorganizados sem emaranhamentos ou interdependências com o resto do programa. As transformações puras não têm conhecimento ou efeito sobre o seu ambiente. Ou seja, as funções utilizadas na transformação não têm efeitos secundários.
  • Sem estado, de modo que a execução da mesma função ou conjunto específico de funções na mesma entrada resultará sempre na mesma saída. Transformações puras não têm memória de seu uso anterior.

Importante

No resto deste tutorial, o termo "função pura" é usado em um sentido geral para indicar uma abordagem de programação, e não um recurso específico da linguagem.

Observe que as funções puras devem ser implementadas como métodos em C# e como funções no Visual Basic.

Você não deve confundir funções puras com métodos virtuais puros em C++. Este último indica que a classe que contém é abstrata e que nenhum corpo de método é fornecido.

Programação funcional

A programação funcional é uma abordagem de programação que suporta diretamente a transformação funcional pura.

Historicamente, linguagens de programação funcionais de uso geral, como ML, Scheme, Haskell e F#, têm sido principalmente de interesse para a comunidade acadêmica. Embora sempre tenha sido possível escrever transformações funcionais puras em C# e Visual Basic, a dificuldade de fazê-lo não o tornou uma opção atraente para a maioria dos programadores. Em versões recentes dessas linguagens, no entanto, novas construções de linguagem, como expressões lambda e inferência de tipo, tornam a programação funcional muito mais fácil e produtiva.

Para obter mais informações sobre programação funcional, consulte Programação funcional versus programação imperativa.

Linguagens de programação funcionais específicas do domínio

Embora as linguagens de programação funcionais gerais não tenham sido amplamente adotadas, algumas linguagens de programação funcionais específicas do domínio tiveram mais sucesso. Por exemplo, folhas de estilo em cascata (CSS) são usadas para determinar a aparência de muitas páginas da Web, e folhas de estilo XSLT (Extensible Stylesheet Language Transformations) são usadas extensivamente na manipulação de dados XML. Para obter mais informações sobre XSLT, consulte Transformações XSLT.

Terminologia

A lista a seguir define alguns termos relacionados a transformações funcionais.

Função de ordem superior (primeira classe)
Uma função que pode ser tratada como um objeto programático. Por exemplo, uma função de ordem superior pode ser passada ou retornada de outras funções. Em C# e Visual Basic, delegados e expressões lambda são recursos de linguagem que oferecem suporte a funções de ordem superior. Para escrever uma função de ordem superior, você declara um ou mais argumentos para receber delegados e costuma usar expressões lambda ao chamá-la. Muitos dos operadores de consulta padrão são funções de ordem superior.

Para obter mais informações, consulte Visão geral dos operadores de consulta padrão (C#) e Visão geral dos operadores de consulta padrão (Visual Basic).

expressão lambda
Essencialmente, uma função anônima embutida que pode ser usada sempre que um tipo de delegado é esperado. Esta é uma definição simplificada de expressões lambda, mas é adequada para os fins deste tutorial.

Para obter mais informações, consulte Expressões do Lambda (Guia de Programação em C#) e Expressões do Lambda (Visual Basic)).

Coleção
Um conjunto estruturado de dados, geralmente de um tipo uniforme. Para ser compatível com o LINQ, uma coleção deve implementar a IEnumerable interface ou a IQueryable interface (ou uma de suas contrapartes genéricas, IEnumerator<T> ou IQueryable<T>).

tupla (tipos anônimos)
Um conceito matemático, uma tupla é uma sequência finita de objetos, cada um de um tipo específico. Uma tupla também é conhecida como uma lista ordenada. Tipos anônimos são uma implementação de linguagem desse conceito, que permitem que um tipo de classe sem nome seja declarado e um objeto desse tipo seja instanciado ao mesmo tempo.

Para obter mais informações, consulte Tipos anônimos (Guia de programação em C#) e Tipos anônimos (Visual Basic).

inferência de tipo (digitação implícita)
A capacidade de um compilador para determinar o tipo de uma variável na ausência de uma declaração de tipo explícita.

Para obter mais informações, consulte Variáveis locais digitadas implicitamente (Guia de Programação em C#) e Inferência de tipo local (Visual Basic).

Execução adiada e avaliação preguiçosa
O adiamento da avaliação de uma expressão até que seu valor resolvido seja realmente necessário. A execução adiada é suportada em coleções.

Para obter mais informações sobre C#, consulte Introdução às consultas LINQ (C#) e Execução adiada e avaliação lenta no LINQ to XML (C#).

Para obter mais informações sobre o Visual Basic, consulte Basic Query Operations (Visual Basic) e Deferred Execution and Lazy Evaluation in LINQ to XML (Visual Basic).

Esses recursos de linguagem serão usados em exemplos de código ao longo desta seção.

Consulte também