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