Opérateurs sensibles à null
Fait partie de la section Programmation Orientée Objet du Journey Dart de Coddy. Leçon 27 sur 110.
Au-delà de ?. et !, Dart propose des opérateurs supplémentaires qui rendent le travail avec des valeurs nullables plus concis. Ces opérateurs de gestion de la nullité vous aident à écrire un code plus propre lorsque vous manipulez des valeurs potentiellement nulles.
L'opérateur de coalescence nulle ?? renvoie la valeur de gauche si elle n'est pas nulle, sinon il renvoie la valeur de droite :
String? nickname;
String displayName = nickname ?? 'Guest';
print(displayName); // Guest
nickname = 'Alex';
displayName = nickname ?? 'Guest';
print(displayName); // AlexL'opérateur d'affectation null-aware ??= n'assigne une valeur que si la variable est actuellement nulle :
String? username;
username ??= 'Anonymous';
print(username); // Anonymous
username ??= 'NewName';
print(username); // Toujours Anonymous (n'était pas nulle)Vous pouvez enchaîner l'opérateur d'accès conditionnel (null-aware) ?. pour les propriétés imbriquées :
String? city = user?.address?.city; // Sûr même si user ou address est nullCes opérateurs se combinent bien ensemble. Par exemple, vous pourriez accéder à une propriété nullable et fournir une valeur par défaut :
String greeting = user?.name ?? 'Stranger';
// Si user est null OU si user.name est null, utiliser 'Stranger'L'utilisation de ces opérateurs permet de garder votre code lisible tout en assurant la sécurité vis-à-vis des valeurs nulles dans l'ensemble de votre programme.
Défi
FacileConstruisons un système d'inscription des invités qui montre comment les opérateurs tenant compte de la nullité peuvent rendre votre code plus clair lors de la gestion d'informations facultatives.
Vous organiserez votre code en deux fichiers :
guest.dart: définissez une classeGuestqui représente une personne participant à un événement. Certains invités fournissent tous leurs détails, tandis que d'autres ne donnent que les informations de base. Votre classe doit comporter :- Un
String namenon nullable : chaque invité doit avoir un nom - Un
String? emailnullable : tout le monde ne fournit pas d'adresse e-mail - Un
String? dietaryPreferencenullable : certains invités ne précisent pas leurs besoins alimentaires - Un constructeur qui prend
namecomme paramètre obligatoire - Une méthode
getDisplayEmail()qui renvoie l'adresse e-mail si elle est disponible, ou'No email provided'à l'aide de l'opérateur?? - Une méthode
assignDefaultDiet()qui définitdietaryPreferencesur'Standard'uniquement si sa valeur actuelle est null, à l'aide de l'opérateur??= - Une méthode
getEmailDomain()qui renvoie la longueur de l'adresse e-mail à l'aide de?., ounullsi aucune adresse e-mail n'existe - Une méthode
printBadge()qui affiche les informations du badge de l'invité
- Un
main.dart: importez votre classe d'invité et inscrivez trois invités avec différents niveaux d'information :- Créez un invité nommé
'Alice', définissez son adresse e-mail sur'alice@company.com'et sa préférence alimentaire sur'Vegetarian' - Créez un invité nommé
'Bob', définissez uniquement son adresse e-mail sur'bob@email.org'(laissez sa préférence alimentaire à null) - Créez un invité nommé
'Charlie'(laissez son adresse e-mail et sa préférence alimentaire à null) - Appelez
assignDefaultDiet()sur les trois invités - Pour chaque invité dans l'ordre, appelez
printBadge(), puis affichezEmail length: [result]à l'aide degetEmailDomain()
- Créez un invité nommé
La méthode printBadge() doit afficher les informations dans ce format :
=== Guest Badge ===
Name: [name]
Email: [getDisplayEmail()]
Diet: [dietaryPreference or "Not specified"]Remarquez que la préférence alimentaire d'Alice reste 'Vegetarian', car ??= n'attribue une valeur que lorsque la valeur est null, tandis que Bob et Charlie reçoivent la préférence alimentaire par défaut 'Standard'.
Sortie attendue :
=== Guest Badge ===
Name: Alice
Email: alice@company.com
Diet: Vegetarian
Email length: 17
=== Guest Badge ===
Name: Bob
Email: bob@email.org
Diet: Standard
Email length: 13
=== Guest Badge ===
Name: Charlie
Email: No email provided
Diet: Standard
Email length: nullEssayez vous-même
import 'guest.dart';
void main() {
// TODO: Créer un invité nommé 'Alice'
// Définir son email à 'alice@company.com'
// Définir sa préférence alimentaire à 'Vegetarian'
// TODO: Créer un invité nommé 'Bob'
// Définir uniquement son email à 'bob@email.org'
// Laisser la préférence alimentaire à null
// TODO: Créer un invité nommé 'Charlie'
// Laisser l'email et la préférence alimentaire à null
// TODO: Appeler assignDefaultDiet() sur les trois invités
// TODO: Pour chaque invité dans l'ordre (Alice, Bob, Charlie) :
// - Appeler printBadge()
// - Afficher 'Email length: [result]' en utilisant getEmailDomain()
}
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érique2Constructeurs 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