Menu
Coddy logo textTech

Records (Dart 3)

Teil des Abschnitts Objektorientierte Programmierung der Dart-Journey von Coddy. Lektion 86 von 110.

Dart 3 führte Records ein – eine leichtgewichtige Möglichkeit, mehrere Werte zu bündeln, ohne eine vollständige Klasse zu erstellen. Records sind unveränderlich, verfügen über eine integrierte Gleichheitsprüfung und eignen sich hervorragend dazu, mehrere Werte aus einer Funktion zurückzugeben oder verwandte Daten vorübergehend zu gruppieren.

Erstelle einen Datensatz, indem du Werte in Klammern einschließt:

void main() {
  // Ein einfacher Record mit zwei Werten
  var point = (10, 20);
  print(point.$1);  // 10 - Zugriff auf das erste Element
  print(point.$2);  // 20 - Zugriff auf das zweite Element
  
  // Records mit benannten Feldern
  var person = (name: 'Alice', age: 30);
  print(person.name);  // Alice
  print(person.age);   // 30
}

Auf Positionsfelder wird mit $1, $2 usw. zugegriffen, während benannte Felder ihre Namen direkt verwenden. Sie können beide Stile in einem einzelnen Datensatz mischen.

Records glänzen, wenn Funktionen mehrere Werte zurückgeben – es ist nicht nötig, nur um zwei Datenstücke zurückzugeben, eine Klasse zu erstellen:

(int, int) divideWithRemainder(int a, int b) {
  return (a ~/ b, a % b);
}

(String name, int age) getUser() {
  return ('Bob', 25);
}

void main() {
  var (quotient, remainder) = divideWithRemainder(17, 5);
  print('$quotient remainder $remainder');  // 3 Rest 2
  
  var (name, age) = getUser();
  print('$name is $age');  // Bob ist 25
}

Records unterstützen automatisch die Gleichheit basierend auf ihren Werten, wodurch sie für Vergleiche praktisch sind, ohne selbst == implementieren zu müssen. Verwende Records, wenn du einfache, unveränderliche Datengruppierungen benötigst; verwende Klassen, wenn du Methoden, Veränderlichkeit oder komplexeres Verhalten benötigst.

challenge icon

Aufgabe

Einfach

Erstelle ein Koordinatensystem mit Records! Du wirst Funktionen erstellen, die mit 2D-Punkten arbeiten, die als Records dargestellt werden, und dabei zeigen, wie Records es einfach machen, mehrere zusammengehörige Werte zurückzugeben und mit ihnen zu arbeiten, ohne vollständige Klassen zu erstellen.

Du wirst deinen Code in zwei Dateien organisieren:

  • geometry.dart: Erstelle Funktionen, die Records verwenden, um mit Koordinatendaten zu arbeiten:
    • Eine Funktion createPoint(int x, int y), die einen Record mit den benannten Feldern x und y zurückgibt. Der Rückgabetyp sollte ({int x, int y}) sein
    • Eine Funktion midpoint(({int x, int y}) p1, ({int x, int y}) p2), die den Mittelpunkt zwischen zwei Punkten berechnet und als Record mit benannten Feldern zurückgibt. Verwende für die Berechnung die Ganzzahldivision (~/)
    • Eine Funktion distance(({int x, int y}) p1, ({int x, int y}) p2), die einen Record mit Positionsfeldern zurückgibt: den horizontalen Abstand (Differenz in x) und den vertikalen Abstand (Differenz in y). Der Rückgabetyp sollte (int, int) sein. Berechne dies als p2.x - p1.x und p2.y - p1.y
  • main.dart: Importiere deine Geometriedatei und zeige Records in Aktion:
    • Erstelle zwei Punkte mit createPoint: Punkt A bei (2, 4) und Punkt B bei (10, 8)
    • Gib Point A: ([x], [y]) mithilfe der benannten Felder aus
    • Gib Point B: ([x], [y]) mithilfe der benannten Felder aus
    • Berechne den Mittelpunkt und gib Midpoint: ([x], [y]) aus
    • Berechne den Abstand und verwende Destrukturierung, um die Werte in die Variablen dx und dy zu extrahieren. Gib anschließend Distance: dx=[dx], dy=[dy] aus

Beachte, wie Records es dir ermöglichen, mehrere Werte sauber zurückzugeben – benannte Felder sorgen für Klarheit, wenn die Bedeutung wichtig ist, und Positionsfelder, wenn der Kontext offensichtlich ist!

Erwartete Ausgabe:

Point A: (2, 4)
Point B: (10, 8)
Midpoint: (6, 6)
Distance: dx=8, dy=4

Probier es selbst

import 'geometry.dart';

void main() {
  // TODO: Erstelle Punkt A bei (2, 4) mit createPoint
  
  // TODO: Erstelle Punkt B bei (10, 8) mit createPoint
  
  // TODO: Gib Punkt A mit benannten Feldern aus: Point A: ([x], [y])
  
  // TODO: Gib Punkt B mit benannten Feldern aus: Point B: ([x], [y])
  
  // TODO: Berechne den Mittelpunkt und gib ihn aus: Midpoint: ([x], [y])
  
  // TODO: Berechne die Distanz und verwende Destructuring, um dx und dy zu extrahieren
  // Dann gib aus: Distance: dx=[dx], dy=[dy]
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Dart-Compiler