Menu
Coddy logo textTech

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.

challenge icon

Défi

Facile

Construisons 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és x et y. 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 comme p2.x - p1.x et p2.y - p1.y
  • 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 dx et dy, puis affichez 'Distance: dx=$dx, dy=$dy'

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=4

Aide-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);   // 30

Les 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 25

Les 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]
}
quiz iconTestez-vous

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