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
- Paquete Principal (Parent Package): Es el paquete original del cual se derivan los paquetes hijos.
- Paquete Hijo (Child Package): Es un paquete que extiende la funcionalidad del paquete principal. Puede acceder a los elementos públicos del paquete principal.
- 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á:
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.
Curso de Programación en Ada
Módulo 1: Introducción a Ada
Módulo 2: Conceptos Básicos
- Variables y Tipos de Datos
- Operadores y Expresiones
- Estructuras de Control
- Bucles en Ada
- Subprogramas: Procedimientos y Funciones
Módulo 3: Tipos de Datos Avanzados
Módulo 4: Programación Modular
Módulo 5: Concurrencia y Programación en Tiempo Real
Módulo 6: Temas Avanzados
Módulo 7: Mejores Prácticas y Optimización
- Estilo de Código y Mejores Prácticas
- Depuración y Pruebas
- Optimización del Rendimiento
- Consideraciones de Seguridad
