You are on page 1of 36

Programacin modular

Estructuras de Datos I DLSIIS-FIM-UPM

modular p. 1/28 Programacion

Introduccin

modular p. 2/28 Programacion

Recordatorio del tema 1


Arquitectura del software (estructuracin y organizacin). Maximizar la cohesin dentro de un mdulo (sentido comn y

experiencia).
Minimizar el acoplamiento (sentido comn, experiencia y

soporte).
Ocultacin como soporte para minimizar el acoplamiento. Separacin entre parte pblica y parte privada (oculta). Necesidad de aadir documentacin a la parte pblica: qu Las especicaciones formales son una magnca opcin para

documentar los programas.


El criterio de estructuracin son los datos.

modular p. 3/28 Programacion

Mdulos
El mdulo es un mecanismo lingstico que permite:

1. Separar fsicamente los componentes software de un programa. 2. dividir cdigo en unidades compilables por separado. 3. Permite encapsulacin y ocultacin de datos y cdigo.
Los mdulos pueden encapsular:

constantes, variables (en general no recomendable), tipos y procedimientos (= TADs).


Los mdulos permiten separar claramente denicin (interfaz) de

la implementacin.

modular p. 4/28 Programacion

Separacin Interfaz - Implementacin


Medios:

Ocultar la denicin de los tipos. Ocultar la implementacin de sus operaciones. Ocultar las operaciones privadas.

modular p. 5/28 Programacion

Separacin Interfaz - Implementacin


Medios:

Ocultar la denicin de los tipos. Ocultar la implementacin de sus operaciones. Ocultar las operaciones privadas.
Ventajas:

Facilita la tarea del programador: abstraccin de los detalles. Permite controlar el acoplamiento y facilita la reusabilidad del cdigo. Permite el desarrollo independiente y paralelo de aplicaciones. Permite el desarrollo de versiones mejoradas de bibliotecas sin afectar al cdigo que las utiliza. Permite distribuir implementaciones empaquetadas.

modular p. 5/28 Programacion

Mecanismos de ocultacin
No todos los lenguajes dan las mismas facilidades (C vs. Ada). Qu hacen los programadores ante un lenguaje sin soporte

para la programacin modular?


Lo ms aceptable es que el lenguaje proporcione mecanismos

explcitos de ocultacin.
La ocultacin puede tener lugar a varios niveles:

Restriccin de acceso a nombres. Restriccin de acceso a funciones y estructuras de datos (aun conociendo su nombre y componentes). Imposibilidad de inspeccin visual del cdigo (ej., cdigo precompilado).

modular p. 6/28 Programacion

Contenidos de parte pblica y privada


Parte Pblica
Solicitud de otros mdulos

necesarios. Nombres de tipos (y quiz denicin de las estructuras de datos como en Ada).
Nombres de las

operaciones permitidas y sus tipos.


Semntica (funcionalidad)

de dichas operaciones.

modular p. 7/28 Programacion

Contenidos de parte pblica y privada


Parte Pblica
Solicitud de otros mdulos

Parte Privada
Solicitud de mdulos

necesarios. Nombres de tipos (y quiz denicin de las estructuras de datos como en Ada).
Nombres de las

necesarios en la implementacin.
Implementacin de las

estructuras de datos (si no est en la parte pblica).


Estructuras de datos privadas. Implementacin de las

operaciones permitidas y sus tipos.


Semntica (funcionalidad)

operaciones pblicas.
Declaracin e implementacin

de dichas operaciones.

de las operaciones privadas.

modular p. 7/28 Programacion

Mdulos en Ada 95

modular p. 8/28 Programacion

Mdulos (paquetes) en Ada 95


Mdulo de programa (como los utilizados hasta ahora).

modular p. 9/28 Programacion

Mdulos (paquetes) en Ada 95


Mdulo de programa (como los utilizados hasta ahora). Mdulo de biblioteca (convencin: dos cheros).

