Cours 7: Paquetage.
Objectif: Unité de programme. Paquetage. Spécification de paquetage. Corps.
Exemples: nombres rationnels. Visibilité. Portée. Clause Use. Clause With.
En plus des sous-programmes (procédures et fonctions), Ada offre une autre
unité de programme: le paquetage.
Un paquetage se compose d'une spécification et d'un corps.
Extrait du manuel de référence (RM95):
package_declaration ::= package_specification;
package_specification ::=
package defining_program_unit_name is
{basic_declarative_item}
[private
{basic_declarative_item}]
end [[parent_unit_name.]identifier]
package_body ::=
package body defining_program_unit_name is
declarative_part
[begin
handled_sequence_of_statements]
end [[parent_unit_name.]identifier];
Un paquetage représente le plus souvent un type abstrait, c'est-à-dire un type et des opérations
sur les objets (constants ou variables) de ce type.
La spécification de paquetage regroupe la déclaration du type et les spécifications des
opérations.
Extrait du manuel de référence (RM95):
package Rational_Numbers is
type Rational is
record
Numerator : Integer;
Denominator : Positive;
end record;
function "="(X,Y : Rational) return Boolean;
function "/" (X,Y : Integer) return Rational; -- to construct a rational number
function "+" (X,Y : Rational) return Rational;
function "-" (X,Y : Rational) return Rational;
function "*" (X,Y : Rational) return Rational;
function "/" (X,Y : Rational) return Rational;
end Rational_Numbers;
package body Rational_Numbers is
procedure Same_Denominator (X,Y : in out Rational) is
begin
-- reduces X and Y to the same denominator:
...
end Same_Denominator;
function "="(X,Y : Rational) return Boolean is
U : Rational := X;
V : Rational := Y;
begin
Same_Denominator (U,V);
return U.Numerator = V.Numerator;
end "=";
function "/" (X,Y : Integer) return Rational is
begin
if Y > 0 then
return (Numerator => X, Denominator => Y);
else
return (Numerator => -X, Denominator => -Y);
end if;
end "/";
function "+" (X,Y : Rational) return Rational is ... end "+";
function "-" (X,Y : Rational) return Rational is ... end "-";
function "*" (X,Y : Rational) return Rational is ... end "*";
function "/" (X,Y : Rational) return Rational is ... end "/";
end Rational_Numbers;
Pour employer les ressources d'un paquetage P au sein d'une autre unité de programme U, on emploie la
clause With P.
Seules les entités déclarées dans la partie visible de la spécification de
P sont visibles dans U (dans l'exemple précédent, la procédure Same_Denominator
n'est pas visible).
La visibilité de la partie déclarative d'une spécification de paquetage est
indirecte (dans U, on désigne l'entité E déclarée dans P par P.E).
La visibilité de la partie déclarative d'une spécification de paquetage P peut être
rendue directe dans une unité U par une clause Use P.
Exemple:
With Ada.Text_IO.Integer_IO; Use Ada.Text_IO.Integer_IO;
With Rational_Numbers; Use Rational_Numbers;
Procedure Test_Rational_Numbers is
X,Y: Rational;
begin
X:= 1/2; --division des rationnels car X de type Rational
Y:= 1/3;
Z:= X + Y;
Put(Z.Numerator); --il serait mieux d'avoir Put(Rational)
Put(Z.Denominator);
end Test_Rational_Numbers;