Scala for Backend Engineering & Functional Programming · Lektion

Domänen kombinieren

Größere Modelle erstellen

Lektion 4 von 413 Schritte

Domänen kombinieren ist eine kostenlose Scala for Backend Engineering & Functional Programming-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Scala for Backend Engineering & Functional Programming-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Scala for Backend Engineering & Functional Programming-Kurs umfasst insgesamt 4 Lektionen.

Größere Modelle erstellen

Echte Domänen werden aus kleineren Bausteinen zusammengesetzt. Domänen zu komponieren bedeutet, gut modellierte ADTs, newtypes und validierte Werte zu größeren, weiterhin korrekten Strukturen zu kombinieren.

  • Kleine, fokussierte Typen lassen sich zu größeren zusammensetzen.
  • Jeder Baustein bewahrt seine eigenen Invarianten.
case class Money(cents: Long)
case class Product(name: String, price: Money)

object Main:
  def main(args: Array[String]): Unit =
    println(Product("Book", Money(1999)))

Produkte verschachteln

Komponieren Sie Produkttypen, indem Sie case classes verschachteln. Jede Ebene fügt Struktur hinzu und bleibt dabei lesbar.

case class Address(city: String, zip: String)
case class Customer(name: String, address: Address)

object Main:
  def main(args: Array[String]): Unit =
    val c = Customer("Ada", Address("London", "E1"))
    println(c.address.city)

Mit Collections komponieren

Verwenden Sie List, Map und Set, um Eins-zu-viele-Beziehungen innerhalb Ihrer Domäne zu modellieren.

case class Item(name: String, qty: Int)
case class Order(id: Int, items: List[Item])

object Main:
  def main(args: Array[String]): Unit =
    val order = Order(1, List(Item("pen", 2), Item("ink", 1)))
    println(order.items.map(_.qty).sum)

Summ类型 komponieren

Größere Auswahlmöglichkeiten setzen sich aus kleineren zusammen. Eine enum-Variante kann selbst ein weiteres ADT enthalten und so Entscheidungen schichten.

enum Payment:
  case Card(last4: String)
  case Cash

enum Checkout:
  case Completed(payment: Payment)
  case Abandoned

object Main:
  def main(args: Array[String]): Unit =
    val c: Checkout = Checkout.Completed(Payment.Card("1234"))
    println(c)

Funktionen, die Domänen komponieren

Domänenoperationen sind reine Funktionen, die Eingabetypen in Ausgabetypen überführen. Durch ihre Komposition entstehen Workflows.

case class Cart(total: Long)
case class Receipt(total: Long, tax: Long)

object Main:
  def checkout(c: Cart): Receipt =
    Receipt(c.total, (c.total * 0.2).toLong)

  def main(args: Array[String]): Unit =
    println(checkout(Cart(1000)))

Validierungen komponieren

Wenn jedes Feld mithilfe eines Smart Constructors erstellt wird, können Sie sie mit einer for-Comprehension kombinieren. Das gesamte Objekt wird nur erstellt, wenn jeder Teil die Validierung besteht.

object V:
  def name(s: String): Option[String] = if s.nonEmpty then Some(s) else None
  def age(n: Int): Option[Int] = if n >= 0 then Some(n) else None

case class Person(name: String, age: Int)

object Main:
  def make(n: String, a: Int): Option[Person] =
    for nm <- V.name(n); ag <- V.age(a) yield Person(nm, ag)

  def main(args: Array[String]): Unit =
    println(Main.make("Bob", 30))
    println(Main.make("", 30))

Zusammengesetzte Daten falten

Aggregieren Sie zusammengesetzte Strukturen mit fold oder mit map plus sum. Die Form der Daten gibt die Berechnung vor.

case class Line(price: Long, qty: Int)
case class Invoice(lines: List[Line])

object Main:
  def total(inv: Invoice): Long =
    inv.lines.foldLeft(0L)((acc, l) => acc + l.price * l.qty)

  def main(args: Array[String]): Unit =
    val inv = Invoice(List(Line(100, 2), Line(50, 4)))
    println(total(inv))