Interfaz (.ads): declaracin de tipos, constantes y operaciones que ofrece el mdulo (tb. la denicin de tipos en determinadas circunstancias). Implementacin (.adb): denicin (implementacin) de tipos y operaciones.
Nos centraremos en la escritura y uso de mdulos de biblioteca

para implementar TADs (tipos abstractos de datos).

modular p. 9/28 Programacion

Mdulos (paquetes) en Ada 95


Mdulo de programa (como los utilizados hasta ahora). Mdulo de biblioteca (convencin: dos cheros).

Interfaz (.ads): declaracin de tipos, constantes y operaciones que ofrece el mdulo (tb. la denicin de tipos en determinadas circunstancias). Implementacin (.adb): denicin (implementacin) de tipos y operaciones.
Nos centraremos en la escritura y uso de mdulos de biblioteca

para implementar TADs (tipos abstractos de datos).


Compilacin separada: los mdulos de biblioteca y de programa

admiten ser compilados independientemente.

modular p. 9/28 Programacion

Compilacin y linkado (simplif.)

puntos.adb

gnatgcc c

puntos.o

puntos.ads

gnatlink

test_puntos

gnatgcc c

test_puntos.o

test_puntos.adb

modular p. 10/28 Programacion

Fichero de interfaz
Deben aparecer declarados los tipos, procedimientos, etc,

exportados por el mdulo.


Debe tener todas las importaciones (clusulas with) necesarias

para declarar las operaciones y tipos que exporte el mdulo (ej., with Puntos; para implementar el mdulo Rectas).
Se pueden exportar variables (pero normalmente no usaremos

esta capacidad).
Tambin se pueden denir y exportar constantes Las declaraciones ms tiles sern las de tipos y operaciones. Se nombra con el nombre del mdulo seguido del sujo .ads El chero con el interfaz puede compilarse, lo que permite

compilar los clientes sin necesidad de tener la implementacin.

modular p. 11/28 Programacion

Ejemplo
package Puntos is type Punto is private; function Crear (Coordx, Coordy : Float) return Punto; function Valor_X (P : Punto) return Float; function Valor_Y (P : Punto) return Float; function Distancia (P1, P2 : Punto) return Float; function Es_Origen (P : Punto) return Boolean; private type Punto is record X, Y : Float; end record; end Puntos;

modular p. 12/28 Programacion

Fichero de implementacin
Ofrece la implementacin de los tipos y operaciones del mdulo. Completa la denicin de los tipos opacos (en caso de haberlos,

veremos ms adelante cmo se denen).


Se nombra con el nombre del mdulo seguido del sujo .adb

(modulo.ads y modulo.adb deben coincidir en nombre).


Todo lo declarado en el .ads es automticamente visible en el

.adb.
Lo importado (with) por el .ads es importado automticamente

por el .adb
Las constantes, tipos, variables y procedimientos que aparezcan

nicamente en el .adb no son ni visibles ni usables desde el exterior.

modular p. 13/28 Programacion

Ejemplo
with Ada.Numerics.Elementary_Functions; use Ada.Numerics.Elementary_Functions; package body Puntos is function Crear (Coordx, Coordy : Float) return Punto is P : Punto; begin P := (X => Coordx, Y => Coordy); return P; end Crear; function Valor_X (P : Punto) return Float is begin return P.X; end Valor_X; etc. end Puntos;

modular p. 14/28 Programacion

Ejemplos/Ada/Modulos
Puntos en el espacio de dos dimensiones (ver LEEME). Versin monoltica: test_puntos0.adb Versin modular, primer intento: puntos1.{ads,adb} +

test_puntos1.adb
Versin modular, segundo intento: puntos2.{ads,adb} +

test_puntos2.adb
Versin modular, tercer intento: puntos3.{ads,adb} +

test_puntos3.adb

modular p. 15/28 Programacion

Exportacin e importacin
Para usar las operaciones y componentes de un mdulo hay que

importarlo (+ instanciarlo si es genrico!).


La importacin permite el uso de un conjunto de identicadores

