Programación en Ada/Paquetes
Los paquetes exportan mediante una interfaz bien definida tipos, objetos y operaciones y permiten ocultar su implementación, lo que proporciona al programador tipos abstractos de datos y subprogramas de manera transparente.
Los paquetes de Ada proporcionan:
- Abstracción de datos.
- Encapsulamiento.
- Compilación separada y dependiente.
Especificación y cuerpo
editarEl paquete consta de especificación (parte visible) y cuerpo (implementación que se oculta) y pueden compilarse por separado.
La sintaxis de su especificación es la siguiente:
especificación_paquete ::=package
[ identificador_unidad_padre . ] identificadoris
{ declaración_básica } [private
{ declaración_básica } ]end
[ [ identificador_unidad_padre . ] identificador ] ;
La sintaxis del cuerpo de un paquete es la siguiente:
cuerpo_paquete ::=package
body
[ identificador_unidad_padre . ] identificadoris
[ parte_declarativa ] [begin
secuencia_de_sentencias [exception
manejador_de_excepción { manejador_de_excepción } ] ]end
[ [ identificador_unidad_padre . ] identificador ] ;
Un paquete permite agrupar declaraciones y subprogramas relacionados.
Ejemplos
editarPor ejemplo, para implementar una pila de enteros:
package
Pila_Enterosis
-- Especificación.procedure
Poner (Elem: Integer); -- Interfaz.function
Quitarreturn
Integer; -- Interfaz.end
Pila_Enteros;
package
body
Pila_Enterosis
-- Cuerpo. Max :constant
:= 100; -- Se ocultan las variables locales. Pila:array
(1..Max)of
Integer; -- Se ocultan las variables locales. Cima: Integerrange
0..Max; -- Se ocultan las variables locales.procedure
Poner (Elem: Integer)is
-- Implementación.begin
Cima := Cima + 1; Pila (Cima) := Elem;end
Poner;function
Quitarreturn
Integeris
-- Implementación.begin
Cima := Cima - 1;return
Pila(Cima + 1);end
Quitar;begin
Cima := 0; -- Inicialización.end
Pila_Enteros;
En este caso, se tiene una interfaz que proporciona acceso a dos subprogramas para manejar la pila, aunque también se podrían haber exportado tanto tipos como objetos, constantes, tareas e incluso otros paquetes. Por ejemplo:
package
Sobre_Diasis
type
TDiais
(LUN, MAR, MIE, JUE, VIE, SAB, DOM);subtype
TDiaLaborableis
TDiarange
LUN..VIE; SiguenteDia:constant
array
(TDia)of
TDia := (MAR, MIE, JUE, VIE, SAB, DOM, LUN);end
Sobre_Días;
En este caso, el paquete no necesitaría cuerpo. Todos los elementos definidos en el paquete son accesibles, por lo que podríamos utilizar Sobre_Dias.TDia
, Sobre_Dias.SAB
, Sobre_Dias.JUE
o Sobre_Dias.TDiaLaborable
.
Dependencia entre especificación y cuerpo
editarLa especificación del paquete y el cuerpo pueden compilarse por separado. Mediante este encapsulamiento, ahora no es posible desde fuera modificar, por ejemplo, el valor de la cima de la pila, pues este objeto no es visible. Así se evita un mal empleo de la pila por alguien que pueda no conocer su implementación.
Si la especificación de un paquete contiene la especificación de un subprograma, entonces, el cuerpo del paquete debe contener el correspondiente cuerpo del subprograma. Sin embargo, pueden existir subprogramas dentro del cuerpo del paquete que no se declaren en su especificación, serían, por tanto, internos.
Destacar que dentro del cuerpo del paquete se inicializa el valor de la cima de la pila (después de begin). Esto sucede cuando se elabora el paquete. Si no necesita ninguna sentencia, se puede omitir el begin.
Declaración y visibilidad
editarLos paquetes se pueden declarar en cualquier parte declarativa, es decir, en un bloque, subprograma o dentro de otro paquete. En el caso del ejemplo, para utilizar la pila de números enteros, se podría hacer así:
declare
N: Integer;package
Pila_Enterosis
-- ...end
Pila_Enteros;begin
Pila_Enteros.Poner (15); N := Pila_Enteros.Quitar;end
;
Dentro del paquete se puede llamar a Poner o a Pila_Enteros.Poner, pero fuera del paquete únicamente se puede llamar a dicho procedimiento de la forma Pila_Enteros.Poner. Además, las variables Max, Pila y Cima no son visibles.
Importación de paquetes
editarPara la utilización de los paquetes desde otras unidades de compilación, se definen estas dos cláusulas: