Introducció

En aquest tema, explorarem dos conceptes fonamentals de la programació funcional en Scala: la immutabilitat i les funcions pures. Aquests conceptes són essencials per escriure codi previsible, mantenible i lliure d'errors.

Immutabilitat

Què és la Immutabilitat?

La immutabilitat es refereix a la propietat d'un objecte de no poder ser modificat després de la seva creació. En lloc de canviar l'estat d'un objecte existent, es crea un nou objecte amb l'estat modificat.

Avantatges de la Immutabilitat

  1. Simplicitat: Els objectes immutables són més fàcils d'entendre i raonar.
  2. Seguretat: Redueix els errors relacionats amb l'estat compartit i les condicions de carrera.
  3. Facilitat de Depuració: Els objectes immutables fan que el codi sigui més predictible i més fàcil de depurar.

Exemple de Variables Immutables

val x = 10
// x = 20 // Això donarà un error de compilació perquè 'x' és immutable

Creació d'Objectes Immutables

case class Persona(nom: String, edat: Int)

val persona1 = Persona("Joan", 30)
val persona2 = persona1.copy(edat = 31)

println(persona1) // Persona(Joan, 30)
println(persona2) // Persona(Joan, 31)

Funcions Pures

Què és una Funció Pura?

Una funció pura és una funció que compleix dues condicions:

  1. Determinisme: Per a un conjunt d'entrades donades, sempre retorna el mateix resultat.
  2. Sense Efectes Secundaris: No modifica cap estat extern ni té efectes observables fora de la funció.

Avantatges de les Funcions Pures

  1. Facilitat de Proves: Les funcions pures són més fàcils de provar perquè no depenen de l'estat extern.
  2. Composabilitat: Les funcions pures es poden combinar fàcilment per crear funcions més complexes.
  3. Facilitat de Raonament: És més fàcil raonar sobre el codi quan les funcions són pures.

Exemple de Funció Pura

def suma(a: Int, b: Int): Int = a + b

println(suma(2, 3)) // 5
println(suma(2, 3)) // 5 (sempre retorna el mateix resultat per a les mateixes entrades)

Exemple de Funció No Pura

var total = 0

def sumaNoPura(a: Int, b: Int): Int = {
  total += a + b
  total
}

println(sumaNoPura(2, 3)) // 5
println(sumaNoPura(2, 3)) // 10 (el resultat depèn de l'estat extern)

Exercicis Pràctics

Exercici 1: Crear una Llista Immutables

Crea una llista immutable de números i afegeix un nou número a la llista sense modificar la llista original.

val llistaOriginal = List(1, 2, 3)
val novaLlista = llistaOriginal :+ 4

println(llistaOriginal) // List(1, 2, 3)
println(novaLlista) // List(1, 2, 3, 4)

Exercici 2: Escriure una Funció Pura

Escriu una funció pura que multipliqui dos números i retorna el resultat.

def multiplica(a: Int, b: Int): Int = a * b

println(multiplica(2, 3)) // 6
println(multiplica(2, 3)) // 6

Exercici 3: Identificar Funcions No Pures

Analitza la següent funció i explica per què no és pura.

var contador = 0

def incrementaContador(): Int = {
  contador += 1
  contador
}

Solució: La funció incrementaContador no és pura perquè modifica l'estat extern (contador) i el seu resultat depèn de l'estat extern.

Resum

En aquest tema, hem après sobre la immutabilitat i les funcions pures, dos pilars fonamentals de la programació funcional en Scala. La immutabilitat ens ajuda a crear codi més segur i predictible, mentre que les funcions pures faciliten la prova i la composició del codi. Aquests conceptes són essencials per escriure codi funcional efectiu i mantenible.

© Copyright 2024. Tots els drets reservats