nada ms, es decir no se trae el cdigo.


Importacin calicada: with sin use Necesita anteponer el nombre del mdulo a cualquier elemento

heredado: Punto1 : Puntos.Punto; ... Puntos.Crear(1.0,0.3);


Importacin no calicada: with con use No precisa calicacin:

Punto1 : Punto; ... Crear (1.0,0.3);


modular p. 16/28 Programacion

Calicar o no
Qu importacin usar?

modular p. 17/28 Programacion

Calicar o no
Qu importacin usar? Como regla general:

Posiblemente no calicada para mdulos estndar del sistema (ej. Ada.Text_IO, Ada.Numerics.Elementary_Functions). Calicada para los mdulos de usuario.

modular p. 17/28 Programacion

Calicar o no
Qu importacin usar? Como regla general:

Posiblemente no calicada para mdulos estndar del sistema (ej. Ada.Text_IO, Ada.Numerics.Elementary_Functions). Calicada para los mdulos de usuario.
Ventajas:

Facilita distinguir rpidamente a qu mdulo pertenece cada operacin. Permite usar varios mdulos que tengan operaciones con el mismo nombre. (ej. Rectas.Crear() y Puntos.Crear()).

modular p. 17/28 Programacion

Calicar o no
Qu importacin usar? Como regla general:

Posiblemente no calicada para mdulos estndar del sistema (ej. Ada.Text_IO, Ada.Numerics.Elementary_Functions). Calicada para los mdulos de usuario.
Ventajas:

Facilita distinguir rpidamente a qu mdulo pertenece cada operacin. Permite usar varios mdulos que tengan operaciones con el mismo nombre. (ej. Rectas.Crear() y Puntos.Crear()).
De todas formas, en ada es posible que dos mdulos exporten

operaciones con el mismo nombre si trabajan con tipos diferentes: sobrecarga (overloading ).

modular p. 17/28 Programacion

Ocultacin de tipos en Ada 95


Tanto las operaciones como los tipos que aparacen en el chero

de interfaz son utilizables por los programas clientes.


En Ada 95 es posible declarar oculto alguno de estos tipos como

privados, utilizando el calicativo private.


Esto no evita el tener que denir el tipo en el chero de interfaz

(en una seccin private).


Una declaracin privada de un tipo permite a los clientes

exclusivamente: declarar variables de ese tipo, acceder al tipo mediante las operaciones del interfaz y utilizar los operadores de asignacin (:=) e igualdad (=) limited. Por tanto tenemos muy controlado el acoplamiento.

modular p. 18/28 Programacion

Ejercicios propuestos
Modicar la implementacin del TAD de los puntos pasando a

una representacin en coordenadas polares.


Implementar un paquete en Ada para representar rectas, detectar

operaciones que pueden considerarse esenciales (entre ellas estarn los constructores, las operaciones observadoras y una operacin que decida si un punto pertenece a una recta).

modular p. 19/28 Programacion

Genricos ADA

modular p. 20/28 Programacion

Conceptos y terminologa (I)


La reusabilidad es un aspecto esencial en la ingeniera del

software. Ada proporciona una herramienta muy potente para disear componentes reusables.
Ada permite escribir una solucin general (template) y luego

dejar que el compilador modique dicha solucin para cada problema particular.
El mecanismo que ofrece Ada se denomina unidades genricas

(o smplemente genricos).
La solucin especca creada por el compilador se denomina

instancia. Cualquiera de los libros sobre Ada (por ejemplo [Fel97, DLM96]) contiene una descripcin de los genricos en detalle.

modular p. 21/28 Programacion

Conceptos y terminologa (II)


Cada genrico de Ada tiene un conjunto de parmetros

formales genricos.
Dichos parmetros ofrecern la informacin que el compilador

necesita para producir la unidad especca para el problema.


El programador es el encargado de crear una nueva unidad

instanciando los parmetros formales genricos del genrico.


Veamos un ejemplo de instanciacin de genricos que podemos

encontrar en la librera estndar de Ada:


