{"id":213,"date":"2023-06-13T01:56:02","date_gmt":"2023-06-13T01:56:02","guid":{"rendered":"https:\/\/canessaalvamiguel.dev\/?p=213"},"modified":"2023-06-14T23:55:21","modified_gmt":"2023-06-14T23:55:21","slug":"pure-functions-in-scala","status":"publish","type":"post","link":"https:\/\/canessaalvamiguel.dev\/index.php\/2023\/06\/13\/pure-functions-in-scala\/","title":{"rendered":"Pure functions in Scala"},"content":{"rendered":"\n<p>En el paradigma de programaci\u00f3n funcional, las funciones puras desempe\u00f1an un papel fundamental. Las funciones puras son aquellas que no tienen efectos secundarios y siempre producen el mismo resultado dado el mismo conjunto de argumentos. En Scala, podemos aprovechar las funciones puras para escribir c\u00f3digo m\u00e1s limpio, predecible y f\u00e1cilmente testable. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfQu\u00e9 son las funciones puras?<\/h2>\n\n\n\n<p><strong>Ausencia de efectos secundarios:<\/strong> Una funci\u00f3n pura no realiza cambios o interacciones con el entorno externo. Esto significa que no modifica variables globales, no lee ni escribe en archivos, ni realiza llamadas a servicios externos. La \u00fanica forma en que una funci\u00f3n pura puede comunicarse con el mundo exterior es a trav\u00e9s de sus par\u00e1metros de entrada y su valor de retorno.<\/p>\n\n\n\n<p><strong>Determinismo<\/strong>: Una funci\u00f3n pura siempre produce el mismo resultado dado el mismo conjunto de argumentos. No depende de ning\u00fan estado mutable o aleatorio. Esto facilita el razonamiento sobre el comportamiento de la funci\u00f3n y garantiza que su resultado sea predecible y consistente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Beneficios de las funciones puras:<\/strong><\/h2>\n\n\n\n<p>Las funciones puras ofrecen una serie de beneficios en el desarrollo de software:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Simplicidad y claridad<\/strong>: Las funciones puras son m\u00e1s simples y m\u00e1s f\u00e1ciles de entender, ya que su comportamiento est\u00e1 completamente determinado por sus argumentos y no est\u00e1n influenciadas por el estado externo. Esto mejora la legibilidad y la mantenibilidad del c\u00f3digo.<\/li>\n\n\n\n<li><strong>Testabilidad<\/strong>: Las funciones puras son altamente testables, ya que sus resultados son predecibles y no dependen de factores externos. Podemos proporcionar diferentes conjuntos de argumentos y verificar f\u00e1cilmente si el resultado es el esperado, lo que facilita la escritura de pruebas unitarias.<\/li>\n\n\n\n<li><strong>Composici\u00f3n<\/strong>: Dado que las funciones puras no tienen efectos secundarios, son f\u00e1cilmente componibles. Podemos combinar varias funciones puras para construir funcionalidad m\u00e1s compleja y aprovechar la modularidad y reutilizaci\u00f3n del c\u00f3digo.<\/li>\n\n\n\n<li><strong>Paralelismo<\/strong>: Las funciones puras son inherentemente seguras para ser ejecutadas en paralelo, ya que no comparten estado mutable. Esto permite aprovechar mejor los recursos del hardware y mejorar el rendimiento de nuestras aplicaciones.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Ejemplos de funciones no puras en Scala y sus implicaciones:<\/h2>\n\n\n\n<p>A continuaci\u00f3n, examinaremos algunos ejemplos de funciones que no cumplen con la propiedad de ser puras y entenderemos por qu\u00e9 esto puede tener implicaciones negativas en nuestro c\u00f3digo.<\/p>\n\n\n\n<p><strong>Ejemplo 1: Funci\u00f3n con efecto secundario<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: scala; title: ; notranslate\" title=\"\">\ndef imprimirMensaje(mensaje: String): Unit = println(mensaje)\n<\/pre><\/div>\n\n\n<p>Esta funci\u00f3n imprime un mensaje en la consola utilizando la funci\u00f3n <code>println<\/code>. Aunque puede parecer inofensiva, esta funci\u00f3n tiene un efecto secundario al interactuar con el entorno externo. Esto puede dificultar la comprensi\u00f3n del comportamiento del programa y hacer que el c\u00f3digo sea m\u00e1s dif\u00edcil de probar y razonar.<\/p>\n\n\n\n<p><strong>Ejemplo 2: Funci\u00f3n dependiente del estado externo<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: scala; title: ; notranslate\" title=\"\">\nvar contador: Int = 0\n\ndef incrementarContador(): Unit = {\n  contador += 1\n}\n<\/pre><\/div>\n\n\n<p>Esta funci\u00f3n incrementa un contador global <code>contador<\/code>. Aunque la funci\u00f3n no tiene efectos secundarios directos, su comportamiento est\u00e1 determinado por un estado mutable externo. Esto puede llevar a resultados inesperados y dificultar el razonamiento sobre el programa.<\/p>\n\n\n\n<p><strong>Ejemplo 3: Funci\u00f3n dependiente de la generaci\u00f3n aleatoria<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: scala; title: ; notranslate\" title=\"\">\ndef generarNumeroAleatorio(): Int = scala.util.Random.nextInt(100)\n<\/pre><\/div>\n\n\n<p>Esta funci\u00f3n genera un n\u00famero aleatorio utilizando la clase <code>Random<\/code> de Scala. Si bien esto puede parecer \u00fatil en ciertos contextos, hace que la funci\u00f3n no sea determinista, ya que su resultado puede variar en diferentes llamadas. Esto puede dificultar la prueba y el razonamiento sobre el c\u00f3digo que utiliza esta funci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ejemplos de funciones puras en Scala y sus implicaciones:<\/h2>\n\n\n\n<p><strong>Ejemplo 1: Funci\u00f3n de suma<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: scala; title: ; notranslate\" title=\"\">\ndef sumar(a: Int, b: Int): Int = a + b\n<\/pre><\/div>\n\n\n<p>Esta funci\u00f3n toma dos enteros, <code>a<\/code> y <code>b<\/code>, y devuelve la suma de ambos. Es una funci\u00f3n pura porque no tiene efectos secundarios y siempre produce el mismo resultado para los mismos valores de entrada. No modifica ninguna variable externa ni interact\u00faa con el entorno externo.<\/p>\n\n\n\n<p><strong>Ejemplo 2: Funci\u00f3n de validaci\u00f3n de edad<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: scala; title: ; notranslate\" title=\"\">\ndef esMayorDeEdad(edad: Int): Boolean = edad &gt;= 18\n<\/pre><\/div>\n\n\n<p>Esta funci\u00f3n toma una edad como argumento y devuelve un valor booleano que indica si la persona es mayor de edad o no. Es una funci\u00f3n pura porque su resultado solo depende del valor de entrada y no realiza cambios en el estado externo. No realiza operaciones de lectura\/escritura en archivos, bases de datos ni realiza ninguna operaci\u00f3n que pueda afectar el entorno externo.<\/p>\n\n\n\n<p><strong>Ejemplo 3: Funci\u00f3n de ordenamiento de una lista<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: scala; title: ; notranslate\" title=\"\">\ndef ordenarLista(lista: List&#x5B;Int]): List&#x5B;Int] = lista.sorted\n<\/pre><\/div>\n\n\n<p>Esta funci\u00f3n toma una lista de enteros y devuelve una nueva lista ordenada de forma ascendente. Es una funci\u00f3n pura porque no modifica la lista original ni realiza cambios en el estado externo. Siempre produce el mismo resultado para la misma lista de entrada, lo que facilita su testabilidad y garantiza la consistencia en su comportamiento.<\/p>\n\n\n\n<p><strong>Ejemplo 4: Funci\u00f3n de c\u00e1lculo del \u00e1rea de un c\u00edrculo<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: scala; title: ; notranslate\" title=\"\">\ndef calcularAreaCirculo(radio: Double): Double = Math.PI * radio * radio\n<\/pre><\/div>\n\n\n<p>Esta funci\u00f3n calcula el \u00e1rea de un c\u00edrculo dado el radio proporcionado. Es una funci\u00f3n pura porque su resultado solo depende del radio y no realiza operaciones que puedan afectar el estado externo. No realiza cambios en variables globales ni interact\u00faa con el entorno.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusi\u00f3n:<\/h2>\n\n\n\n<p>Las funciones puras son fundamentales en la programaci\u00f3n funcional y en Scala. Al utilizar funciones puras, podemos lograr c\u00f3digo m\u00e1s simple, predecible y f\u00e1cil de testear. Evitamos efectos secundarios indeseados, mejoramos la legibilidad y la mantenibilidad del c\u00f3digo, y facilitamos la composici\u00f3n y el paralelismo. Por otro lado, las funciones que no son puras pueden llevar a comportamientos inesperados, dificultar las pruebas y el razonamiento, y disminuir la calidad del c\u00f3digo. Al adoptar un enfoque de programaci\u00f3n funcional y priorizar las funciones puras en Scala, podemos mejorar la calidad y la robustez de nuestras aplicaciones.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En el paradigma de programaci\u00f3n funcional, las funciones puras desempe\u00f1an un papel fundamental. Las funciones puras son aquellas<\/p>\n","protected":false},"author":1,"featured_media":62,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[42,3],"tags":[43,8],"class_list":["post-213","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-funciontal","category-scala","tag-pure-functions","tag-scala"],"_links":{"self":[{"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/posts\/213","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/comments?post=213"}],"version-history":[{"count":1,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/posts\/213\/revisions"}],"predecessor-version":[{"id":214,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/posts\/213\/revisions\/214"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/media\/62"}],"wp:attachment":[{"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/media?parent=213"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/categories?post=213"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/tags?post=213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}