Règles du forum

Le langage Ada uniquement, pas les compilateurs. Les questions de sémantique et de langage et les questions techniques liées à une application en particulier, son deux choses différentes. Si nécessaire, un forum sur GNAT et les autres compilateurs, tel JanusAda, sera ouvert.

Auteur Message
Administrateur
Avatar de l’utilisateur
Une astuce en forme d’idiome.

Posons par exemple :

Source Ada : 

package P is
type Instance_Type is private;
type Interpretation_1_Type is …;
type Interpretation_2_Type is …;
-- And so on.
end P;


S’il est choisi que la définition complète de Instance_Type doit être celle de par exemple Interpretation_1_Type, nous ne pourrons pas l’écrire comme

Source Ada : 

package P is

private
subtype Instance_Type is Interpretation_1_Type;
end P;


Cette écriture n’est pas légale en Ada, comme le confirme la référence :
full_type_declaration [Ada RM 2005 3.2.1(3)].

On pourrait penser à la définition d’un type dérivé :

Source Ada : 

package P is

private
type Instance_Type is new Interpretation_1_Type;
end P;


Mais cela nécessitera des conversions de type envahissantes et omniprésentes.

L’astuce consiste à définir Instance_Type comme un type Enregistrement constitué d’un unique membre du type voulu initialement comme base du sous‑type.

Source Ada : 

package P is

private
type Instance_Type is record
Interprepretation : Interpretation_1_Type;
end record;
end P;


On pourra également abréger le nom du membre, si ça peut rendre la chose plus commode :

Source Ada : 

package P is

private
type Instance_Type is record
I : Interpretation_1_Type;
end record;
end P;


Bonus : si le type de donnée change peu souvent mais voit ses différentes représentations souvent accédées, on pourra même définir un enregistrement de plusieurs ou toutes ses représentations. Ce qui s’apparente en fait à de la mémoization (un anglicisme, sans équivalent en français stricte). Mais attention alors à se soucier que ses différents membres portant les différentes représentations, soient toujours synchronisés (plus facile à garantir avec la vue privée d’un type).

Exemple :

Source Ada : 

package P is

private
type Instance_Type is record
I1 : Interpretation_1_Type;
I2 : Interpretation_2_Type;
-- And so on.
end record;
end P;
Profil
Administrateur
Avatar de l’utilisateur
Hibou a écrit : 
L’astuce consiste à définir Instance_Type comme un type Enregistrement constitué d’un unique membre du type voulu initialement comme base du sous‑type.

Et en bonus, ça peut même coller à une interprétation de la notion d’une catégorie de sous‑types. Quand on voit certains sous‑types comme des sous‑ensembles de ce qui compose un type de base, un type enregistrement peut en être une interprétation. Remarque : cette interprétation n’est pas applicable aux sous‑types dont le type de base est un type énuméré ou un type entier, car on ne peut pas représenter la restriction d’un intervalle par une sélection de membres ou de propriétés dans un type enregistrement. Ces sous‑types là s’interprèteraient plutôt comme des prédicats prédéfinis.
Profil