Conceptos y terminología (transformación funcional)
Actualización: November 2007
Este tema 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 temas 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, llamado 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 son un componente, lo que significa que son:
Autocontenidas, de forma que se pueden mover o trasladar libremente sin preocuparse por las dependencias que pueda 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 utilizan 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 con los mismos datos de entrada, el resultado siempre será el mismo. Las transformaciones puras no recuerdan sus ejecuciones anteriores.
Nota 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. (En Visual Basic, las subrutinas no pueden devolver un valor y, por tanto, no se utilizan para escribir transformaciones funcionales puras). Además, 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.
Históricamente, los lenguajes de programación funcionales de propósito general, como ML, Scheme, Haskell y F# (de Microsoft Research) 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, con la llegada de C# 3.0 y de Visual Basic 9, 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 acerca de la programación funcional, vea Diferencias entre programación funcional y programación imperativa.
Lenguajes de programación funcionales para ciertos campos
Aunque todavía no se han adoptado mayoritariamente los lenguajes de programación funcionales, sí han tenido más éxito los lenguajes de programación funcionales específicos para ciertos campos. Por ejemplo, las Hojas de estilo en cascada (CSS) se utilizan para definir el aspecto de numerosas paginas Web y las hojas de estilo 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 acerca de XSLT, vea Transformaciones XSLT.
Terminología
La siguiente tabla 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 obtener más información, vea Información general sobre operadores de consulta estándar.
Expresión lambda
En esencia, es posible utilizar una función anónima en línea 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, vea Expresiones lambda (Guía de programación de C#) o Expresiones lambda.
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 obtener más información, vea Tipos anónimos (Guía de programación de C#) o Tipos anónimos.
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 explícita del mismo.Para obtener más información, vea Variables locales con asignación implícita de tipos (Guía de programación de C#) o Inferencia de tipo de variable local.
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, vea Introducción a consultas con LINQ y Ejecución aplazada y evaluación diferida en LINQ to XML.
Estas características del lenguaje se utilizarán en códigos de ejemplo a lo largo de esta sección.
Vea también
Conceptos
Introducción a las transformaciones funcionales puras
Diferencias entre programación funcional y programación imperativa