Menu
Coddy logo textTech

Les opérateurs ? et !

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

Lorsque vous travaillez avec des types nullables, Dart fournit deux opérateurs essentiels pour accéder aux valeurs en toute sécurité. L’opérateur d’accès tenant compte de la nullité ?. et l’opérateur d’assertion de non-nullité ! vous permettent de contrôler la manière dont vous gérez les valeurs potentiellement nulles.

L'opérateur ?. accède en toute sécurité aux propriétés ou aux méthodes d'une valeur nullable. Si la valeur est nulle, l'expression entière renvoie null au lieu de planter :

String? name = 'Alice';
print(name?.length);  // 5

name = null;
print(name?.length);  // null (pas de crash !)

L'opérateur ! indique à Dart « Je suis certain que cette valeur n'est pas nulle. » Il convertit un type nullable en non-nullable, mais lève une erreur si la valeur est réellement nulle :

String? maybeName = 'Bob';
String definite = maybeName!;  // OK - nous affirmons qu'il n'est pas nul
print(definite.length);  // 3

String? empty = null;
// String crash = empty!;  // Erreur d'exécution ! La valeur était nulle

Utilisez ?. lorsque vous souhaitez gérer les valeurs nulles en toute sécurité. Utilisez ! uniquement lorsque vous êtes absolument certain qu'une valeur existe - peut-être après l'avoir vérifiée avec une instruction if ou lorsque vous savez que la logique garantit une valeur. L'utilisation excessive de ! va à l'encontre de l'objectif de la sécurité null et peut entraîner des plantages lors de l'exécution.

challenge icon

Défi

Facile

Construisons un système d’inventaire de produits qui montre comment travailler en toute sécurité avec des valeurs nullables à l’aide des opérateurs ?. et !.

Vous allez créer deux fichiers pour organiser votre code :

  • product.dart : définissez une classe Product qui représente un article de l’inventaire. Certains produits disposent d’informations complètes, tandis que d’autres sont encore en cours de catalogage. Votre classe doit comporter :
    • Un String name non nullable : chaque produit doit avoir un nom
    • Un double price non nullable : chaque produit doit avoir un prix
    • Un String? description nullable : certains produits n’ont pas encore de description
    • Un String? category nullable : certains produits n’ont pas encore été catégorisés
    • Un constructeur qui prend name et price comme paramètres obligatoires
    • Une méthode getDescriptionLength() qui renvoie la longueur de la description à l’aide de ?., ou null s’il n’y a pas de description
    • Une méthode getCategoryUppercase() qui renvoie la catégorie en majuscules à l’aide de ! — cette méthode suppose que la catégorie a été définie
    • Une méthode displayProduct() qui affiche les informations du produit, en affichant No description lorsque la description est null et Uncategorized lorsque la catégorie est null
  • main.dart : importez votre classe de produit et montrez le fonctionnement des deux opérateurs :
    • Créez un produit nommé 'Laptop' au prix de 999.99, puis définissez sa description sur 'High-performance computing device' et sa catégorie sur 'Electronics'
    • Créez un produit nommé 'Mystery Item' au prix de 49.99 (laissez la description et la catégorie à null)
    • Pour le Laptop : appelez displayProduct(), affichez Description length: [length] à l’aide de getDescriptionLength(), puis affichez Category: [uppercase] à l’aide de getCategoryUppercase()
    • Pour le Mystery Item : appelez displayProduct() et affichez Description length: [length] à l’aide de getDescriptionLength() (cela affichera null)

La méthode displayProduct() doit afficher les informations dans ce format :

Product: [name] - $[price]
Description: [description or "No description"]
Category: [category or "Uncategorized"]

Résultat attendu :

Product: Laptop - $999.99
Description: High-performance computing device
Category: Electronics
Description length: 32
Category: ELECTRONICS
Product: Mystery Item - $49.99
Description: No description
Category: Uncategorized
Description length: null

Essayez vous-même

import 'product.dart';

void main() {
  // TODO: Créer un produit nommé 'Laptop' avec le prix 999.99
  // Ensuite, définir sa description sur 'High-performance computing device'
  // Et définir sa catégorie sur 'Electronics'
  
  // TODO: Créer un produit nommé 'Mystery Item' avec le prix 49.99
  // Laisser la description et la catégorie à null
  
  // TODO: Pour le Laptop :
  // - Appeler displayProduct()
  // - Afficher "Description length: [length]" en utilisant getDescriptionLength()
  // - Afficher "Category: [uppercase]" en utilisant getCategoryUppercase()
  
  // TODO: Pour le Mystery Item :
  // - Appeler displayProduct()
  // - Afficher "Description length: [length]" en utilisant getDescriptionLength()
}
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