Les enregistrements managés ou managed RECORD en Pascal

Delphi 10.4 Sydney, C++Builder 10.4 Sydney, RAD Studio 10.4 Sydney are coming soon ! Get Excited !Ayant été autorisé par Embarcadero à parler de certaines fonctionnalités de Delphi 10.4 avant sa sortie officielle, je vais en profiter un peu.

Les informations que je vous communique ici sont actuellement liées à Denali (la version beta de la 10.4). Il est possible que certaines choses aient évolué dans la version finale ou soient repoussées à une version ultérieure.

Si vous voulez en voir plus sur ce qui est prévu, vous pouvez vous reporter à cet article de Sarina DuPont. Vous pouvez aussi vous inscrire pour suivre la présentation en ligne organisée par Embarcadero le mercredi 27 mai de 18 à 19 heures (heure de Paris).

Historique de cette fonctionnalité

Les managed RECORD étaient prévus pour la version 10.3 de Delphi et c'est pour cette raison que vous pourrez tomber sur des articles les concernant datant de fin 2018.

Embarcadero avait finalement décidé de différer la sortie de cette fonctionnalité suite aux remontées effectuées lors du beta test de Sugarloaf. Il s'est avéré que les choix technologiques effectués avaient des effets de bords gênants dans des projets existants. Par soucis de conserver la meilleure compatibilité ascendante possible entre les versions du langage Embarcadero a donc revu sa copie sur le sujet et nous propose une nouvelle version efficace.

Le type RECORD

Petit rappel pour les non initiés : le type RECORD est l'équivalent des structures dans les langages issus du C. Il permet de regrouper des champs de différents types comme pour un objet, mais contrairement aux classes que le développeur doit instancier c'est le compilateur qui alloue et désalloue les zones mémoires nécessaires à leur fonctionnement.

Au fil des évolutions du langage Pascal implémenté par Delphi, les RECORD ont vu leur fonctionnement grandement évoluer. On peut y mettre des procédures et des fonctions, des méthodes de classes, gérer des zones de porté variable.

En bref ils fonctionnent comme les classes à deux exceptions près : pas de constructeur / destructeur automatisés et pas besoin de se préoccuper de l'espace mémoire occupé. On pouvait déclarer un constructor et un destructor, mais c'était à nous de les appeler.

En fait, ça, c'était avant Delphi 10.4 Sydney et l'avénement des enregistrements managés.

Managed RECORD

En Object Pascal il est possible de faire de la surcharge d'opérateurs sur les classes. C'est aussi le cas pour les types RECORD.

On peut par exemple définir ce que le compilateur fera lorsqu'on additionne ou soustrait deux variables de type RECORD. Ce sont deux exemples très simples parmi la longue liste d'opérateurs surchargeables.

Avec Delphi 10.4 Sydney apparaissent deux nouvelles opérations : initialisation et finalisation.

On avait l'habitude de voir ces mots clés au niveau des unités (enfin, l'habitude quand on s'en sert puisque c'est quand même pas si courant). Désormais ils servent aussi lorsque le compilateur alloue la zone mémoire liée à un RECORD et la désalloue.

Marco Cantù en parle dans cet article de blog.

Le code lié à la surcharge de l'opérateur Initialize est déclenchée lors de déclaration d'une variable avec un type RECORD.
Le code lié à la surcharge de l'opérateur Finalize est déclenché lors de la suppression de la variable en mémoire (lorsqu'on quitte sa portée).

Sur des variables locales à des procédures, fonctions et méthodes ça permettra d'exécuter l'initialisation au niveau du begin du bloc de code et la finalisation au niveau de son end.

Chose importante à avoir en tête : les variables sont désallouées même lorsque des exceptions sont déclenchées, l'opérateur Finalize est bien appelé en sortie de procédure, fonction ou méthode même si cela s'effectue suite à une erreur.

A quoi ça sert ?

Le cas de base est tout simplement de pouvoir donner des valeurs par défaut aux différents champs de l'enregistrement, le charger automatiquement depuis un fichier ou instancier les éventuels objets devant être stockés dedans. On peut cependant s'en servir pour plein d'autres choses.

Dalija Prasnikar propose un usage des managed records pour gérer un type à valeur nulle (nullable type). Elle explique comment sur son blog.

Rudy Velthuis (qui nous a quitté l'an dernier) proposait une implémentation de smart pointer avec un type générique en 2017. Il est désormais possible d'utiliser un RECORD managé pour simplifier ce code. J'ai vu passer un article dessus mais n'ai pas retrouvé le lien, je le diffuserai dès que je remets la main dessus.

Ce ne sont que quelques exemples de ce qu'on pourra faire avec cette évolution du langage Pascal implémenté dans Delphi. D'autres usages et d'autres choses impactant les types RECORD arrivent dans la 10.4. Consultez la documentation ou assistez aux différentes présentations et formations qui seront mises en place pour en avoir tous les détails.


Mug Toucan DX dans la baie de RioMug carte postale Sydney