Exit e-book
Show all chapters
22
Uniendo todas las piezas
22. 
Uniendo todas las piezas

Sign up to our Newsletter

Signing up to our newsletter allows you to read all our ebooks.

    Introducción a la Programación con Efectos Funcionales usando ZIO
    22

    Uniendo todas las piezas

    Finalmente tenemos todas las piezas de nuestra aplicación, y ahora lo único que nos queda por hacer es unirlas y llamarlas desde el método run que, como hemos mencionado previamente, es el punto de entrada de toda aplicación basada en ZIO:

    def run(args: List[String]): ZIO[ZEnv, Nothing, ExitCode] =
     (for {
       name <- putStrLn("Welcome to ZIO Hangman!") *> getName
       word <- chooseWord
       _    <- gameLoop(State.initial(name, word))
     } yield ()).exitCode
    
    
    

    Podemos ver que la lógica es muy sencilla:

    • Se imprime un mensaje de bienvenida y se solicita el nombre del jugador.
    • Se escoge una palabra de forma aleatoria para que el jugador la adivine.
    • Se ejecuta el bucle del juego.

    Hay algunos detalles importantes que explicar aquí, por ejemplo la expresión:

    for {
       name <- putStrLn("Welcome to ZIO Hangman!") *> getName
       word <- chooseWord
       _    <- gameLoop(State.initial(name, word))
     } yield ()
    
    
    

    Retorna un efecto del tipo ZIO[Console with Random, IOException, Unit], y es interesante ver cómo ZIO sabe exactamente, todo el tiempo, de qué módulos depende un efecto funcional. En este caso el efecto depende del módulo Console y del módulo Random, lo cual es obvio porque nuestra aplicación requiere imprimir mensajes por pantalla, leer texto por teclado y generar palabras aleatorias. Sin embargo, el método run requiere retornar un efecto del tipo ZIO[ZEnv, Nothing, ExitCode]. Es por ello que se necesita llamar el método ZIO#exitCode, el cual retornará un efecto del tipo ZIO[Console with Random, Nothing, ExitCode], de la siguiente manera:

    • Si el efecto original termina exitosamente, se retorna ExitCode.success
    • Si el efecto original falla, se imprime el error por consola y se retorna ExitCode.failure

    Ahora bien, si nos fijamos detenidamente, estamos retornando un efecto del tipo ZIO[Console with Random, Nothing, ExitCode], pero run requiere retornar ZIO[ZEnv, Nothing, ExitCode], ¿entonces por qué no hay ningún error de compilación? Para ello necesitamos entender qué significa ZEnv:

    type ZEnv = Clock with Console with System with Random with Blocking
    
    
    

    Podemos ver que ZEnv es solamente un alias que engloba todos los módulos estándar provistos por ZIO. Entonces, run básicamente espera que se retorne un efecto que requiera solamente los módulos provistos por ZIO, pero no necesariamente todos, y como el efecto que estamos intentando retornar requiere Console with Random, no hay ningún problema. Puede ser que te estés preguntando ahora: ¿acaso hay algún caso en el que tengamos efectos que requieran módulos que no son provistos por ZIO? Y la respuesta es que sí, porque nosotros podemos definir nuestros propios módulos. Y ahora te preguntarás, ¿qué hacemos en estos casos? La respuesta no la encontrarás en este artículo, pero si quieres saber más al respecto tenemos un ebook en inglés que explica cómo desarrollar aplicaciones modulares con ZIO, usando como ejemplo una implementación del juego del Tic-Tac-Toe.

    ¡Y eso es todo! Hemos terminado la implementación del juego del ahorcado, usando un estilo de programación puramente funcional, con la ayuda de la librería ZIO.

    PREVIOUS
    Chapter
    21
    NEXT
    Chapter
    23