En Ada, los paquetes hijos (child packages) son una característica poderosa que permite la organización jerárquica de módulos. Los paquetes hijos permiten extender la funcionalidad de un paquete principal (parent package) sin modificar su código original. Esto es especialmente útil para mantener el código modular y organizado, facilitando la reutilización y el mantenimiento.

Conceptos Clave

  1. Paquete Principal (Parent Package): Es el paquete original del cual se derivan los paquetes hijos.
  2. Paquete Hijo (Child Package): Es un paquete que extiende la funcionalidad del paquete principal. Puede acceder a los elementos públicos del paquete principal.
  3. Visibilidad: Los paquetes hijos pueden ver los elementos públicos del paquete principal, pero no los privados.

Sintaxis Básica

La declaración de un paquete hijo sigue una estructura similar a la de un paquete normal, pero incluye el nombre del paquete principal como prefijo.

-- Declaración del paquete principal
package Principal is
    -- Declaraciones públicas
    procedure Public_Procedure;
private
    -- Declaraciones privadas
    procedure Private_Procedure;
end Principal;

-- Declaración del paquete hijo
package Principal.Hijo is
    -- Declaraciones públicas del paquete hijo
    procedure Child_Procedure;
end Principal.Hijo;

-- Implementación del paquete principal
package body Principal is
    procedure Public_Procedure is
    begin
        -- Implementación de la función pública
    end Public_Procedure;

    procedure Private_Procedure is
    begin
        -- Implementación de la función privada
    end Private_Procedure;
end Principal;

-- Implementación del paquete hijo
package body Principal.Hijo is
    procedure Child_Procedure is
    begin
        -- Implementación de la función del paquete hijo
        Public_Procedure; -- Llamada a la función pública del paquete principal
    end Child_Procedure;
end Principal.Hijo;

Ejemplo Práctico

Vamos a crear un ejemplo práctico para ilustrar cómo funcionan los paquetes hijos en Ada.

Paso 1: Crear el Paquete Principal

-- Archivo: principal.ads
package Principal is
    procedure Saludar;
private
    procedure Saludo_Privado;
end Principal;

-- Archivo: principal.adb
package body Principal is
    procedure Saludar is
    begin
        Ada.Text_IO.Put_Line("Hola desde el paquete principal!");
    end Saludar;

    procedure Saludo_Privado is
    begin
        Ada.Text_IO.Put_Line("Este es un saludo privado.");
    end Saludo_Privado;
end Principal;

Paso 2: Crear el Paquete Hijo

-- Archivo: principal.hijo.ads
package Principal.Hijo is
    procedure Saludar_Hijo;
end Principal.Hijo;

-- Archivo: principal.hijo.adb
package body Principal.Hijo is
    procedure Saludar_Hijo is
    begin
        Ada.Text_IO.Put_Line("Hola desde el paquete hijo!");
        Principal.Saludar; -- Llamada a la función del paquete principal
    end Saludar_Hijo;
end Principal.Hijo;

Paso 3: Programa Principal

-- Archivo: main.adb
with Principal;
with Principal.Hijo;
with Ada.Text_IO;

procedure Main is
begin
    Principal.Saludar;
    Principal.Hijo.Saludar_Hijo;
end Main;

Ejecución

Al compilar y ejecutar el programa principal (main.adb), la salida será:

Hola desde el paquete principal!
Hola desde el paquete hijo!
Hola desde el paquete principal!

Ejercicio Práctico

Ejercicio 1

Crea un paquete principal llamado Matematicas que contenga una función pública Suma y una función privada Multiplicacion. Luego, crea un paquete hijo llamado Matematicas.Avanzadas que contenga una función pública Potencia que utilice la función Suma del paquete principal.

Solución

-- Archivo: matematicas.ads
package Matematicas is
    function Suma(A, B : Integer) return Integer;
private
    function Multiplicacion(A, B : Integer) return Integer;
end Matematicas;

-- Archivo: matematicas.adb
package body Matematicas is
    function Suma(A, B : Integer) return Integer is
    begin
        return A + B;
    end Suma;

    function Multiplicacion(A, B : Integer) return Integer is
    begin
        return A * B;
    end Multiplicacion;
end Matematicas;

-- Archivo: matematicas.avanzadas.ads
package Matematicas.Avanzadas is
    function Potencia(Base, Exponente : Integer) return Integer;
end Matematicas.Avanzadas;

-- Archivo: matematicas.avanzadas.adb
package body Matematicas.Avanzadas is
    function Potencia(Base, Exponente : Integer) return Integer is
        Resultado : Integer := 1;
    begin
        for I in 1 .. Exponente loop
            Resultado := Matematicas.Suma(Resultado, Base - 1);
        end loop;
        return Resultado;
    end Potencia;
end Matematicas.Avanzadas;

-- Archivo: main.adb
with Matematicas;
with Matematicas.Avanzadas;
with Ada.Text_IO;

procedure Main is
begin
    Ada.Text_IO.Put_Line(Integer'Image(Matematicas.Suma(3, 4)));
    Ada.Text_IO.Put_Line(Integer'Image(Matematicas.Avanzadas.Potencia(2, 3)));
end Main;

Retroalimentación

  • Error Común: Intentar acceder a elementos privados del paquete principal desde el paquete hijo. Recuerda que solo los elementos públicos son accesibles.
  • Consejo: Utiliza paquetes hijos para extender la funcionalidad de manera organizada y modular, manteniendo el código limpio y fácil de mantener.

Conclusión

Los paquetes hijos en Ada son una herramienta poderosa para la organización y modularización del código. Permiten extender la funcionalidad de un paquete principal sin modificar su código original, lo que facilita la reutilización y el mantenimiento del software. En esta lección, hemos aprendido cómo declarar e implementar paquetes hijos, y hemos visto un ejemplo práctico para ilustrar su uso. Con esta base, estás preparado para explorar más sobre la programación modular en Ada y aplicar estos conceptos en tus proyectos.

© Copyright 2024. Todos los derechos reservados