Records (Dart 3)
Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy — leçon 86 sur 110.
Dart 3 a introduit les records — un moyen léger de regrouper plusieurs valeurs sans avoir à créer une classe complète. Les records sont immuables, disposent d'une égalité intégrée et sont parfaits pour retourner plusieurs valeurs depuis une fonction ou pour regrouper temporairement des données liées.
Créez un record en enveloppant les valeurs entre parenthèses :
void main() {
// Un record simple avec deux valeurs
var point = (10, 20);
print(point.$1); // 10 - accès au premier élément
print(point.$2); // 20 - accès au deuxième élément
// Records avec des champs nommés
var person = (name: 'Alice', age: 30);
print(person.name); // Alice
print(person.age); // 30
}Les champs positionnels sont accessibles avec $1, $2, etc., tandis que les champs nommés utilisent directement leurs noms. Vous pouvez mélanger les deux styles dans un seul enregistrement.
Les records excellent lorsqu'il s'agit de retourner plusieurs valeurs à partir de fonctions - pas besoin de créer une classe juste pour retourner deux éléments de données :
(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 reste 2
var (name, age) = getUser();
print('$name is $age'); // Bob a 25 ans
}Les records prennent automatiquement en charge l'égalité basée sur leurs valeurs, ce qui les rend pratiques pour les comparaisons sans avoir à implémenter == vous-même. Utilisez les records lorsque vous avez besoin de groupements de données simples et immuables ; utilisez les classes lorsque vous avez besoin de méthodes, de mutabilité ou d'un comportement plus complexe.
Défi
FacileConstruisons un système de coordonnées en utilisant des records ! Vous allez créer des fonctions qui travaillent avec des points 2D représentés sous forme de records, démontrant ainsi comment les records facilitent le retour et la manipulation de plusieurs valeurs liées sans avoir à créer des classes complètes.
Vous organiserez votre code en deux fichiers :
geometry.dart: Créez des fonctions qui utilisent des records pour manipuler des données de coordonnées :- Une fonction
createPoint(int x, int y)qui retourne un record avec des champs nommésxety. Le type de retour doit être({int x, int y}) - Une fonction
midpoint(({int x, int y}) p1, ({int x, int y}) p2)qui calcule et retourne le point milieu entre deux points sous forme de record avec des champs nommés. Utilisez la division entière (~/) pour le calcul - Une fonction
distance(({int x, int y}) p1, ({int x, int y}) p2)qui retourne un record avec des champs positionnels : la distance horizontale (différence en x) et la distance verticale (différence en y). Le type de retour doit être(int, int). Calculez commep2.x - p1.xetp2.y - p1.y
- Une fonction
main.dart: Importez votre fichier de géométrie et démontrez les records en action :- Créez deux points en utilisant
createPoint: le point A à(2, 4)et le point B à(10, 8) - Affichez
'Point A: (${pointA.x}, ${pointA.y})'en utilisant les champs nommés - Affichez
'Point B: (${pointB.x}, ${pointB.y})'en utilisant les champs nommés - Calculez le point milieu et affichez
'Midpoint: (${mid.x}, ${mid.y})' - Calculez la distance et utilisez la déstructuration pour extraire les valeurs dans les variables
dxetdy, puis affichez'Distance: dx=$dx, dy=$dy'
- Créez deux points en utilisant
Remarquez comment les records vous permettent de retourner plusieurs valeurs proprement - des champs nommés pour la clarté quand la signification importe, et des champs positionnels quand le contexte est évident !
Sortie attendue :
Point A: (2, 4)
Point B: (10, 8)
Midpoint: (6, 6)
Distance: dx=8, dy=4Aide-mémoire
Dart 3 a introduit les records - un moyen léger de regrouper plusieurs valeurs sans créer une classe complète. Les records sont immuables et parfaits pour retourner plusieurs valeurs depuis une fonction.
Créez un record en enveloppant les valeurs entre parenthèses :
// Record simple avec des champs positionnels
var point = (10, 20);
print(point.$1); // 10 - accès au premier élément
print(point.$2); // 20 - accès au deuxième élément
// Records avec des champs nommés
var person = (name: 'Alice', age: 30);
print(person.name); // Alice
print(person.age); // 30Les champs positionnels sont accessibles avec $1, $2, etc., tandis que les champs nommés utilisent directement leurs noms.
Les records sont idéaux pour retourner plusieurs valeurs depuis des fonctions :
// Le type de retour spécifie la structure du record
(int, int) divideWithRemainder(int a, int b) {
return (a ~/ b, a % b);
}
// Champs nommés dans le type de retour
(String name, int age) getUser() {
return ('Bob', 25);
}
// Déstructuration de records
var (quotient, remainder) = divideWithRemainder(17, 5);
print('$quotient remainder $remainder'); // 3 remainder 2
var (name, age) = getUser();
print('$name is $age'); // Bob is 25Les types de retour de record avec des champs nommés utilisent des accolades :
({int x, int y}) createPoint(int x, int y) {
return (x: x, y: y);
}Les records prennent automatiquement en charge l'égalité basée sur leurs valeurs.
Essayez vous-même
import 'geometry.dart';
void main() {
// TODO: Créer le point A à (2, 4) en utilisant createPoint
// TODO: Créer le point B à (10, 8) en utilisant createPoint
// TODO: Afficher le Point A en utilisant les champs nommés : Point A: ([x], [y])
// TODO: Afficher le Point B en utilisant les champs nommés : Point B: ([x], [y])
// TODO: Calculer le point milieu et l'afficher : Midpoint: ([x], [y])
// TODO: Calculer la distance et utiliser la déstructuration pour l'extraire dans dx et dy
// Ensuite, afficher : Distance: dx=[dx], dy=[dy]
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Les bases de la POO
Fichiers externesBibliothèques et importsIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesVariables d'instanceBases des constructeursRécapitulatif - Calculatrice simple4Null Safety
Introduction à la Null SafetyNullable vs Non-NullableLes opérateurs ? et !Le mot-clé late et la Null SafetyLes opérateurs Null-AwareLa Null Safety dans les classesRécapitulatif - Système de profil utilisateur7Classes abstraites et Interfaces
Classes abstraitesMéthodes abstraitesInterfaces en DartInterfaces implicitesImplémentation vs ExtensionInterfaces multiplesRécapitulatif - Calculateur de formes10Collections et Génériques
Aperçu des List, Set et MapCollections Type-SafeClasses génériquesMéthodes génériquesContraintes de généricitéIterable & IteratorRécapitulatif - Stockage générique13Concepts avancés de la POO
Composition vs HéritageMéthodes d'extensionClasses appelablesClasses scellées (Dart 3)Records (Dart 3)Patterns et Matching (3.0)Enums avec méthodes2Les constructeurs en Dart
Constructeur par défautConstructeurs nommésListes d'initialisationConstructeurs constantsConstructeurs factoryConstructeurs de redirectionRécapitulatif - Shape Builder5Encapsulation
Membres publics vs privésLa convention du préfixe _Visibilité au niveau de la bibliothèqueApprofondissement des Getters & SettersMasquage d'informationsRécapitulatif - Dossiers d'étudiants8Mixins
Introduction aux MixinsCréation de MixinsUtilisation de plusieurs MixinsLe mot-clé on dans les MixinsMixin vs HéritageMixin vs InterfaceRécapitulatif - Système Animal11Méthodes spéciales
Redéfinition de toString()Redéfinition de hashCode & ==Interface ComparableMéthode call()Redéfinition de noSuchMethodRécapitulatif - Collection personnalisée14Patrons de conception Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron ObservateurPatron Stratégie3Propriétés de classe
Membres d'instance vs statiquesChamps Final & ConstVariables LateMéthodes et champs statiquesGetters et SettersRécapitulatif - Gestionnaire de compte bancaire6Héritage
Bases de l'héritageLe mot-clé superRedéfinition de méthodeL'annotation @overrideLe mot-clé final pour les classesConstructeurs et héritageRécapitulatif - Hiérarchie des employés9Polymorphisme
Bases du polymorphismePolymorphisme via les interfacesVérification de type à l'exécutionLes opérateurs is & asMot-clé covariantRécapitulatif - Processeur de paiement12POO Asynchrone
Futures & async/awaitBases des StreamsStream ControllersConstructeurs asynchronesL'asynchrone dans les méthodes de classeRécapitulatif - Data Fetcher15Patrons de conception Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode ModèlePatron ÉtatPatron CompositePatron Repository