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.
Défi
FacileConstruisons 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éeclassifyqui accepte un paramètreObjectet renvoie une descriptionString. Utilisez une expression switch avec la correspondance de motifs pour gérer les cas suivants :- Une liste vide
[]doit renvoyerEmpty 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 renvoyerNegative: [value] - Un entier égal à zéro doit renvoyer
Zero - Tout autre entier doit renvoyer
Positive: [value] - Toute autre valeur doit renvoyer
Unknown type
- Une liste vide
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
- Une liste vide
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: 99Essayez 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
}
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
1Fondamentaux de la POO
Fichiers externesBibliothèques et importsIntroduction à la POOClasses vs objetsLe mot-clé thisMéthodesVariables d’instanceBases des constructeursRécapitulatif - Calculatrice simple4Sécurité face aux valeurs nulles
Introduction à la sécurité face aux valeurs nullesNullable vs Non-NullableLes opérateurs ? et !Mot-clé Late et sécurité face aux valeurs nullesOpérateurs sensibles à nullSécurité face aux valeurs nulles dans les classesRécapitulatif – Système de profil utilisateur7Classes abstraites et interfaces
Classes abstraitesMéthodes abstraitesInterfaces en DartInterfaces implicitesImplémenter ou étendreInterfaces multiplesRécapitulatif - Calculateur de formes10Collections et génériques
Vue d’ensemble des List, Set et MapCollections à typage sûrClasses génériquesMéthodes génériquesContraintes génériquesIterable et IteratorRécapitulatif – stockage générique13Concepts avancés de la POO
Composition ou héritageMéthodes d’extensionClasses appelablesClasses scellées (Dart 3)Enregistrements (Dart 3)Patterns et correspondance (3.0)Énumérations avec méthodes2Constructeurs en Dart
Constructeur par défautConstructeurs nommésListes d'initialisationConstructeurs constantsConstructeurs factoryConstructeurs redirigésRécapitulatif - Constructeur de formes5Encapsulation
Membres publics vs privésLa convention du préfixe _Confidentialité au niveau de la bibliothèqueApprofondissement des getters et settersMasquage de l’informationRécapitulatif - Fiches des étudiants8Mixins
Introduction aux MixinsCréer des MixinsUtiliser plusieurs MixinsMot-clé on dans les MixinsMixin ou héritageMixin ou interfaceRécapitulatif - Système animal11Méthodes spéciales
Redéfinition de toString()Redéfinition de hashCode et ==Interface ComparableMéthode call()Redéfinition de noSuchMethodRécapitulatif - Collection personnalisée14Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron Strategy3Propriétés des classes
Membres d’instance et statiquesChamps Final et ConstVariables différéesMéthodes et champs statiquesAccesseurs et mutateursRécapitulatif - Gestionnaire de compte bancaire6Héritage
Héritage de baseLe mot-clé superRedéfinition de méthodeL’annotation @overrideLe mot-clé de classe finalConstructeurs et héritageRécapitulatif – Hiérarchie des employés9Polymorphisme
Bases du polymorphismePolymorphisme via les interfacesVérification des types à l’exécutionLes opérateurs is et asMot-clé covariantRécapitulatif - Processeur de paiements12POO asynchrone
Futures et async/awaitNotions de base des StreamsContrôleurs de StreamsConstructeurs asynchronesAsynchrone dans les méthodes de classeRécapitulatif - récupérateur de données15Patrons de conception – Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron CompositePatron DépôtEntraînez-vous par vous-même : Compilateur Dart en ligne