Scala voor backend-engineering en functioneel programmeren · Les

Immutability en bijwerkingen

Krijg inzicht in het belang van immutability bij functioneel programmeren en leer hoe u bijwerkingen effectief beheert.

Les 3 van 311 stappen

Immutability en bijwerkingen is een gratis Scala voor backend-engineering en functioneel programmeren-les op CoddyKit. Dit is les 3 van 3. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Scala voor backend-engineering en functioneel programmeren. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Scala voor backend-engineering en functioneel programmeren bevat in totaal 3 lessen.

Onveranderlijkheid als ontwerpprincipe

Welkom bij onze les over onveranderlijkheid en neveneffecten! Dit zijn kernconcepten in het functionele programmeren (FP) die je helpen schonere en voorspelbaardere code te schrijven.

Bij FP werken we bij voorkeur met onveranderlijke gegevens. Dat betekent dat een gegeven zodra het is gemaakt niet meer kan worden gewijzigd. Zie het als een foto: je kunt ernaar kijken, maar je kunt het oorspronkelijke moment dat erop is vastgelegd niet aanpassen.

`val` versus `var` in Scala

Met Scala kun je eenvoudig onveranderlijke waarden declareren met het sleutelwoord val. Dit is een constante verwijzing die na de eerste definitie niet opnieuw kan worden toegewezen. Voor veranderlijke variabelen gebruik je var.

Bekijk het verschil:

object Main {
  def main(args: Array[String]): Unit = {
    // Immutable value
    val greeting = "Hello"
    // greeting = "Hi" // This would cause a compile error!

    // Mutable variable
    var count = 0
    count = 1 // This is allowed

    println(greeting)
    println(count)
  }
}

Waarom onveranderlijkheid belangrijk is

Onveranderlijkheid biedt verschillende krachtige voordelen voor je code, vooral in gelijktijdige en complexe systemen:

  • Voorspelbaarheid: Je weet altijd dat een waarde niet onverwacht verandert.
  • Veiligheid bij gelijktijdigheid: Meerdere delen van je programma kunnen dezelfde gegevens lezen zonder dat je je zorgen hoeft te maken dat een ander deel ze wijzigt. Complexe vergrendelingen zijn niet nodig!
  • Eenvoudiger foutopsporing: Fouten opsporen wordt eenvoudiger omdat je geen rekening hoeft te houden met toestandswijzigingen in de loop van de tijd.

Onveranderlijke verzamelingen

De standaardbibliotheek van Scala geeft standaard sterk de voorkeur aan onveranderlijke verzamelingen. Wanneer je een onveranderlijke verzameling 'wijzigt', krijg je in werkelijkheid een nieuwe verzameling met de wijzigingen, terwijl de oorspronkelijke verzameling ongewijzigd blijft.

Hier is een voorbeeld met een onveranderlijke List:

object Main {
  def main(args: Array[String]): Unit = {
    val numbers = List(1, 2, 3)
    val newNumbers = numbers :+ 4 // Creates a new list

    println(s"Original list: $numbers")
    println(s"New list: $newNumbers")
  }
}

Neveneffecten begrijpen

In tegenstelling tot onveranderlijkheid treedt er een neveneffect op wanneer een functie of expressie iets anders doet dan alleen een waarde teruggeven. De functie werkt dan samen met de 'buitenwereld' of wijzigt een veranderlijke toestand.

Veelvoorkomende neveneffecten zijn:

  • Een globale variabele of een veranderlijk object wijzigen.
  • Naar de console afdrukken (I/O).
  • Naar een bestand of database schrijven.
  • De systeemklok wijzigen.

Het probleem met neveneffecten

Hoewel neveneffecten soms noodzakelijk zijn, proberen we ze bij functioneel programmeren tot een minimum te beperken en te isoleren. Waarom?

  • Moeilijker te begrijpen: De uitvoer van een functie kan afhangen van externe toestand, waardoor deze onvoorspelbaar wordt.
  • Moeilijker te testen: Tests moeten externe toestanden instellen en weer opruimen.
  • Problemen bij gelijktijdigheid: Meerdere threads die neveneffecten uitvoeren, kunnen leiden tot racecondities en fouten.

