dart : compute data in the model

Les getters personnalisés en Dart (et comment calculer des données dans un modèle)

Je travaille actuellement sur un POC pour une application tablette, dont l’UI va consommer certaines données calculées directement par les modèles. Pour ce faire, j’ai du utiliser les getters personnalisés de Dart. Vous le savez peut être déjà, en Dart, ajouter des getters et des setters pour des raisons de sécurité uniquement est un « anti-pattern ». Ce n’est pas une bonne pratique, car Dart les fourni déjà par défaut. Mais vous pouvez en revanche remplacer les getters et setters par défaut par des getters et setters personnalisés si vous avez besoin d’ajouter de la logique dans votre modèle.

Au premier abord, j’ai été un peu ennuyée parce que j’essayais de calculer mes données dans un setter. Mais en réalité, je n’avais pas besoin de « set » quoi que ce soit. Je voulais juste que mon modèle calcule seul une valeur spécifique, à partir des valeurs qu’il connaissait déjà, et qu’il me la fournisse lorsque j’appelle mon « objet.valeurSpécifique ».

Comme je n’ai pas pu trouver d’exemple pour faire ça avec un getter (et non un setter), j’ai pensé que ce n’était peut être pas la meilleure manière de procéder. Mais cette façon de coder mon modèle a été approuvée par mon lead dev, donc ça pourrait peut être aider d’autres personnes qui essaient de calculer des données directement depuis le getter d’un modèle.

Disons donc que j’ai un capteur, qui a un statut d’alerte (ce bout de code est seulement un exemple, ce n’est pas un modèle complet). Disons que ce capteur surveille le taux d’humidité de la terre d’une plante, par exemple, et doit envoyer une alerte lorsque celui-ci est trop bas.

Ce capteur a besoin d’un statut, qui est un autre modèle et qui fournit les niveaux du capteur :

Maintenant, disons que je veux calculer le statut d’alerte de mon capteur, en fonction de son niveau actuel (currentLevel) et du niveau d’alerte défini (alertLevel). Je pourrais le faire dans la méthode build de mon widget (dans l’UI donc), je pourrais le faire dans une classe abstraite « Helper »… Mais ce type de logique n’a absolument rien à voir avec l’UI, on est bien d’accord ? Donc ces options vont très bien fonctionner, mais ne sont définitivement pas de bonnes solutions pour un code propre et maintenable.

En revanche, je peux le faire dans un getter personnalisé, directement dans mon modèle, pour que la logique métier reste dans la couche de logique, et que l’UI n’ai qu’à appeler le getter « status.alert » pour savoir si le niveau d’humidité détecté par mon capteur est trop bas.

Voyons comment coder ça :

J’ai mit ce bout de logique dans un getter (et non un setter) parce que je ne définis aucune valeur. J’ai besoin que celle-ci soit calculée automatiquement lorsque je l’appelle. Si j’avais voulu définir cette valeur en fonction d’un paramètre que j’aurais fourni, j’aurais du utiliser un setter à la place.

Voilà pour ce petit exemple, on peut bien sur aller beaucoup plus loin dans la logique, j’ai voulu faire simple pour montrer comment procéder. J’espère que ça pourra aider quelqu’un !

Nevae

Hello ! Je suis développeur IoT et UX designer junior. Vit en France, deux marmots, rat de bibliothèque, fille à chat, Flutter addict, bla bla bla. Les trucs habituels. Allez go, on parle de code !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

back to top