Les Types de Données en Dart

Introduction aux Types de Données

Dans le langage Dart, les types de données sont assignés à des variables, tout comme dans d'autres langages comme C, Python ou Java. Dart est un langage sécurisé au niveau des types, ce qui signifie qu'il combine la vérification de type à l'exécution et à la compilation pour s'assurer qu'une valeur est toujours conforme au type statique d'une variable. De ce fait, essayer d'assigner une chaîne de caractères à une variable entière entraînera une erreur.

Comprendre la Typage Statique

Le typage statique désigne la caractéristique d'un langage de programmation où le type des variables est lié à la compilation. En d'autres termes, le compilateur sait quel est le type d'une variable avant l'exécution du code, ce qui permet de détecter les erreurs liées au type tôt dans le processus. Par exemple, dans le code ci-dessous, toutes les variables (monEntier, monDouble, monBooleen, et maChaine) sont déclarées avec un type de données explicite (int, double, bool et String, respectivement) :

int monEntier = 42;
double monDouble = 3.14;
bool monBooleen = true;
String maChaine = "Bonjour, Codecademy !";

Voici quelques exemples d'affectations incorrectes de valeurs à des variables :

// Valeur non entière assignée à une variable int
int monEntier = "42";
// Type explicite omis pour une variable
var typeManquant = 3.14;
// Variable booléenne avec une valeur de chaîne
bool monBooleen = "false";
// Incompatibilité entre type déclaré et valeur assignée
String maChaine = 123;

Les Différents Types de Données

Nombres : Les nombres sont utilisés pour stocker des valeurs numériques et comprennent les types int, num, et double :

int nombreEntier = 42;
double nombreDecimal = 3.14;
num nombreHéréditaire = 7; // num peut contenir à la fois des valeurs int et double
print(nombreEntier);          // Sortie : 42
print(nombreDecimal);         // Sortie : 3.14
print(nombreHéréditaire);    // Sortie : 7

Chaînes : Les chaînes (String) représentent une séquence de caractères et sont entourées de guillemets simples ou doubles :

String salutation = "Les guillemets doubles fonctionnent !";
String autreChaine = 'Les guillemets simples fonctionnent aussi !';
print(salutation);  // Sortie : Les guillemets doubles fonctionnent !
print(autreChaine); // Sortie : Les guillemets simples fonctionnent aussi !

Booléens : Les booléens (bool) sont utilisés pour les valeurs qui peuvent être soit vraies soit fausses :

bool estDartAmusant = true;
bool estPythonAmusant = false;
print(estDartAmusant); // Sortie : true
print(estPythonAmusant); // Sortie : false

Symboles : Le type Symbol représente un opérateur ou un identifiant. C'est vital pour les API qui identifient des éléments par leur nom, car bien que la minification puisse modifier les noms, les symboles sous-jacents restent inchangés :

Symbol bonSymbole = Symbol('monIdentifiant');
print(bonSymbole); // Sortie : Symbol("monIdentifiant")

Listes : Les listes (List) représentent un groupe d'objets ordonnés, semblables aux tableaux dans d'autres langages :

List maListeDeNombres = [1, 2, 3, 4, 5];
print(maListeDeNombres); // Sortie : [1, 2, 3, 4, 5]

Dictionnaires : Les maps (Map) consistent en paires clé-valeur et peuvent contenir n'importe quel type de données :

Map scoresEtudiants = { 'Alice': 95, 'Bob': 87, 'Charlie': 92};
print(scoresEtudiants['Alice']); // Sortie : 95
print(scoresEtudiants['Bob']);   // Sortie : 87

Valeurs Null : Le type Null représente l'absence de valeur. En Dart, les variables ne sont pas nullables par défaut, et doivent être déclarées explicitement comme nullable :

int? intNullable;  // Entier nullable
String? stringNullable;  // Chaîne nullable
print(intNullable);       // Sortie : null
print(stringNullable);    // Sortie : null

Runes : Les runes exposent les points de code Unicode d'une chaîne. Unicode est une norme d'encodage de caractères qui comprend tous les caractères utilisés par les humains :

String salutation = 'Bonjour 👋'; // Chaîne avec emoji
for (var pointDeCode in salutation.runes) {  print('Point de Code : $pointDeCode, Caractère : ${String.fromCharCode(pointDeCode)}');}

Typage Dynamique

Le typage dynamique se vérifie à l'exécution plutôt qu'à la compilation, ce qui apporte de la flexibilité mais peut entraîner des erreurs au moment de l'exécution :

dynamic variableFlexible = 42;
print(variableFlexible);  // Sortie : 42

Voici quelques exemples supplémentaires :

int variableStatique = 42; // Variable non-dynamique, vérifiée statiquement
dynamic variableDynamique = "Bonjour";
int resultatDynamique = variableDynamique + 10; // Erreur : Le type dynamique peut causer des erreurs d'exécution
int resultatStatique = variableStatique + 10; // Correct : Vérification de type statique
print(resultatDynamique);  // Résultat : Erreur
print(resultatStatique);   // Sortie : 52

Comparaison des Types de Données

Ci-dessous une tableau comparant les types de données en Dart avec d'autres langages :

| Type de Donnée | Dart | Kotlin | Java | Swift | |------------------------|----------------------------|--------------------------------|--------------------------------|--------------------------------| | Entiers | int | Int, Byte, Short, Long | int, byte, short, long | Int, Int8, Int16, Int32, Int64| | Flottants | double | Double, Float | double, float | Double, Float | | Booléen | bool | Boolean | boolean | Bool | | Chaîne | String | String | String | String | | Tableaux | List (générique) | Array (générique) | T[] (types spécifiques) | Array (générique) | | Maps | Map (générique) | Map (générique) | HashMap | Dictionary (générique) | | Null Safety | Non-nullable par défaut | Nullable par défaut | Types primitifs non-nullables, objets peuvent être null| Non-nullable par défaut, ? pour optionnels, ! pour déballage forcé |

Utiliser les Types de Données pour Créer un Site Web

La compréhension des types de données en Dart est cruciale pour le développement d'applications web et de startups. En utilisant les types appropriés, vous pouvez construire des applications robustes qui traitent les entrées des utilisateurs, gèrent les données et garantissent une interaction fluide. Par exemple, lorsque vous développez une application de gestion d'utilisateurs, vous pourriez utiliser des listes pour gérer les données des utilisateurs, des maps pour stocker des scores d'évaluation, et des chaînes pour les messages affichés. En maîtrisant les types de données, vous serez mieux préparé à traiter des scénarios variés, à déboguer efficacement et à optimiser vos applications.