Neveneffecten in code herkennen

Laten we een Scala-voorbeeld bekijken. De ene functie heeft een neveneffect en de andere niet. Zie je het verschil?

object Main {
  var total = 0 // A mutable global variable

  // Function with a side effect
  def addAndPrint(x: Int, y: Int): Int = {
    total = x + y // Modifies global state
    println(s"Sum is: $total") // I/O side effect
    total
  }

  // Function without side effects (pure function)
  def pureAdd(x: Int, y: Int): Int = {
    x + y // Only returns a value
  }

  def main(args: Array[String]): Unit = {
    addAndPrint(5, 3)
    println(s"Global total: $total")
    println(s"Pure sum: ${pureAdd(5, 3)}")
  }
}

Zuivere functies: het FP-ideaal

Het uiteindelijke doel bij FP is het schrijven van zuivere functies. Een zuivere functie heeft twee belangrijke eigenschappen:

  1. De functie produceert altijd dezelfde uitvoer voor dezelfde invoer (deterministisch).
  2. De functie veroorzaakt geen neveneffecten (er verandert niets buiten het bereik ervan).

De functie pureAdd uit het vorige voorbeeld is een zuivere functie!

Neveneffecten beheren

Omdat sommige neveneffecten onvermijdelijk zijn (zoals resultaten afdrukken of gegevens opslaan), is de FP-benadering:

  • Ze isoleren: Houd functies met neveneffecten gescheiden van zuivere functies.
  • Ze naar de randen verplaatsen: Voer I/O uit aan het begin of einde van je programma, of binnen speciale gedeelten die effecten afhandelen.
  • FP-constructies gebruiken: Bibliotheken bieden vaak typen (zoals IO of Task) om effecten expliciet weer te geven en te beheren.

Controleer je begrip

Welke van de volgende uitspraken over onveranderlijkheid en neveneffecten bij functioneel programmeren is WAAR?

Samenvatting: onveranderlijkheid en effecten

Goed gedaan! In deze les hebben we de belangrijke concepten onveranderlijkheid en neveneffecten in het functionele programmeren verkend.

  • We zagen hoe val onveranderlijkheid in Scala bevordert, wat leidt tot beter voorspelbare en veiligere code bij gelijktijdigheid.
  • We definieerden neveneffecten als interacties buiten de retourwaarde van een functie en begrepen waarom ze code ingewikkelder kunnen maken.
  • Tot slot leerden we over zuivere functies als het FP-ideaal: ze zijn deterministisch en vrij van neveneffecten. Ook bespraken we strategieën om noodzakelijke neveneffecten te beheren.

Deze concepten beheersen is essentieel voor het schrijven van robuuste en elegante functionele Scala-toepassingen!

Gratis beginnen

Leer Scala met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
39
Lessen
143

Veelgestelde vragen

Is de les “Immutability en bijwerkingen” gratis?

Ja — de volledige tekst van “Immutability en bijwerkingen” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Scala voor backend-engineering en functioneel programmeren wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Scala voor backend-engineering en functioneel programmeren bevat in totaal 3 lessen.

Wat leer ik in “Immutability en bijwerkingen”?

Krijg inzicht in het belang van immutability bij functioneel programmeren en leer hoe u bijwerkingen effectief beheert. Je oefent met Scala voor backend-engineering en functioneel programmeren door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Scala voor backend-engineering en functioneel programmeren te beginnen?

Ervaring vooraf is niet nodig. Scala voor backend-engineering en functioneel programmeren op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 3.

Hoe lang duurt de les “Immutability en bijwerkingen”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Scala voor backend-engineering en functioneel programmeren?

Ja. Elke les over Scala voor backend-engineering en functioneel programmeren bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Functies als eersteklaswaarden
  2. Functies van hogere orde en currying
  3. Immutability en bijwerkingen
← Terug naar Scala voor backend-engineering en functioneel programmeren