La Programmation Orientée Données (DOP)
Les derniers outils de Java : optimisation de la gestion des données
Sujet central de la conférence Tech Hub 2023 à Porto, la programmation orientée données est un sujet d’actualité structurant qu’adresse Apside. Ce paradigme de programmation offre une approche structurée pour gérer la complexité inhérente au développement de logiciels. Il est important de noter que la programmation orientée données ne cherche pas à remplacer la programmation orientée objets ; en réalité, les deux paradigmes se complètent souvent. En effet, les langages de programmation orientés objets comme Java ou C# ont été initialement développés à une époque dominée par les applications monolithiques, nécessitant la gestion de l’état et du comportement des modèles.
De plus, dans le développement d’applications contemporaines, la tendance est à la décomposition des applications en briques consommées par d’autres services ou interagissant directement avec le front-end. Ces services traitent typiquement des requêtes externes, telles que des requêtes HTTP, qui transportent souvent des charges utiles non typées comme JSON, XML ou YAML. Cependant, il est généralement incommode pour les services de manipuler directement les données dans ces formats bruts. Représenter les données sous des formes plus structurées, comme des entiers pour les nombres, des classes LocalDateTime pour les dates ou des collections pour les listes, est plus intuitif et gérable. De plus, la validation des données, au moins avant leur traitement, est une pratique fondamentale pour garantir l’intégrité et la fiabilité des données.
Optimisation grâce aux enregistrements et aux classes scellées de Java
Pour résumer les directives d’implémentation de la programmation orientée données (DOP), Nicolai Parlog – Java Developer Advocate at Oracle – en se basant sur l’article de Brian Goetz – Java Language Architect at Oracle – présente les principes directeurs suivants :
- Modélisation des données : Les enregistrements doivent strictement modéliser les données, chacun représentant une entité unique avec des noms de composants clairs et descriptifs. Les choix au sein du modèle de données, tels que les scénarios alternatifs, doivent être encapsulés en utilisant des classes scellées, chaque alternative étant modélisée par un enregistrement distinct. Les comportements au sein des classes d’enregistrement doivent se limiter aux opérations dérivées directement des données elles-mêmes, comme le formatage.
- Immutabilité des données : Les données doivent être immuables pour garantir la stabilité et la cohérence. Les champs muables au sein des objets introduisent de l’ambiguïté et peuvent entraîner des modifications inattendues des données. Les enregistrements offrent un certain niveau d’immuabilité, mais le respect de ce niveau nécessite de la discipline pour empêcher les états mutables de compromettre l’intégrité des données.
- Validation des frontières : Avant d’intégrer des données dans le système, elles doivent être confirmées pour garantir leur validité. Ce processus de validation peut se produire dans le constructeur d’enregistrement s’il s’applique universellement, ou il peut être effectué à la frontière du système, où les données sont reçues de sources externes.
- Élimination des états illégaux : L’utilisation d’enregistrements et de types scellés facilite la modélisation des domaines d’une manière qui rend les états erronés non représentables. Cette approche est préférable à la vérification constante de la validité, car elle empêche les données invalides d’être modélisées. L’immuabilité et les techniques de modélisation rigoureuses aident à éliminer les sources courantes d’erreurs dans les programmes.
Ces principes sont également développés par Yehonathan Sharvit dans son blog, où il définit cinq principes complémentaires :
- Séparation code-données : maintenir une distinction claire entre le code et les données ;
- Entité générique : modéliser les entités en utilisant des structures de données génériques ;
- Données immuables : imposer l’immuabilité des données pour garantir la cohérence et la stabilité ;
- Comparabilité basée sur la valeur : les données doivent être comparables en valeur ;
- Représentation littérale des données : les données doivent avoir une représentation littérale pour une clarté et une compréhension aisées.
Avantages cachés : tests et performances dans la programmation Java moderne
Les dernières versions de Java introduisent plusieurs outils précieux, notamment :
- Classes d’enregistrement : celles-ci servent de conteneurs transparents pour les données immuables. Leurs avantages incluent une meilleure compréhension par le compilateur des structures internes, un couplage plus étroit des API aux représentations internes et une réduction significative de la verbosité. Voici un exemple représentatif :
- Classes scellées : Ces types restreignent l’héritage, ne permettant que des sous-types spécifiques. Leurs avantages comprennent une communication claire des intentions du développeur, des vérifications d’exhaustivité activées par le compilateur et la facilitation des types de données algébriques (ADT). Un exemple démontre comment l’implémentation de la programmation orientée données (DOP) en utilisant ces outils produit des programmes plus concis, lisibles et fiables.
De plus, l’exploitation de ces fonctionnalités de Java offre deux avantages supplémentaires, bien que moins évidents : une meilleure testabilité et des performances accrues. Des entrées et sorties de données simplifiées et bien définies facilitent le processus de test, en particulier en facilitant les tests génératifs, qui se révèlent souvent plus efficaces pour détecter les bugs que la création manuelle de cas de test. En outre, les enregistrements Java surpassent les classes traditionnelles en termes d’utilisation de la mémoire et de performances, grâce à leur nature immuable, aux spécificités de l’implémentation de la JVM (Java Virtual Machine) et aux techniques d’optimisation telles que le compactage et l’extension inline employés par la JVM pour les classes marquées comme enregistrements.
Références :
1 – Data Oriented Programming in Java – InfoQ
2 – Data-Oriented Programming (nipafx.dev)
3 – Data Oriented Programming: Table of Contents | Yehonathan Sharvit (klipse.tech)
4 – Data-Oriented Programming in Java (youtube.com)
5 – Java Pattern: Algebraic Data Types · Garciat