Menu
Coddy logo textTech

Records (Dart 3)

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

Dart 3 hat Records eingeführt – eine leichtgewichtige Möglichkeit, mehrere Werte zusammenzufassen, ohne eine vollständige Klasse zu erstellen. Records sind unveränderlich, verfügen über eine integrierte Gleichheitsprüfung und eignen sich perfekt dafür, mehrere Werte von einer Funktion zurückzugeben oder verwandte Daten vorübergehend zu gruppieren.

Erstellen Sie einen Record, indem Sie Werte in Klammern einschließen:

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 mehrere Werte von Funktionen zurückgegeben werden – es ist nicht nötig, eine Klasse zu erstellen, nur um zwei Datenelemente zurückzugeben:

(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, was sie praktisch für Vergleiche macht, ohne dass Sie == selbst implementieren müssen. Verwenden Sie Records, wenn Sie einfache, unveränderliche Datengruppierungen benötigen; verwenden Sie Klassen, wenn Sie Methoden, Veränderlichkeit oder komplexeres Verhalten benötigen.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein Koordinatensystem mit Records erstellen! Sie werden Funktionen entwickeln, die mit 2D-Punkten arbeiten, die als Records dargestellt werden. Dabei wird demonstriert, wie Records es einfach machen, mehrere zusammengehörige Werte zurückzugeben und mit ihnen zu arbeiten, ohne vollständige Klassen erstellen zu müssen.

Sie werden Ihren Code in zwei Dateien organisieren:

  • geometry.dart: Erstellen Sie 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. Verwenden Sie für die Berechnung die Ganzzahldivision (~/).
    • Eine Funktion distance(({int x, int y}) p1, ({int x, int y}) p2), die einen Record mit positionellen Feldern zurückgibt: die horizontale Distanz (Differenz in x) und die vertikale Distanz (Differenz in y). Der Rückgabetyp sollte (int, int) sein. Berechnen Sie dies als p2.x - p1.x und p2.y - p1.y.
  • main.dart: Importieren Sie Ihre Geometrie-Datei und demonstrieren Sie Records in Aktion:
    • Erstellen Sie zwei Punkte mit createPoint: Punkt A bei (2, 4) und Punkt B bei (10, 8).
    • Geben Sie 'Point A: (${pointA.x}, ${pointA.y})' unter Verwendung der benannten Felder aus.
    • Geben Sie 'Point B: (${pointB.x}, ${pointB.y})' unter Verwendung der benannten Felder aus.
    • Berechnen Sie den Mittelpunkt und geben Sie 'Midpoint: (${mid.x}, ${mid.y})' aus.
    • Berechnen Sie die Distanz und verwenden Sie Destructuring, um die Werte in die Variablen dx und dy zu extrahieren, und geben Sie dann 'Distance: dx=$dx, dy=$dy' aus.

Beachten Sie, wie Records es Ihnen ermöglichen, mehrere Werte sauber zurückzugeben – benannte Felder für mehr Klarheit, wenn die Bedeutung wichtig ist, und positionelle Felder, wenn der Kontext offensichtlich ist!

Erwartete Ausgabe:

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

Spickzettel

Dart 3 hat Records eingeführt – eine leichtgewichtige Möglichkeit, mehrere Werte zu bündeln, ohne eine vollständige Klasse zu erstellen. Records sind unveränderlich (immutable) und eignen sich perfekt für die Rückgabe mehrerer Werte aus einer Funktion.

Erstellen Sie einen Record, indem Sie Werte in Klammern setzen:

// Einfacher Record mit positionalen Feldern
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 positionale Felder wird mit $1, $2 usw. zugegriffen, während benannte Felder direkt über ihren Namen angesprochen werden.

Records sind ideal für die Rückgabe mehrerer Werte aus Funktionen:

// Rückgabetyp gibt die Record-Struktur an
(int, int) divideWithRemainder(int a, int b) {
  return (a ~/ b, a % b);
}

// Benannte Felder im Rückgabetyp
(String name, int age) getUser() {
  return ('Bob', 25);
}

// Destrukturierung von Records
var (quotient, remainder) = divideWithRemainder(17, 5);
print('$quotient remainder $remainder');  // 3 remainder 2

var (name, age) = getUser();
print('$name is $age');  // Bob is 25

Record-Rückgabetypen mit benannten Feldern verwenden geschweifte Klammern:

({int x, int y}) createPoint(int x, int y) {
  return (x: x, y: y);
}

Records unterstützen automatisch die Gleichheitsprüfung basierend auf ihren Werten.

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