Vals and Vars

Inmutable vs mutable

Una de las primeras lecciones con las que nos congratula el mundo de lo funcional es que, los valores que declaramos (val), son inmutables, es decir, solo se asignan una vez y no pueden ser modificados (luego veremos que esto tiene matices). Por tanto, si declarásemos:

val myNumber: Int = 2
myNumber = 3 //Compile-time error

No podríamos modificar su valor. Puede resultar extraño al principio, pero las variables (var) de uso común en otros lenguajes de programación como Java, están totalmente desaconsejadas en Scala.

var myNumber: Int = 2
myNumber = 3
println(myNumber) //Prints out '3'

¿Qué sentido tiene esto? Si pensamos que toda función pura no debe mantener estado, es obvio que no tienen cabida las variables dentro de ellas. Por otra parte, podéis pensar: “Pero el mundo no es funcional: el I/O, por ejemplo, es necesario para configurar la ejecución de un programa”. …Pues tenéis toda la razón. Por eso se recomienda, en el caso de necesitar introducir una variable, comprobar si es realmente necesario, y en caso de que así sea, tratar de ponerlas en el punto más cercano a la entrada de la aplicación. Para todo lo demás….masterVal.

Matices: Stateful objects.

Decíamos antes que el hecho de que un valor se defina como val, implica que no puede modificarse. Del mismo modo también dijimos, que esto tiene matices. Supongamos el siguiente fragmento de código.

class Foo {
  private var initialized: boolean = false
  def initialize(): Unit = {
    initialized = true
  }
  def isInitialized(): Boolean = initialized
}

Si ahora instanciaramos un objeto de tipo Foo

val immutableFoo = new Foo
immutableFoo.isInitialized() // false
immutableFoo = new Foo //Compile-time error

Si intentamos reasignar el valor, obtendremos un error de compilación (hasta aquí nada nuevo). Pero si invocamos a su método initialize…

immutableFoo.isInitialzed() // false
immutableFoo.initialize()
immutableFoo.isInitialized() // true

…habremos modificado su estado interno. Nuestro Foo es lo que se denomina un ‘Stateful object’: un objeto con estado. En Scala se procura rehusar de este comportamiento, pero no olvidemos que esto es lo habitual en código proveniente de Java, y dado que una de las facilidades que aporta Scala es la integración con Java, es muy común utilizar librerías y frameworks escritos en Java. Por tanto, de cara a nuevos desarrollos en Scala, es preferible evitar este tipo de patrón, aun siendo conscientes que es probable que al integrar con otras herramientas, podemos encontrárnoslo.

Lo mejor de los dos mundos…

Una de las virtudes que tiene Scala (la gente de scalaz nos mata), es la existencia de los var. KqsQlDV

¿Pero no habías dicho antes que var=caca? Cierto. Pero precisamente el permitir este tipo de expresiones facilita la adopción de Scala a la gente que viene de otros lenguajes como Java. Una transición puede ser menos traumática si, en principio, usando la sintaxis de Scala, utilizas las mismas construcciones del lenguaje de donde provienes para, más adelante, acabar adoptando un estilo más funcional.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s