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
- Simplicitat: Els objectes immutables són més fàcils d'entendre i raonar.
- Seguretat: Redueix els errors relacionats amb l'estat compartit i les condicions de carrera.
- 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
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:
- Determinisme: Per a un conjunt d'entrades donades, sempre retorna el mateix resultat.
- Sense Efectes Secundaris: No modifica cap estat extern ni té efectes observables fora de la funció.
Avantatges de les Funcions Pures
- Facilitat de Proves: Les funcions pures són més fàcils de provar perquè no depenen de l'estat extern.
- Composabilitat: Les funcions pures es poden combinar fàcilment per crear funcions més complexes.
- 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.
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.
Curs de Programació en Scala
Mòdul 1: Introducció a Scala
- Introducció a Scala
- Configuració de l'Entorn de Desenvolupament
- Conceptes Bàsics de Scala: Sintaxi i Estructura
- Variables i Tipus de Dades
- Operacions Bàsiques i Expressions
Mòdul 2: Estructures de Control i Funcions
- Declaracions Condicionals
- Bucles i Iteracions
- Funcions i Mètodes
- Funcions d'Ordre Superior
- Funcions Anònimes
Mòdul 3: Col·leccions i Estructures de Dades
- Introducció a les Col·leccions
- Llistes i Arrays
- Conjunts i Mapes
- Tuples i Options
- Coincidència de Patrons
Mòdul 4: Programació Orientada a Objectes en Scala
- Classes i Objectes
- Herència i Traits
- Classes Abstractes i Classes Case
- Objectes Companys
- Objectes Singleton
Mòdul 5: Programació Funcional en Scala
- Immutabilitat i Funcions Pures
- Estructures de Dades Funcionals
- Monads i Functors
- For-Comprehensions
- Gestió d'Errors en la Programació Funcional
Mòdul 6: Conceptes Avançats de Scala
- Conversions i Paràmetres Implícits
- Classes de Tipus i Polimorfisme
- Macros i Reflexió
- Concurrència en Scala
- Introducció a Akka