jueves, 17 de abril de 2014

Receta No. 1-23 en C#: Manejo de Eventos con Funciones Anónimas

Tabla de Contenido

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
3.1 Usando delegados anónimas
3.2 Uso de expresiones lambda
4. Práctica: Código C#
5. Conclusiones
6. Glosario
7. Enlaces & Literatura

0. Introducción

La evolución de C# ha sido en varias direcciones respecto a la atención de diferentes tópicos del lenguaje (seguridad, paralelismo o concurrencia, simplicidad expresiva, unificación de tipos, dinamismo, y un etcétera sin fin)  que le hacen capaz de resolver problemas de distinta naturaleza. Por eso en esta receta vamos a tener la oportunidad de conocer tres funciones que facilitan la creación y manejo de eventos cada uno con sus fortalezas y desventajas. Vamos a marcar la diferencia evolutiva desde la versión 1.0 hasta la versión 3.5 de C#, y más precisamente en el apartado de manejo de eventos en la sección de práctica (4).

1. Problema

Actualmente las soluciones que hemos entregado a nuestros clientes utilizan muchas de las características de las versiones 1.0 y 2.0 de C#. El arquitecto de software ha tenido la oportunidad de conocer los nuevos detalles y bondades de la versión 3.0 (y de versiones posteriores) de C#, y quiere refactorizar todo el código de las 5 primeras soluciones desarrolladas en la primera iteración, más adelante se refactorizará las demás según la disponibilidad del presupuesto de TI.

2. Solución

El arquitecto de software conoce que las ventajas del uso de expresiones lambda y delegados anónimos son la clave para esta refactorización. Así que manos a la obra.

3. Discusión de la Solución

3.1 Usando delegados anónimos

La singularidad de la implementación de un manejador de un evento la podemos expresar en código de una sola línea, precisamente una expresión, como si se tratara de una instrucción o sentencia. Veamos este fragmento de código para comprenderlo con más detalle:

MiEvento += new EventHandler(delegate(object sender, EventArgs eventArgs)
{
// implementación del método
}

Observemos que para lograr este cometido, nos basta con enlistar los argumentos del método delante de la palabra clave delegate, y a continuación las llaves de bloque de código para el método en cuestión.

Si requiriéramos reusar o compartir una implementación como la que debería ir en el bloque anterior (marca: // implementación del método), esto comprendería un contra-principio de diseño, pero como mencionamos en el primer párrafo de esta sección, la implementación puede contar con una mera singularidad que no valdría compartirla o reusarla con el resto del código de la clase. A esto tenemos que agregar, que la función de remoción de registros de manejadores de eventos queda inmediatamente inhabilitada, debido a que no se posee una referencia concreta, dado que se trata de una función anónima.

3.2 Uso de expresiones lambda

Las expresiones lambda (dedicaremos más sobre su teoría en artículos C# de próximas entregas) son igualmente calificadas como funciones anónimas. En C# contamos con el operador => (el cual lo podemos leer como 'goes to' (en su lengua original para no distorsionar el concepto nato con traducciones subjetivas)).

En línea con lo anterior, tenemos que al lado izquierdo del operador nombrado especificaciones la lista de variables a pasar a la expresión, y a la derecha, se especifica el código a ejecutar. De este lado, se puede incluir todas las variables requeridas para la implementación.

Veamos cómo registrar un evento usando este tipo de construcción:

MiEvento += new Handler((sender, eventargs) =>
{
// implementación del método
// podemos utilizar sender y eventargs en el cuerpo del método
});

Los tipos de las variables sender, y eventargs son inferidos en tiempo de compilación, por supuesto (excesivamente obvio), por el compilador. De igual modo, para cualquier otra función de esta categoría, sólo nos basta con especificar el identificador de la variable, el compilador hace el resto.

4. Práctica: Código fuente C#

Veamos en una clase simple, precisamente en la implementación del método de punto de entrada de una aplicación C#: Main, el uso de delegados anónimos y expresiones lambda:


Compilación:


  1. csc /target:exe /out:FuncionesAnonimas.exe FuncionesAnonimas.cs

> Prueba de ejecución.

Conclusiones

En el curso de esta receta vimos el poder que nos entrega las funciones anónimas para la composición de manejadores de eventos. La evolución de C# ha permitido el logro de un objetivo en particular, existan diferentes alternativas de composición para atacar problemas y encontrar una solución óptima a los mismo.

Glosario


  • Delegado
  • Expresión
  • Función anónima
  • Lambda
  • Método denominado (named method)

Enlaces & Literatura

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: Anonymous Functions (C# Programming Guide) - http://msdn.microsoft.com/en-us/library/bb882516.aspx



M

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.