Unveränderliche Modelle aktualisieren

Komponieren Sie Änderungen mit copy. Diese Methode gibt einen neuen Wert zurück, in dem ausgewählte Felder ersetzt wurden. Das Original bleibt unverändert.

case class Account(id: Int, balance: Long)

object Main:
  def deposit(a: Account, amt: Long): Account =
    a.copy(balance = a.balance + amt)

  def main(args: Array[String]): Unit =
    val a = Account(1, 100)
    println(deposit(a, 50))

Eine Zustandsmaschine modellieren

Komponieren Sie Summentypen und Übergangsfunktionen, um eine Zustandsmaschine zu modellieren, in der nur zulässige Übergänge existieren.

enum Light:
  case Red, Green, Yellow

object Main:
  def next(l: Light): Light = l match
    case Light.Red    => Light.Green
    case Light.Green  => Light.Yellow
    case Light.Yellow => Light.Red

  def main(args: Array[String]): Unit =
    println(next(Light.Red))
    println(next(Light.Green))

Domäne und Operationen schichten

Halten Sie Datentypen rein und legen Sie das Verhalten in Funktionen oder Methoden ab. Ein komponiertes Modell bildet zusammen mit einer Reihe von Transformationen eine kleine Domänenbibliothek.

case class Temp(celsius: Double):
  def toF: Double = celsius * 9 / 5 + 32

object Main:
  def main(args: Array[String]): Unit =
    val t = Temp(25.0)
    println(t.toF)

Alles zusammenführen

Ein vollständiges Modell komponiert newtypes, Produkte, Summen, Collections und validierte Konstruktion. Das Ergebnis lässt sich nur schwer falsch verwenden und leicht nachvollziehen.

  • Erstellen Sie zuerst kleine Typen.
  • Setzen Sie sie zu Aggregaten zusammen.
  • Drücken Sie Operationen als reine Funktionen aus.
case class Sku(value: String)
case class Line(sku: Sku, qty: Int)
case class Basket(lines: List[Line]):
  def count: Int = lines.map(_.qty).sum

object Main:
  def main(args: Array[String]): Unit =
    val b = Basket(List(Line(Sku("A"), 2), Line(Sku("B"), 3)))
    println(b.count)

Kurzer Check

Testen Sie Ihr Verständnis vom Komponieren von Domänen.

Zusammenfassung

Sie haben gelernt, Domänen zu komponieren.

  • Verschachteln Sie Produkte und Summen, um umfangreiche Strukturen zu modellieren.
  • Verwenden Sie Collections für Eins-zu-viele-Beziehungen.
  • Komponieren Sie Validierungen mit for-Comprehensions.
  • Aktualisieren Sie unveränderlich mit copy.
  • Halten Sie Daten rein und drücken Sie Operationen als Funktionen aus.
case class User(id: Int, name: String)
case class Post(author: User, text: String)

object Main:
  def main(args: Array[String]): Unit =
    val p = Post(User(1, "Ada"), "hello")
    println(p.copy(text = "hi"))
Kostenlos starten

Lerne Scala mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
39
Lektionen
143

Häufig gestellte Fragen

Ist die Lektion „Domänen kombinieren“ kostenlos?

Ja — der vollständige Text von „Domänen kombinieren“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Scala for Backend Engineering & Functional Programming-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Scala for Backend Engineering & Functional Programming-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Domänen kombinieren“?

Größere Modelle erstellen Du übst Scala for Backend Engineering & Functional Programming mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Scala for Backend Engineering & Functional Programming zu starten?

Keine Vorkenntnisse erforderlich. Scala for Backend Engineering & Functional Programming auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Domänen kombinieren“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Scala for Backend Engineering & Functional Programming-Lektion Code schreiben und ausführen?

Ja. Jede Scala for Backend Engineering & Functional Programming-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Modellierung mit ADTs
  2. Intelligente Konstruktoren
  3. Newtypes
  4. Domänen kombinieren
← Zurück zu Scala for Backend Engineering & Functional Programming