Tout savoir sur les énumérations avec Flutter et Dart
Les énumérations souvent abrégées par enum sont des types de classe particulière qui permettent de représenter un nombre limité de constantes.
Pourquoi utiliser une énumération plutôt qu’une classe?
Les énumérations permettent de représenter un nombre limité de constantes ce qui permet une meilleure lisibilité du code et donc une maintenance facile.
L’utilisation d’une énumération plutôt qu’une classe dépend du contexte; si on connaît d’avance toutes les valeurs il vaut mieux utiliser une énumération, dans le cas contraire il faut créer une classe.
Quelques exemples
Utilisateur: dans ce cas il faut utiliser une classe parce qu’il peut y avoir un nombre illimité d’utilisateur.
Type d’utilisateur: ici vaut mieux utiliser une énumération parce que vous devrez normalement savoir à l’avance les types d’utilisateurs de votre application (ex: admin, éditeur, lecteur).
Jour de la semaine: on sait qu’il y a sept jours dans la semaine, il faut donc utiliser une enum dans ce cas.
Les énumérations en dart
Les énumérations en dart se déclarent et s’utilisent comme dans la plupart des langages de programmation.
Déclaration
Dans cet exemple je crée une simple énumération jour de la semaine avec ses différentes valeurs.
J’écris mon code en Anglais (par habitude), vous pouvez si vous le voulez l’écrire en Français.
enum WeekDay {
monday,
tuesday,
wednesday,
thursday,
friday,
saturday,
sunday
}
Utilisation
WeekDay day = WeekDay.monday;
Aller plus loin
Présentation du problème
Reprenons notre exemple de l’enum Weekday, supposons que nous voulons ajouter un champ numéro (monday: 1, tuesday: 2, wednesday: 3, …) et un autre représentant l’abréviation (monday: “Mon”, tuesday: “Tue”, wednesday: “Wed”, …); comment pourrait-on s’y prendre 🤔?
L’une des solutions serait celle de créer des méthodes à part qui retourneront les valeurs souhaitées.
Le numéro du jour
int getDayNumber(WeekDay day) {
switch (day) {
case WeekDay.monday:
return 1;
case WeekDay.tuesday:
return 2;
case WeekDay.wednesday:
return 3;
case WeekDay.thursday:
return 4;
case WeekDay.friday:
return 5;
case WeekDay.saturday:
return 6;
case WeekDay.sunday:
return 7;
}
}
L’abréviation du jour
String getDayShortName(WeekDay day) {
switch (day) {
case WeekDay.monday:
return 'Mon';
case WeekDay.tuesday:
return 'Tue';
case WeekDay.wednesday:
return 'Wed';
case WeekDay.thursday:
return 'Thu';
case WeekDay.friday:
return 'Fri';
case WeekDay.saturday:
return 'Sat';
case WeekDay.sunday:
return 'Sun';
}
}
Et pour faire appel à ces méthodes
String day = getDayShortName(WeekDay.monday);
int dayNumber = getDayNumber(WeekDay.monday);
Cela fonctionnera correctement mais demande beaucoup de gymnastique 🏋 et pourrait rendre la maintenance beaucoup plus difficile au fur et à mesure que l’on voudra ajouter d’autres propriétés à Weekday.
Solution
Depuis sa version 2.17, Dart a amélioré les énumérations en y ajoutant la possibilité d’ajouter des champs et des méthodes directement dans l’Enum.
Pour ajouter une propriété qui représente le numéro du jour et une autre qui représente l’abréviation du jour, on aura:
enum WeekDay {
monday(1, 'Mon'),
tuesday(2, 'Tue'),
wednesday(3, 'Wed'),
thursday(4, 'Thu'),
friday(5, 'Fri'),
saturday(6, 'Sat'),
sunday(7, 'Sun');
final int number;
final String shortName;
const WeekDay(this.number, this.shortName);
}
Tous les champs doivent être final et le constructeur doit être une constante.
On a un code beaucoup plus court et propre que dans notre méthode précédente.
On peut par exemple y ajouter une méthode qui retourne le WeekDay à partir du shortName
enum WeekDay {
monday(1, 'Mon'),
tuesday(2, 'Tue'),
wednesday(3, 'Wed'),
thursday(4, 'Thu'),
friday(5, 'Fri'),
saturday(6, 'Sat'),
sunday(7, 'Sun');
final int number;
final String shortName;
const WeekDay(this.number, this.shortName);
static WeekDay fromShortName(String shortName) {
for (final WeekDay weekDay in WeekDay.values) {
if (weekDay.shortName == shortName) {
return weekDay;
}
}
throw Exception('Invalid short name: $shortName');
}
}
Cette façon de faire nous offre une multitude de possibilités, il est facile d’ajouter des méthodes et des champs tout en gardant notre code bien structuré et organisé.
Il devient ainsi simple de faire appel à ses méthodes et propriétés
WeekDay weekDay = WeekDay.fromShortName('Mon');
String day = weekDay.shortName;
int dayNumber = weekDay.number;
Conclusion
Il existe plusieurs manières d’arriver à ses fins en Dart comme dans d’autres langages de programmation, mais il est important de pouvoir utiliser au maximum les avantages qu’offre un langage de programmation pour avoir un code propre, bien structuré et donc facilement maintenable.
Dans notre cas, l’utilisation avancée des énumérations nous permet une manipulation plus compréhensible, propre et facilement maintenable.