Como programador, me resulta atractivo que un lenguaje ofrezca un mecanismo que representa un atajo, que por sí solo nos permita realizar alguna acción, que de otra forma sería más compleja de codificar.
Lo malo es cuando esa funcionalidad, existe en un lenguaje y en el otro no; y que al aprender a usarla en el que si la tiene, consideras que sería bueno tenerla en el otro. Este es el caso del Yield Return, existe en C# y no existe en VB.
Porque no existe en VB?
La respuesta no es simple, según ERIC LIPPERT, en su Blog nos da una explicación muy detallada de los motivos por los cuales sería muy costoso, más que difícil tener una funcionalidad que resultaría agradable tenerla, pero que en realidad no es necesaria.
Si analizamos lo que hace esta instrucción, podemos ver que es muy eficiente en términos del uso de la memoria, posiblemente a primera vista no nos parezca gran cosa, o podría incluso resultar confuso de entender lo que hace.
Ejemplo sin YIELD
En este ejemplo vemos una función que regresara un IEnumerable de un tipo especifico, recibe como parámetro una lista de números, para poder crear la respuesta esperada, se crea la instancia de una lista de elementos, del tipo esperado. Después en un ciclo se van creando las instancias de los objetos y se van agregando a la lista genérica, para que al terminar podamos devolver la lista como un Enumerable, usando uno de los métodos extendidos del List. La lista se regresa hasta que se termina el ciclo.
Ejemplo usando YIELD
En este otro ejemplo vemos que la función es del mismo tipo, y recibe el mismo parámetro, sin embargo no es necesario crear la lista del tipo esperado; dentro del ciclo, podemos ver la palabra YIELD antes que RETURN, y de inmediato en esa misma línea vemos el código que crea el objeto y lo inicializa. Entonces cuando los regresa? Los objetos se van regresando uno por uno, conforme se van creando, no es necesario esperar a que se recorra toda la lista para devolverla.
Como es posible hacer esto?
Al llegar a la línea del Yield, el estado de la función se registra como una marca; lo cual nos permite devolver el objeto, sin perder el punto donde estábamos; de esta forma una vez que el objeto es enviado y volvemos a reanudar la ejecución del programa, dentro del ciclo, se continuara a partir del punto donde se había quedado, permitiéndole al ciclo iterador producir otro objeto, y repetir el mismo proceso hasta que se termine el ciclo.
Cuando es útil?
Cuando queremos procesar los resultados sin tener que esperar a que se termine de crear la lista, además que resulta más eficiente y requiere menos memoria.
En realidad ambos ejemplos logran el objetivo, devolver los objetos a partir de la lista proporcionada. Solo es importante saber las diferencias, para poder aprovecharlas en nuestro beneficio.
El poder del código solo es completo, si tenemos el conocimiento de como usarlo.
No hay comentarios:
Publicar un comentario