Guía mínima de Ada 95

Estructura general de un programa en Ada.

    Formalmente un programa en Ada se estructura en unidades distribuidas en uno o varios ficheros. Las unidades pueden ser:

Paquetes.

    Los paquetes son la clase de unidad más importante. En general un programa en Ada se compone de un conjunto de paquetes y un procedimiento principal. La claúsula de contexto "with" sirve para declarar que se van a usar los servicios de un paquete.

    Un paquete se divide generalmente en dos partes: especificación  e implementación (body). Ambas partes se sitúan casi siempre en ficheros diferentes, con las extensiones "*.ads" y "*.adb", respectivamente.

    La estructura de la especificación de un package es la siguiente:

    package nombre_de_la_unidad is
        --declaraciones
    private
        --declaraciones privadas
    end nombre_de_la_unidad;

    Las declaraciones que aparecen antes de la palabra "private" constituyen la parte visible, o interfaz, del paquete. Las que aparecen después son privadas; no obstante, la parte privada es opcional, y si no aparece la palabra "private" se entiende que el paquete no tiene parte privada.

    Las declaraciones pueden ser desde declaraciones de tipos hasta prototipos de procedimientos o funciones. Un prototipo de un procedimiento o función es su cabecera, pero cambiando la palabra "is" por un punto y coma (";"), lo que indica que el subprograma se desarrollará más tarde (en la implementación del paquete).

    La declaración de un paquete requiere una implementación si hay declaraciones que requieran completarse (por ejemplo, el prototipo de una función requiere su desarrollo). La estructura de un "package body" es:

    package body nombre_de_la_unidad is
        --desarrollo del package
    end nombre_de_la_unidad;

    Todas las declaraciones hechas en la especificación del paquete se pueden usar en la implementación (body), aunque estén en la parte "private". Las declaraciones hechas en el "package body" sólo se pueden usar en el mismo.

Tipos "private" y "limited private".

    Si se declara un tipo en la especificación de un paquete, cualquiera que utilice el paquete podrá acceder a los elementos internos de la implementación del mismo. Esto hace que la aplicación se vuelva dependiente de la forma en que se ha implementado el nuevo tipo. Para evitar esta dependencia --y poder cambiar la implementación si es necesario-- se declara el tipo como "private" en la parte pública del paquete y se pone su definición en la parte privada. Al declarar un tipo como "private" su definición queda oculta, y el usuario del paquete sólo podrá utilizar con él las operaciones que se hallan declarado en la parte pública del paquete, además de la asignación (:=), la comparación de igualdad (=) y la de desigualdad (/=).

    package Manejo_De_Claves is
        type Clave is private;
        Clavenula : constant Clave;
        procedure Tomar_Clave(C : out Clave);
        function "<"(X, Y : in Clave) return Boolean;
    private
        Max : constant := 2 ** 16 - 1;
        type Clave is range 0 .. Max;
        Clavenula : constant Clave := 0;
    end Manejo_De_Claves;

Huelga decir que el paquete Manejo_De_Claves necesita un "package body" para completar su definición.

    package body Manejo_De_Claves is
      procedure Tomar_Clave(C : out Clave) is
      begin
          -- Cuerpo del procedimiento
      end Tomar_Clave;

      function "<"(X, Y : in Clave) return Boolean is
      begin
          -- Cuerpo del operador
      end "<";
          end Manejo_De_Claves;
 

    Si además se quiere deshabilitar las operaciones de asignación y comparación de igualdad/desigualdad, habrá que declarar el tipo como "limited private".
 



[Anterior][Inicio][Siguiente]