Comparteix a través de


Conceptos y terminología (transformación funcional) (LINQ to XML)

Este artículo presenta los conceptos y la terminología en relación con las transformaciones funcionales. La aproximación que utiliza la transformación funcional para transformar datos permite obtener un código que normalmente se escribe más rápido, es más expresivo y fácil de mantener y depurar, si lo comparamos con la programación imperativa, que es más tradicional.

Observe que los artículos incluidos en esta lección no pretenden explicar con detalle cómo es la programación funcional. En su lugar, pretenden resaltar algunas de las características de la programación funcional que facilitan el proceso de transformar un XML de una forma a otra.

¿En qué consiste la transformación funcional pura?

En la transformación funcional pura, existe un conjunto de funciones, llamadas funciones puras, que definen cómo transformar un conjunto de datos estructurados de su forma original a otra forma. La palabra «pura» indica que las funciones admiten composición, lo que significa que son:

  • Autocontenidas, de forma que se pueden ordenar o reorganizar libremente sin preocuparse por las dependencias que puedan tener con el resto del programa. Las transformaciones puras no tienen conocimiento sobre su entorno ni ningún efecto sobre éste. Es decir, las funciones que se usan en la transformación no tienen efectos secundarios.
  • Sin estado, lo que significa que si se ejecuta la misma función o un conjunto específico de funciones en los mismos datos de entrada, el resultado siempre será el mismo. Las transformaciones puras no recuerdan sus ejecuciones anteriores.

Importante

Para el resto de este tutorial, el término "función pura" se utilizará en sentido general para señalar una técnica de programación y no una característica específica del lenguaje.

Tenga en cuenta que las funciones puras deben implementarse como métodos en C# y como funciones en Visual Basic.

No debería confundir las funciones puras con los métodos virtuales puros de C++. Estos últimos indican que la clase contenedora es abstracta y que no incluye ningún cuerpo de método.

Programación funcional

La programación funcional es una técnica de programación que permite el uso de transformaciones funcionales puras directamente.

Tradicionalmente, los lenguajes de programación funcionales de uso general, como ML, Scheme, Haskell y F#, han atraído principalmente la atención de la comunidad académica. Aunque siempre ha sido posible escribir transformaciones funcionales puras en C# y en Visual Basic, la dificultad para hacerlo no la ha convertido en una opción demasiado atractiva de cara a los programadores. No obstante, en las versiones recientes de estos lenguajes se han incorporado nuevos constructores del lenguaje, como son las expresiones lambda o la inferencia de tipos, que simplifican enormemente la programación funcional y permiten aumentar la productividad.

Para obtener más información sobre la programación funcional, consulte Diferencias entre la programación funcional y la programación imperativa.

Lenguajes de programación funcionales específicos del dominio

Aunque todavía no se han adoptado mayoritariamente los lenguajes de programación funcionales, sí han tenido más éxito algunos lenguajes de programación funcionales específicos para ciertos campos. Por ejemplo, las hojas de estilos en cascada (CSS) se utilizan para definir la apariencia de numerosas paginas web y las hojas de estilos del Lenguaje de transformación basado en hojas de estilo (XSLT) se utilizan muy a menudo para la manipulación de datos XML. Para obtener más información sobre XSLT, consulte Transformaciones XSLT.

Terminología

La siguiente lista define algunos términos relacionados con las transformaciones funcionales.

Función de orden superior (primera clase)
Función que se puede tratar como un objeto de programación. Por ejemplo, es posible pasar una función de orden superior como argumento de otra función, así como ser devuelta por otra función. En C# y en Visual Basic, los delegados y las expresiones lambda son características del lenguaje que admiten el uso de funciones de orden superior. Si desea escribir una función de orden superior, deberá declarar uno o más argumentos para recibir delegados, y a menudo utilizará expresiones lambda cuando llame a dichas funciones. La mayoría de operadores estándar de consulta son funciones de orden superior.

Para más información, consulte Información general sobre operadores de consulta estándar (C#) e Información general sobre operador de consulta estándar (Visual Basic).

Expresión lambda
En esencia, es posible utilizar una función anónima alineada siempre que se espere como argumento un tipo delegado. Esta es una definición simplificada de las expresiones lambda, pero resulta adecuada para los objetivos de este tutorial.

Para obtener más información, consulte Expresiones lambda (Guía de programación de C#) y Expresiones lambda (Visual Basic).

colección
Conjunto de datos estructurados, normalmente del mismo tipo. Para que una colección sea compatible con LINQ, ésta debe implementar la interfaz IEnumerable o la interfaz IQueryable (o una de sus equivalentes genéricas), IEnumerator<T> o IQueryable<T>).

Tupla (tipos anónimos)
Se trata de un concepto matemático: una tupa es una secuencia finita de objetos, cada uno de los cuales es de un tipo específico. A las tuplas también se las conoce como listas ordenadas. Los tipos anónimos son una implementación del lenguaje para este concepto, lo que permite declarar un tipo de clase sin nombre e instanciar un objeto de este tipo al mismo tiempo.

Para más información, consulte Tipos anónimos (Guía de programación de C#) y Tipos anónimos (Visual Basic).

Inferencia de tipos (tipos implícitos)
Consiste en la capacidad del compilador para determinar el tipo de una variable en caso de que no exista una declaración de tipos explícita.

Para obtener más información, consulte Variables locales con tipo implícito (Guía de programación de C#) y Inferencia de tipos locales (Visual Basic).

Ejecución aplazada y evaluación diferida
Es posible retrasar la evaluación de una expresión hasta que se requiera el valor resultante. Las colecciones admiten la ejecución aplazada.

Para obtener más información sobre C#, consulte Introducción a las consultas LINQ (C#) y Ejecución aplazada y evaluación diferida en LINQ to XML (C#).

Para obtener más información de Visual Basic, vea Operaciones de consulta básicas (Visual Basic) y Ejecución diferida y Evaluación diferida en LINQ to XML (Visual Basic).

Estas características del lenguaje se utilizarán en códigos de ejemplo a lo largo de esta sección.

Consulte también