type Color is (Rojo, Verde, Azul); package Color_IO is new Text_IO.Enumeration_IO (Enum => Color);

A continuacin pueden usarse todas las operaciones de

Enumeration_IO a travs de Color_IO para leer e imprimir los colores (test_colores.adb).

modular p. 22/28 Programacion

Declaracin de genricos
El esquema sintctico para declarar (no implementar) una unidad

genrica es el siguiente:
generic Aqui aparecen las decls. de parametros genericos Los que son operaciones empiezan por with Aqui sigue la especicacion del paquete o declaracion de procedimiento/funcion

Se puede observar que los parmetros formales genricos

aparecen entre la palabra reservada generic y el comienzo de la especicacin del paquete o de la declaracin del procedimiento.
Posibles parmetros genricos:

Tipos: type identicador . . . Valores: X : tipo Procedimientos: with procedure identicador (. . . ) Funciones: with function identicador (. . . )
modular p. 23/28 Programacion

Ejemplo (dicultad baja)


Implementar las operaciones Intercambiar_Boolean e

Intercambiar_Natural que reciben dos datos in out e intercambian sus valores y un programa que pruebe dichas operaciones (test_intercambiar_nat_y_bool.adb).
Abstraer los esquemas anteriores mediante una operacin

genrica que denominaremos Intercambiar_Generico (intercambiar_generico.{ads,adb}).


Implementar un programa de prueba que instancie la operacin

genrica para obtener las anteriores (test_intercambiar_generico.adb).


No es posible utilizar el procedimiento genrico para intercambiar

tipos limited private.

modular p. 24/28 Programacion

Ejemplo (dicultad baja-media)


Implementar las operaciones Suma_10, Suma_25 y Resta_10

que suma 10, suma 25 y resta 10, respectivamente, al argumento de tipo entero.
Abstraer los esquemas anteriores mediante una operacin

genrica que denominaremos Suma_Constante (suma_constante.{ads,adb}).


Implementar un programa de prueba que instancie la operacin

genrica para obtener las anteriores (test_suma_constante.adb).

modular p. 25/28 Programacion

Ejemplo (dicultad media)


Implementar operaciones que calclan el mximo o el mnimo de

dos valores dados. Abstraer los esquemas anteriores mediante una operacin genrica que denominaremos Maximo_Generico (maximo_generico.{ads,adb}).
Implementar un programa de prueba que instancie la operacin

genrica para obtener las anteriores, en particular para denir las operaciones Maximo y Minimo sobre Float, Maximo sobre un tipo que representa cartas de la baraja francesa y Maximo en los booleanos con True > False (test_maximo_generico.adb).

modular p. 26/28 Programacion

Tipos como parmetros genricos


Declaracin de un tipo como parmetro formal genrico:

type identicador is (<>) type identicador is range <> type identicador is digits <> type identicador is private type identicador is limited private type identicador dec. de tipo array
Cada una de esas declaraciones impone restricciones a los

futuros parmetros en la instanciacin.


Cada una de esas declaraciones impone restricciones al uso del

los datos de dicho tipo dentro de la unidad genrica.

modular p. 27/28 Programacion

Signicado de las restricciones


(<>) enteros, caracteres y enumerados :=, >, >=, <, <=, =, /=, First , Last, Pos, Val, Pred, Succ enteros :=, +, -, *, etc., >, >=, <, <=, =, /=, First , Last, Pred, Succ oats :=, +, -, *, etc., >, >=, <, <=, =, /=, First , Last, Digits cualquier tipo excepto limited :=, =, /= cualquier tipo ninguna operacin

range <>

digits <>

private limited private

modular p. 28/28 Programacion

Referencias
[DLM96] Nell Dale, Susan C. Lilly, and John McCormick. Ada plus data structures. An object oriented approach. D. C. Health and Company, 1996. [Fel97] Michael B. Feldman. Software Construction and Data Structures with Ada 95. Addison Wesley, 1997.

28-1

You might also like