Métodos Maybe Monad en C#

5 minuto(s)

En C# podemos trabajar con un contenedor llamado Maybe Monad, el cual puede representar un valor que puede existir o no, en este Post analizaré algunos métodos que facilitan el trabajo con Maybe Monad en C# y conforme vayamos avanzando se te hará más fácil la comprensión del trabajo con Maybe Monad en C#.

Antes de continuar con este Post te invito a escuchar el Podcast: “Herramientas Online Para El Trabajo En Equipo”:

Spotify:

Sound Cloud:

Bien ahora continuemos con el Post: Métodos Maybe Monad en C#.

Antes de pasar a los métodos consideremos el siguiente código:


Bueno ahora pasemos a los métodos Maybe.

ValueOr y ValueOrMaybe (Manejo de casos donde no hay un valor)

El método ValueOr se puede usar para brindar un valor predeterminado en caso de que el objeto Maybe no contenga un valor, por ejemplo:


El método GetErrorDescription devuelve un Maybe<string> que representa la descripción del error para el código específico. Retorna None (Maybe sin valor) en caso de que no haya una descripción definida para el código de error específico. El tipo de variable mensajeError es un string, específicamente un no Maybe <string>.

La variable mensajeError siempre tendrá un valor. Si el método GetErrorDescription retorna None, se devuelve el valor predeterminado “Unknown error” y se almacena dentro de la variable mensajeError, veamos el siguiente código:


En el código anterior, el valor predeterminado se obtiene llamando a un método llamado GetDefaultErrorMessage. Este método GetDefaultErrorMessage siempre se llamará aquí, incluso si GetErrorDescription devuelve un valor. Esto puede ser un problema si GetDefaultErrorMessage afecta el rendimiento o si tiene efectos secundarios que solo queremos tener si GetErrorDescription devuelve None.

ValueOrThrow (Obtener el valor o lanzar un excepción si no hay un valor)

Consideremos el siguiente código:


El método ValueOrThrow anterior provocará una excepción si GetLogContents devuelve None. Caso contrario devolverá el contenido del registro.

Otro valor (variaciones)

Podemos crear diferentes variaciones de los métodos ValueOr según el tipo de valor. Por ejemplo, podemos declarar ValueOrEmptyArray:


Otro ejemplo son los métodos de extensión ValueOrEmptyString:

Uso de GetItemsWithValue

Veamos el siguiente código:


En el código anterior invocamos GetLogContents 15 veces, el método Select devuelve un enumerable de tipo IEnumerable <Maybe<string>>

GetItemsWithValue nos permite obtener un IEnumerable <string> que corresponde a los objetos que talvez tiene valores. Los que no tienen un valor no se incluirán en el enumerable devuelto.

Uso de IfAllHaveValues

Consideremos el siguiente código:


En el código anterior IfAllHaveValues devolverá None si alguno de los elementos enumerables no tiene valor. Si alguno de los 15 registros no está disponible, IfAllHaveValues devolvería None y ValueOrThrow arrojará una excepción.

La Signature IfAllHaveValues toma un IEnumerable <Maybe<T>> y retorna un Maybe <IEnumerable<T>>

Uso de ToAddIfHasValue

Consideremos el siguiente código:


En el código anterior, creamos una lista de Strings, queremos que la lista tenga “entrada1”, “entrada2”. Asimismo si logMaybe tiene un valor, queremos que su valor se incluya entre “entrada1” y “entrada2”.

La variable lista contiene una lista que tiene 2 o 3 entradas en su interior, dependiendo de si logMaybe tiene un valor. En el código anterior podemos ver que tiene el valor “entry9”.

En C# esto es posible porque la sintaxis del inicializador de lista es extensible. Puede tener un valor, digamos del tipo TValue, en la lista de inicialización siempre que haya un método con una Signature similar a:


Donde TCollection es el tipo de lista que estamos tratando de inicializar.

La siguiente versión de miMetodo es equivalente a la versión mostrada anteriormente:


Tenemos el siguiente método Add:


El método ToAddIfHasValue nos permite ajustar un objeto Maybe dentro de un type especial AddIfHasValue<T>. En la primera versión de miMetodo, el valor devuelto por logMaybe.ToAddIfHasValue() es de tipo AddIfHasValue<string>. Por lo tanto se llama al método de extensión Add para agregar potencialmente el valor dentro de Maybe a la lista.

Ten en cuenta que podría haber definido el método Add para trabajar en Maybe<T> en lugar de AddIfHasValue<T>. El código en miMetodo se vería así en este caso:


El problema que puede suceder es que un Desarrollador que vea el código, espera que haya 3 elementos en la lista. Agregar ToAddIfHasValue facilita al Desarrollador comprender que el valor solo se agregará si existe.

Conclusión

Hemos visto algunos métodos que están diseñados para facilitar el manejo de type Maybes. Espero que estos métodos te sean útiles.

Nota(s)

  • Los métodos y códigos expuestos en este Post, pueden quedar obsoletos, ser modificados o continuar, esto no depende de mi, si no de los Desarrolladores que dan soporte a C.
  • No olvides que debemos usar la Tecnología para hacer cosas Buenas por el Mundo.

 

Síguenos en nuestras Redes Sociales para que no te pierdas nuestros próximos contenidos.