Menu
Coddy logo textTech

Patterns et correspondance (3.0)

Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy. Leçon 87 sur 110.

Dart 3 a introduit la correspondance de motifs, une manière puissante de déstructurer et d’inspecter les données dans une seule expression. Les motifs vous permettent d’extraire des valeurs d’objets, d’en vérifier la structure et de lier des variables, le tout en une seule fois.

Vous avez déjà découvert la déstructuration de base avec les enregistrements. Les motifs permettent d'étendre cette fonctionnalité aux objets, aux listes et aux maps :

void main() {
  // Patterns de liste
  var numbers = [1, 2, 3];
  var [a, b, c] = numbers;
  print('$a, $b, $c');  // 1, 2, 3
  
  // Patterns de map
  var user = {'name': 'Alice', 'age': 30};
  var {'name': name, 'age': age} = user;
  print('$name is $age');  // Alice a 30 ans
}

Les motifs deviennent particulièrement puissants dans les expressions switch. Vous pouvez faire correspondre simultanément le type, la valeur et la structure :

String describe(Object obj) {
  return switch (obj) {
    int n when n < 0 => 'Negative number',
    int n => 'Positive number: $n',
    String s => 'String of length ${s.length}',
    [int first, ...] => 'List starting with $first',
    _ => 'Something else',
  };
}

void main() {
  print(describe(-5));        // Nombre négatif
  print(describe(42));        // Nombre positif : 42
  print(describe([1, 2, 3])); // List starting with 1
}

La when clause ajoute des conditions aux motifs, et ... correspond aux éléments restants d’une liste. Le caractère de soulignement _ agit comme un caractère générique qui correspond à n’importe quoi. Combinés aux classes scellées, les motifs permettent une gestion exhaustive et sûre du typage des structures de données complexes.

challenge icon

Défi

Facile

Construisons un classificateur de données qui utilise la correspondance de motifs pour analyser et catégoriser différents types d’entrées ! Vous allez créer un système capable d’identifier et de décrire diverses structures de données à l’aide des puissantes fonctionnalités de correspondance de motifs de Dart 3.

Vous organiserez votre code en deux fichiers :

  • classifier.dart : Créez une fonction appelée classify qui accepte un paramètre Object et renvoie une description String. Utilisez une expression switch avec la correspondance de motifs pour gérer les cas suivants :
    • Une liste vide [] doit renvoyer Empty list
    • Une liste contenant exactement un élément entier doit renvoyer Single item: [value]
    • Une liste contenant exactement deux éléments doit renvoyer Pair: [first] and [second]
    • Une liste commençant par un entier suivi de plusieurs éléments doit renvoyer List starting with [first], length: [total length] (utilisez le motif reste ...)
    • Une map contenant à la fois les clés 'name' et 'age' doit renvoyer [name] is [age] years old (utilisez la déstructuration par motif de map)
    • Un entier négatif (utilisez la clause when) doit renvoyer Negative: [value]
    • Un entier égal à zéro doit renvoyer Zero
    • Tout autre entier doit renvoyer Positive: [value]
    • Toute autre valeur doit renvoyer Unknown type
  • main.dart : Importez votre classificateur et faites une démonstration de la correspondance de motifs avec différentes entrées. Affichez le résultat de la classification de chacune des valeurs suivantes :
    • Une liste vide []
    • Une liste contenant un élément : [42]
    • Une liste contenant deux éléments : ['hello', 'world']
    • Une liste plus longue : [1, 2, 3, 4, 5]
    • Une map : {'name': 'Alice', 'age': 25}
    • L’entier -10
    • L’entier 0
    • L’entier 99

Ce défi combine les motifs de liste, les motifs de map, la clause when pour les gardes et le motif reste (...) — toutes les fonctionnalités clés de la correspondance de motifs présentées dans la leçon !

Résultat attendu :

Empty list
Single item: 42
Pair: hello and world
List starting with 1, length: 5
Alice is 25 years old
Negative: -10
Zero
Positive: 99

Essayez vous-même

import 'classifier.dart';

void main() {
  // TODO: Utilisez la fonction classify pour catégoriser chaque valeur
  // et affichez les résultats
  
  // Testez avec une liste vide
  print(classify([]));
  
  // TODO: Testez avec une liste contenant un élément : [42]
  
  // TODO: Testez avec une liste contenant deux éléments : ['hello', 'world']
  
  // TODO: Testez avec une liste plus longue : [1, 2, 3, 4, 5]
  
  // TODO: Testez avec une map : {'name': 'Alice', 'age': 25}
  
  // TODO: Testez avec l'entier -10
  
  // TODO: Testez avec l'entier 0
  
  // TODO: Testez avec l'entier 99
}
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

Entraînez-vous par vous-même : Compilateur Dart en ligne