Le static metaprogramming débarque sur Dart : quel impact sur vos apps Flutter ?
Le static metaprogramming pourrait arriver bientôt sur Dart après une attente de 5 ans.
Pour nos experts mobiles, et plus précisément nos experts Dart, c’est une avancée importante, démontrant l’ouverture d’esprit de la communauté sur les nouvelles normes du marché. Cette évolution du langage Dart va également impacter le Framework Flutter qui utilise ce langage, afin de simplifier davantage le développement d’apps mobiles.
Pourtant aujourd’hui, la métaprogrammation est un concept déjà très présent dans les langages de “Declarative UI”, comme le démontre SwiftUI ou Jetpack Compose avec ses propriétés observables permettant de créer des comportements dynamiques dans l’interface utilisateur. La métaprogrammation est une technique qui autorise un programme à changer d'autres programmes ou lui-même, à tout moment, offrant ainsi plus d'automatisation dans la création de code et renforçant la flexibilité et l'efficacité du développement. Dart souhaite en fait appliquer spécifiquement cette technique au moment de la compilation plutôt qu'à l'exécution : on appelle cela la “métaprogrammation statique”. Elle sera pour ce langage précis utilisé sous le terme de “Macros”.
La métaprogrammation avec Dart jusqu’à aujourd’hui
Actuellement, Dart ne propose pas de solution intégrée pour la métaprogrammation. Il faut nécessairement passer par une bibliothèque supplémentaire comme Freezed. Par exemple, pour créer une classe qui définit un modèle de données à partir d'un format JSON, il faut annoter le code et Freezed génère alors automatiquement des fichiers supplémentaires pour gérer la conversion JSON en modèle Dart. Ce processus de génération de fichiers peut rendre le projet plus lourd et rendre le débogage plus complexe car il peut être difficile de rectifier les erreurs dans des fichiers générés automatiquement et non écrits directement par le développeur.
S’il ne passe pas par une bibliothèque externe, le développeur doit écrire manuellement le code qui convertit un format JSON en un modèle pour chaque nouvelle classe créée. Cela peut rendre le processus de développement là aussi plus lourd et plus long car il nécessite une duplication constante du code pour chaque nouvelle classe.
Les Macros : on y va ou pas ?
L’usage de ces Macros est actuellement en phase d'expérimentation et les syntaxes risquent d’évoluer fortement au fil des mises à jour de Dart. C’est pourquoi, nous déconseillons pour l’instant son usage pour des projets de production car cela entrainerait trop de risque d’incompatibilité de code. Ces notes sont disponibles dans le GitHub du code Dart et vous pourrez, à partir de la version expérimentale Dart 3.4.0-77.0.dev, tester les Macros.
Petit exemple de code qui crée un objet User à partir d’une structure JSON :
@Model() class User { User({ required this.username, required this.password, }); final String username; final String password; } String json = “{‘username’: ‘test’, ‘password’: ‘test’}”;
Sans l’usage de la Macro @Model, nous aurions dû générer tout le code de conversion JSON (ie: User.fromJson(json)) à la main ou utiliser la librairie Freezed qui aurait donc généré de nouveaux fichiers. La macro @Model simplifie grandement la tâche en rendant abstraite la conversion JSON vers un modèle, sans générer plus de code.
Ce que dit la métaprogrammation statique de la philosophie de Dart
N’oublions pas que Dart, créé en 2011, est plus ancien que les langages modernes pour interfaces déclaratives tels que SwiftUI et Jetpack Compose, qui ont tous deux émergé en 2019. Cela signifie que Dart a dû faire face à des défis d'adaptation pour répondre aux nouvelles préférences des développeurs mobiles. Le static metaprogramming illustre donc bien la flexibilité et la résilience de la communauté Dart, qui a réussi à faire évoluer le langage pour qu'il reste en phase avec les tendances actuelles du développement d'applications natives.
La métaprogrammation statique promet en effet de changer profondément comment nous programmons en Dart, en minimisant le volume de code grâce à l'automatisation. Cela va non seulement simplifier la lisibilité et la maintenance mais aussi permettre l'utilisation de techniques de conception plus élaborées. De telles avancées rapprochent les développeurs Dart des approches de développement modernes similaires à celles utilisées dans SwiftUI (pour iOS) ou Jetpack Compose (pour Android), favorisant des paradigmes de programmation plus unifiés et avancés dans le développement mobile.
Une question sur la métaprogrammation statique ou sur l'un de vos projets d'apps ? Contactez-nous !
