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.
Aufgabe
EinfachErstelle 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 Feldernxundyzurü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 alsp2.x - p1.xundp2.y - p1.y
- Eine Funktion
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
dxunddyzu extrahieren. Gib anschließendDistance: dx=[dx], dy=[dy]aus
- Erstelle zwei Punkte mit
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=4Probier 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]
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienBibliotheken & ImportsEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort thisMethodenInstanzvariablenGrundlagen von KonstruktorenRückblick – Einfacher Taschenrechner4Null-Sicherheit
Einführung in die Null-SicherheitNullable vs. Non-NullableDie Operatoren ? und !Late-Schlüsselwort und Null-SicherheitNull-bewusste OperatorenNull-Sicherheit in KlassenRückblick – Benutzers профilsystem7Abstrakte Klassen & Interfaces
Abstrakte KlassenAbstrakte MethodenInterfaces in DartImplizite InterfacesImplementieren vs. ErweiternMehrere InterfacesZusammenfassung – Formrechner10Collections & Generics
Übersicht über List, Set und MapTypsichere CollectionsGenerische KlassenGenerische MethodenGenerische EinschränkungenIterable & IteratorRückblick – Generischer Speicher13Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungErweiterungsmethodenAufrufbare KlassenVersiegelte Klassen (Dart 3)Records (Dart 3)Muster & Matching (3.0)Enums mit Methoden16Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen2Konstruktoren in Dart
StandardkonstruktorBenannte KonstruktorenInitialisierungslistenKonstantenkonstruktorenFactory-KonstruktorenWeiterleitende KonstruktorenRückblick – Shape Builder5Kapselung
Öffentliche vs. private MemberDie _-Präfix-KonventionBibliotheksweite SichtbarkeitTiefergehende Getter & SetterInformationsverbergungRückblick – Studierendendaten8Mixins
Einführung in MixinsMixins erstellenMehrere Mixins verwendenDas Schlüsselwort „on“ in MixinsMixin vs. VererbungMixin vs. SchnittstelleRückblick – Tiersystem11Spezielle Methoden
toString()-ÜberschreibunghashCode- & ==-ÜberschreibungComparable-Schnittstellecall()-MethodenoSuchMethod-ÜberschreibungWiederholung – Benutzerdefinierte Collection14Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFabrikmusterBeobachtermusterStrategiemuster17Abschließende Herausforderungen
E-Learning-PlattformBankingsystemSpielcharaktersystemFahrzeugvermietung3Klassen-Eigenschaften
Instanz- vs. statische MemberFinal- und Const-FelderLate-VariablenStatische Methoden und FelderGetter und SetterRückblick – Bankkontoverwaltung6Vererbung
Grundlegende VererbungDas Schlüsselwort superMethodenüberschreibungDie Annotation @overrideDas Schlüsselwort final für KlassenKonstruktoren und VererbungZusammenfassung – Mitarbeiterhierarchie9Polymorphismus
Grundlagen des PolymorphismusPolymorphismus über InterfacesLaufzeit-TypüberprüfungDie Operatoren is & asCovariant-SchlüsselwortZusammenfassung – ZahlungsprozessorÜbe selbstständig: Online-Dart-Compiler