Uso de `copy()` y Lentes en Programación Funcional
Clase 12 de 36 • Curso de Scala básico
La función copy()
viene por defecto en cualquier tupla y en cualquier Case Class. Esta función es muy importante en el contexto de la inmutabilidad ya que nos permite modificar los valores de un objeto sin necesidad de "sacar sus datos" con apply
y tupled
.
Así entonces, haciendo uso de la función copy, una posible solución para el ejercicio de la clase pasada podría ser:
// Dos case class case class A(id: Int) case class B(id: Int, a: A) // obj1 es inmutable val obj1 = B(1, A(0)) // obj2 es la copia con una copia interna modificada. val obj2 = obj1.copy(a = obj1.a.copy(1))
Se puede observar que obj1.a.copy
no necesita el nombre del atributo, puesto que la clase A solo tiene uno. En cambio, el obj1.copy
sí necesita el nombre del atributo debido a que la clase B tiene varios.
Aunque no es un tema que vayamos a profundizar aquí, te habrás dado cuenta que cuando tienes objetos con muchos más objetos internos en un contexto de inmutabilidad, hacer cambios sobre esos objetos puede ser bastante caótico.
La principal razón es que en programación funcional es preferible no tener muchos objetos internos dentro de otros, o dicho de otra manera, es una cuestión de estilo de programación.
Pero por supuesto, sí existen maneras de hacer este proceso menos tedioso, para eso existe algo que se conoce como Lenses (lentes en inglés).
Qué es Lens
Un Lens es una función que hace más simple mirar y modificar valores internos dentro de una estructura de datos sin necesidad de demasiado código.
Existen varias alternativas, pero las dos que quiero nombrar aquí son:
- Quicklens: Una de las más sencillas para usar y entender el concepto. https://github.com/softwaremill/quicklens
- Monocle: Más potente que la anterior, y basada en otra librería de Lens que se utiliza en Haskell. https://github.com/julien-truffaut/Monocle
Como dije, no es un tema que vayamos a profundizar aquí, puesto que la necesidad de utilizar este tipo de librerías no es muy común, pero de seguro en algún momento sí te vendrá bien saber que existen.