Bonjour depuis Google I/O 2023. Aujourd'hui, en direct de Mountain View, Google annonce Dart 3, la plus grande version de Dart à ce jour ! Dart 3 comporte trois avancées majeures. Tout d'abord, la sécurité null sonore est désormais assurée à 100 %. Deuxièmement, de nouvelles fonctionnalités linguistiques majeures pour les enregistrements, les motifs et les modificateurs de classe ont été ajoutés. Enfin, un avant-goût de l'avenir est donné par un élargissement de la prise en charge des plates-formes avec du code natif pour le web via la compilation Wasm. Entrons dans les détails.Une sécurité null complète
Au cours des quatre dernières années, nous avons fait évoluer Dart pour en faire un langage rapide, portable et moderne. Aujourd'hui, avec Dart 3, c'est un langage 100 % sécurisé pour le null ! Comme nous l'avons déjà dit, nous ne pensons pas qu'un autre langage de programmation ait jamais ajouté la sécurité null à un langage existant. Ce fut donc un véritable parcours du combattant.
Avec 100 % de sécurité null dans Dart, on a un système solide. Vous pouvez être sûr que si un type dit qu'une valeur n'est pas null, alors elle ne peut jamais être null. Cela permet d'éviter certaines catégories d'erreurs de codage, comme les exceptions de pointeur nul. Cela permet également aux compilateurs et aux systèmes d'exécution d'optimiser le code d'une manière qui ne serait pas possible sans la sécurité des valeurs nulles. Ce choix de conception implique un compromis. Bien que les migrations soient devenues un peu plus difficiles, le choix fait pour Dart est le bon.
Migration vers Dart 3
Le soutien indéfectible de la communauté Dart a joué un rôle essentiel dans l'obtention d'une sécurité nulle : 99 % des 1000 premiers paquets sur pub.dev supportent la sécurité nulle !
Compte tenu de cela, on s'attend à ce que la grande majorité des paquets et des applications qui ont été migrés vers la sécurité null fonctionnent avec Dart 3. Dans quelques cas seulement, une petite quantité de nettoyage dans Dart 3 pourrait avoir un impact sur certains codes. Certaines anciennes API de la bibliothèque principale ont été supprimées et certains outils ont été ajustés. Si vous rencontrez des problèmes lors de la migration vers le SDK Dart 3, veuillez consulter le guide de migration Dart 3. Pour le reste, vous apprécierez les nouvelles bibliothèques de base et les nouveaux outils rationalisés.
Principales fonctionnalités du langage - Enregistrements, patterns et modificateurs de classe
Dart 3 ne se contente pas de modifier le langage existant. Il s'agit également d'ajouter de nouvelles fonctionnalités et capacités significatives ! Il s'agit notamment des enregistrements, des motifs et des modificateurs de classe.
Construire des données structurées avec des enregistrements
Traditionnellement, une fonction Dart ne pouvait renvoyer qu'une seule valeur. Par conséquent, les fonctions qui devaient renvoyer plusieurs valeurs devaient soit les intégrer dans d'autres types de données tels que des cartes ou des listes, soit définir de nouvelles classes pouvant contenir les valeurs. L'utilisation de structures de données non typées affaiblit la sécurité des types. Le fait de devoir définir de nouvelles classes uniquement pour transporter des données ajoute de la friction au processus de codage. Vous avez été très clairs à ce sujet : la demande de langage pour des valeurs de retour multiples est le quatrième problème le plus évalué.
Avec les enregistrements, vous pouvez construire des données structurées avec une syntaxe claire et précise. Prenons l'exemple de cette fonction. Elle lit le nom et l'âge d'un blob JSON et les renvoie dans un enregistrement :
| Code : | Sélectionner tout |
1 2 3 | (String, int) userInfo(Map<String, dynamic> json) {
return (json['name'] as String, json['height'] as int);
} |
Cela devrait sembler familier à tous les développeurs Dart. Un enregistrement ressemble à une liste littérale telle que ['Michael', 'Product Manager'] mais utilise des parenthèses au lieu de crochets. Dans Dart, les enregistrements sont une caractéristique générale. Ils peuvent être utilisés pour d'autres choses que les valeurs de retour des fonctions. Vous pouvez également les stocker dans des variables, les placer dans une liste, les utiliser comme clés dans une carte ou créer des enregistrements contenant d'autres enregistrements. Vous pouvez ajouter des champs sans nom, comme dans l'exemple précédent, et des champs nommés comme (42, description : "Sens de la vie"
Les enregistrements sont des types de valeurs et n'ont pas d'identité. Cela permet à nos compilateurs d'effacer complètement l'objet enregistrement dans certains cas. Les enregistrements sont également dotés d'un opérateur == et de fonctions hashCode définis automatiquement. La documentation sur les enregistrements contient plus de détails.
Travailler avec des données structurées à l'aide de motifs et du filtrage par motifs
Les enregistrements simplifient la construction de données structurées. Cela ne remplace pas l'utilisation de classes pour construire des hiérarchies de types plus formelles. Il s'agit simplement d'une autre option. Dans les deux cas, il est possible que vous souhaitiez décomposer ces données structurées en éléments individuels afin de pouvoir les utiliser. C'est là que le filtrage par motifs entre en jeu.
Considérons une forme élémentaire de modèle. Le motif d'enregistrement suivant déstructure un enregistrement en deux nouvelles variables : name et height. Ces variables peuvent ensuite être utilisées comme n'importe quelle autre variable, par exemple dans un appel à print :
| Code : | Sélectionner tout |
1 2 | var (String name, int height) = userInfo({'name': 'Michael', 'height': 180});
print('User $name is $height cm tall.'); |
Des motifs similaires existent pour les listes et les cartes. Pour tous ces motifs, vous pouvez sauter des éléments individuels avec le motif de soulignement :
| Code : | Sélectionner tout |
var (String name, _) = userInfo(…);
Les motifs brillent lorsqu'ils sont utilisés dans une instruction switch. Depuis le début, Dart n'offre qu'un support limité pour les commutations. Dans Dart 3, la puissance et l'expressivité de l'instruction switch ont été élargies. Le filtrage par motifs est désormais prise en charge dans ces cas. La nécessité d'ajouter un break à la fin de chaque cas a été supprimée. Les opérateurs logiques sont également pris en charge pour combiner les cas. L'exemple suivant montre une instruction switch claire et précise qui analyse un code de caractère :
| Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 | switch (charCode) {
case slash when nextCharCode == slash:
skipComment();
case slash || star || plus || minus:
operator(charCode);
case >= digit0 && <= digit9:
number();
default:
invalid();
} |
L'instruction switch est très utile lorsque vous avez besoin d'une ou plusieurs instructions pour chaque case. Dans certains cas, il suffit de calculer une valeur. Pour ce cas d'utilisation, une expression switch très succincte est proposée. Cette expression ressemble à l'instruction switch, mais utilise une syntaxe différente, adaptée aux expressions. L'exemple de fonction suivant renvoie la valeur d'une expression switch pour calculer une description du...
La fin de cet article est réservée aux abonnés. Soutenez le Club Developpez.com en prenant un abonnement pour que nous puissions continuer à vous proposer des publications.