Université des Sciences et Technologies de Lille
Licence Miage - Programmation 1
Cours 4 : La déclaration de types privés et privés limités
Principe
Dans la conception d'un paquetage, on peut faire des choix
de structures de données, auxquels on ne veut pas
que l'utilisateur ait accès.
Deux possibilités :
-
le type n'est pas connu à l'extérieur du
paquetage : on le déclare alors dans le corps
du paquetage .adb. C'est ce qui a été fait
pour le type Combinaison dans le paquetage
Master_Mind.
- le type est connu à l'extérieur du paquetage,
car il est manipulé par des fonctions de la spécification
par exemple : on déclare le type dans la spécification du
paquetage .ads, mais dans la partie privée.
Exemple : le paquetage binaire
Package Paq_Binaires is
Max: Constant:=8;
type Binaire is private;
function Image(B:Binaire) return String;
procedure Put(B:in Binaire);
...
private
type Binaire is array(Positive range 1..Max) of Boolean;
end Paq_Binaires;
La structure interne du type Binaire est cachée, et ne peut
être utilisée au dehors du paquetage.
NB: Un type tableau non-contraint ne peut pas être privé, ni
privé limité, car on ne pourrait pas contraindre les objets à
la déclaration.
Comment marchent private et limited private ?
private : affectation et comparaison possibles + toutes les
primitives du paquetages.
limited private : pas d'affectation, ni de comparaison.
Avantage
L'utilisation du paquetage ne dépend pas
des choix d'implémentations pour les structures de données.
-
élégance,
-
les choix peuvent être remis en questions sans que les programmes
utilisant le paquetage aient à subir de modifications.
En contre-partie, lors de la conception du paquetage, il faut veiller
à fournir dans la spécification du paquetage suffisamment
de fonctionnalités primitives, pour que l'utilisateur
ne soit pas limité par l'interdiction d'accès au type.
Par exemple, on ne peut pas accèder à l'octet i d'un nombre
binaire: B(i) est prohibé. Le paquetage doit donc implanter
une fonction spécifique.
function Octet(B:Binaire;I:Positive range 0..max) return Natural is
begin
return Boolean'pos(B(i));
end Octet;
Les constantes
Les constantes d'un type privé
ou privé limité ne peuvent pas être définies dans la partie
publique de la spécification, puisque à ce niveau les détails
du type ne sont pas connus.
Package Paq_Binaire is
type Binaire is private;
Zero: constant Binaire :=(others=>0);
...
end Paq_Binaire;
n'est pas autorisé.
La définition doit se faire en deux temps :
la constante est annoncée dans la partie publique,
puis définie dans la partie privée.
type Binaire is private;
Zero: constant Binaire;
...
private
type Binaire is array(Positive range 1..Max) of Boolean;
Zero: constant Binaire := (others => false);