Está en la página 1de 22

Cap. 8. Modularidad.

Cap. 8. Modularidad.

Indice del cap tulo Cap tulo 8. Modularidad.


Lenguajes de Programacin o Cap tulo 8. Modularidad. 1. Introduccin o 2. Modularidad en Ada 3. Modularidad en C/C++ Carlos Urea Almagro n 4. Modularidad en Java
Dpt. Lenguajes y Sistemas Informticos a ETSI Informtica y de Telecomunicacin a o Universidad de Granada

Curso 2009-10

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 1/1. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 2/1. n o a

Cap. 8. Modularidad. Introduccin o

Cap. 8. Modularidad. Introduccin o

Indice de la seccin o
Seccin 1 o Introduccin o 1.1. 1.2. 1.3. 1.4. Compilacin separada o Ocultamiento de informacin o Restricciones de acceso Tipos abstractos de datos

Programas grandes Imaginemos un programa grande que puede estar compuesto bsicamente de: a declaraciones de tipos declaraciones de variables globales declaraciones de subprogramas A cada uno de estos lo llamaremos elementos del programa

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 3/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 4/86. n o a

Cap. 8. Modularidad. Introduccin o

Cap. 8. Modularidad. Introduccin o

En principio, cualquier modicacin en un elemento puede afectar o a cualquier otro de ellos, ya que puede haber dependencias arbitrarias entre ellos (a esto se le llama cohesin) o El programa es dif de escribir y leer cil El programa es muy dicil de modicar o mantener El programa es poco able.

El objetivo anterior se puede conseguir diviendo un programa en partes, cada una de ellas siendo un grupo de elementos, de forma que: Cada elemento de un grupo esta fuertemente relaccionado con otros elementos de dicho grupo Las dependencias entre elementos de grupos distintos son las menores posibles, y en cualquier caso estn bien a documentadas. Cada parte puede ser reutilizable en ms de un programa a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 5/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 6/86. n o a

Cap. 8. Modularidad. Introduccin o

Cap. 8. Modularidad. Introduccin o

La tcnica anterior se llama modularidad, y es esencial para la e construccin de programas grandes. o El particionamiento adecuado es una tarea de diseo que n puede ser llevada a la prctica usando casi cualquier lenguaje a de programacin o La mayor de los lenguajes contemplan mecanismos que, bien a ayudan a realizar el particionamiento, o bien soportan explicitamente la modularidad. A cada una de las partes de un programa se le llamar, en general, a mdulo. o

En este cap tulo veremos varios de dichos mecanismos: namespaces de C++ y C# packages de Ada packages de Java Adems, veremos los mecanismos para la compilacin separada, a o ocultamiento de informacin y restricciones de acceso, mecanismos o relacionados en distinto grado con los anteriores, y que sirven al mismo propsito. o

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 7/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 8/86. n o a

Cap. 8. Modularidad. Introduccin o Compilacin separada o

Cap. 8. Modularidad. Introduccin o Compilacin separada o

La compilacin separada es la posibilidad de escribir un programa o en ms de un archivo fuente, de forma que cada uno de estos a archivos puedan ser traducidos (compilado) independientemente en distintas ejecuciones del traductor. Cada uno de los archivos fuente se denomina una unidad de compilacin o Cada mdulo de un programa se debe situar en una o varias o unidades de compilacin. o

El mecanismo de compilacin separada: o Hace ms eciente en tiempo y memoria la traduccin, ya que a o despus de un cambio solo tiene que hacerse para las unidades e de compilacin afetectadas, en lugar de para todo el programa o fuente. Se permite el trabajo simultneo de varios programadores en a distintas partes de un programa En la mayor de los lenguajes, los mecanismos de modularidad y a compilacin separada estn relaccionados. Una excepcin a esto es o a o C/C++.

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 9/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 10/86. n o a

Cap. 8. Modularidad. Introduccin o Ocultamiento de informacin o

Cap. 8. Modularidad. Introduccin o Ocultamiento de informacin o

Una forma de prevenir que se establezcan dependencias innecesarias entre partes de programas es usar mecanismos que permitan o ayuden al programador de un mdulo impedir el o establecimiento de dichas dependencias desde otros mdulos. o El ocultamiento de informacin (information hidding) es la o capacidad de algunos lenguajes de impedir que desde un mdulo A o se use una declaracin incluidas en otro mdulo B. Esto se hace o o limitando el mbito de dicha declaraciones (se dice que la a declaracin no es visible desde A). o

Ventajas El ocultamiento de informacin ayuda a reducir la o dependencias entre mdulos, ya que, si se sabe que una o declaracin no es visible en otros mdulos, podemos asumir o o que cualquier cambio que hagamos en la misma no afectar a a esos otros mdulos, sino unicamente a aquel mdulo donde o o aparece. Este mecanismo permite al diseador de un mdulo n o seleccionar que declaraciones del mismo sern visibles desde a otros mdulos, por tanto, se hace expl o cito en el programa las dependencias que se pueden establecer

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 11/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 12/86. n o a

Cap. 8. Modularidad. Introduccin o Ocultamiento de informacin o

Cap. 8. Modularidad. Introduccin o Restricciones de acceso

Implementacin en distintos lenguajes o Los lenguajes Ada y Java tienen mecanismos expl citos de ocultamiento de informacin, asociados a los mecanismos de o modularidad (packages) En el lenguaje C/C++, el ocultamiento de informacin solo se o puede lograr mediante el uso de compilacin separada. o

En algunos casos, es conveniente que una declaracin de un tipo o incluida en un mdulo sea visible desde otros, de forma que se o puedan declarar variables de ese tipo, pero sin que se pueda acceder a la representacin asociada al tipo. Esto permite: o usar las variables del tipo sin tener que preocuparse de la representacin, lo cual mejora la legibilidad y la abilidad. o modicar la representacin del tipo sin modicar los o programas que usan variables de dicho tipo, con lo cual el mantenimiento se hace ms fcil. a a Se dice que estos tipos son tipos privados del mdulo. o

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 13/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 14/86. n o a

Cap. 8. Modularidad. Introduccin o Tipos abstractos de datos

Cap. 8. Modularidad. Introduccin o Tipos abstractos de datos

Las restricciones de acceso permiten la implementacin de tipos o abstractos de datos, que son tipos de datos (conjuntos) sobre los que existen un conjunto de funciones cumpliendo determinadas propiedades. Estas propiedades denen al tipo (no el conjunto de valores) Los tipos abstractos de datos se implementan mediante tipos o clases denidas por el programador que pueden ser usadas de forma independiente de su representacin a travs de un conjunto o e de subprogramas.

Ejemplo Sea A un conjunto cualquiera, tal que existe otro conjunto no vac B, una serie de funciones (a las que llamamos o vacia, inserta, extrae, tope), y un elemento nueva A tales que p A y x B, se cumple que: vacia A { f alse , true } vacia(nueva) = true push A B A vacia(push(p, x)) = f alse extrae A {vacia} A extrae(push(p, x)) = p tope A {vacia} B tope(push(p, x)) = x

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 15/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 16/86. n o a

Cap. 8. Modularidad. Introduccin o Tipos abstractos de datos

Cap. 8. Modularidad. Introduccin o Tipos abstractos de datos

Si A y B son dos conjuntos dotados de las funciones descritas anteriormente, entonces los elementos de A son las pilas LIFO con elementos de tipo B. Esto se puede armar independientemente de que representacin se use para A, es decir, nos podemos o abstraer de la representacin. o Un TADs se puede implementar en cualquier lenguaje mediante un tipo denido por el usuario. El cdigo que usa el tipo no necesita o depender de la representacin del tipo, aunque odr hacerlo. o a Las restricciones de acceso y el ocultamiento de informacin o permiten garantizar que el cdigo que usa el tipo va a ser siempre o independiente de la representacin, ya que no va a acceder nunca a o la misma.

Mecanismos para restricciones de acceso en varios lenguajes En C no existen mecanismos espec cos En C++, existen mecanismos ligados al mecanismo de clase En Ada, existen mecanismos asociados a los package En Java, existen mecanismos asociados al mecanismo de clase y a los packages

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 17/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 18/86. n o a

Cap. 8. Modularidad. Modularidad en Ada

Cap. 8. Modularidad. Modularidad en Ada

Indice de la seccin o
Seccin 2 o Modularidad en Ada 2.1. 2.2. 2.3. 2.4. Los packages de Ada Packages y compilacin separada o Restricciones de acceso en Ada Implementacin de TADs en Ada o

El principal mecanismo para modularidad, compilacin separada y o ocultamiento de informacin en el lenguaje Ada es el package. o En esta seccin veremos como se denen y usan los packages de o Ada.

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 19/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 20/86. n o a

Cap. 8. Modularidad. Modularidad en Ada Los packages de Ada

Cap. 8. Modularidad. Modularidad en Ada Los packages de Ada

Un package en Ada es un conjunto de declaraciones a las que se da un nombre, de forma que dichas declaraciones se pueden reusar en varios puntos de un programa. Los packages de Ada son la herramienta adecuada para la implementacin de la modularidad, pues permiten agrupar o declaraciones, y formar programas uniendo varios packages.

Declaraciones de packages en Ada


Una declaracin de package es un tipo de declaracin, con la o o siguiente forma: package identicador is declaraciones end [ identicador ] ; Cuando se elabora, se produce una asociacin entre el nombre o y el conjunto de declaraciones, y se elaboran las declaraciones, Cada declaracin interna al package tiene como mbito el o a interior del package ms el mbito de la declaracin de a a o package (en este segundo caso hay que anteponer el nombre del package como prejo).

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 21/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 22/86. n o a

Cap. 8. Modularidad. Modularidad en Ada Los packages de Ada

Cap. 8. Modularidad. Modularidad en Ada Los packages de Ada

Ejemplo de declaracin y uso de un package Ada: o

1 2 3 4 5 6 7 8 9 10 11 12

La clusula use en Ada a

1 2 3 4 5 6 7 8 9 10 11

procedure Proc01 i s package E j e m p l o i s p i : constant F l o a t := 3 . 1 4 1 5 9 2 7 ; x : F l o a t := p i ; type Mi Array i s a r r a y ( 1 . . 1 0 ) o f F l o a t ; end ; y : F l o a t := 2 . 0 ; a : E j e m p l o . Mi Array := ( 1 . . 1 0 => 5 . 0 ) ; begin a ( 3 ) := y + E j e m p l o . x ; E j e m p l o . x := E j e m p l o . p i ; end ;
Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 23/86. n o a

12 13

procedure Proc02 i s package E j e m p l o i s p i : constant F l o a t := 3 . 1 4 1 5 9 2 7 ; x : F l o a t := p i ; type Mi Arra y i s a r r a y ( 1 . . 1 0 ) o f F l o a t ; end ; y : F l o a t := 2 . 0 ; use E j e m p l o ; a : M iArray := ( 1 . . 1 0 => 5 . 0 ) ; begin a ( 3 ) := y + x ; x := p i ; end ;
Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 24/86. n o a

Cap. 8. Modularidad. Modularidad en Ada Los packages de Ada

Cap. 8. Modularidad. Modularidad en Ada Los packages de Ada

Colisiones de nombres en packages Ada


La aparicin en un punto del programa de un mismo identicador o de dos packages distintos es errnea si no se antepone el nombre o del package, ya que ocurre una ambigedad que el compilador no u puede resolver. procedure Proc03 i s package P1 i s x : F l o a t ; end ; package P2 i s x : I n t e g e r ; end ; use P1 ; use P2 ; begin x := 0 ; e r r o r P1 . x := 3 . 0 ; b i e n P2 . x := 5 ; b i e n end ;
Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 25/86. n o a

Cabecera y cuerpo de los packages


En la forma vista, un package no puede incluir una declaracin de o un subprograma: procedure Proc04 i s package E j e m p l o i s procedure Nada i s E r r o r begin null ; end ; end ; begin null ; end ;

1 2 3 4 5 6 7 8 9 10

1 2 3 4 5 6 7 8 9 10

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 26/86. n o a

Cap. 8. Modularidad. Modularidad en Ada Los packages de Ada

Cap. 8. Modularidad. Modularidad en Ada Los packages de Ada

Cabecera y cuerpo de los packages. Sintaxis.


Para lograr lo anterior hay que dividir el package en dos partes, con la siguiente sintaxis: package identicador is declaraciones-1 end [ identicador ] ; ...... package body identicador is declaraciones-2 end [ identicador ] ;

Cabecera y cuerpo de los packages. Ambitos.


La primera parte es llamada la cabecera del package, La segunda parte se llama cuerpo del package El mbito de declaraciones-1 es el mismo que el mbito de la a a declaracin del package, e incluye al cuerpo o El mbito de declaraciones-2 es el solo el cuerpo del package a (las declaraciones solo son visibles en el cuerpo).

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 27/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 28/86. n o a

Cap. 8. Modularidad. Modularidad en Ada Los packages de Ada

Cap. 8. Modularidad. Modularidad en Ada Packages y compilacin separada o

Declaraciones incompletas en las cabeceras


En la cabecera puede aparecer una declaracin incompleta de un o subprograma, y entonces, en el cuerpo, debe aparecer la declaracin completa: o
1 2 3 4 5 6 7 8 9 10 11

Adems de la forma vista antes (que es poco util), un package Ada a puede constituir por si mismo una unidad de compilacin. En este o caso se puede hacer ocultamiento de informacin. Es la forma ms o a frecuente de declarar los packages.

procedure Proc04 i s package E j e m p l o i s procedure Nada ; end ; package body E j e m p l o i s procedure Nada i s begin n u l l ; end ; end ; begin null ; end ;
Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 29/86. n o a

El package se incluye en archivos fuente distintos de los archivos que incluyen al programa que usa el package. En este caso, a la cabecera se le llama parte visible y al cuerpo, parte oculta

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 30/86. n o a

Cap. 8. Modularidad. Modularidad en Ada Packages y compilacin separada o

Cap. 8. Modularidad. Modularidad en Ada Packages y compilacin separada o

Ambitos y unidades de compilacin o


Las declaraciones de la parte visible tienen como mbito la a parte oculta ms otras unidades de compilacin que declaren a o que usan el package (mediante la clusula with) a La parte visible debe ser leida por el compilador cuando traduzca otras unidades de compilacin que usen el package o No es necesario leer la parte oculta, y por tanto no es necesario proporcionarla para usar el package (permite el ocultamiento de informacin). o

Estructura de una unidad de compilacin o


Archivo id package.ads : package id-package is declaraciones-parte-visible end [ id-package ] ; Archivo id package.adb : package body id-package is declaraciones-parte-oculta end [ id-package ] ;

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 31/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 32/86. n o a

Cap. 8. Modularidad. Modularidad en Ada Packages y compilacin separada o

Cap. 8. Modularidad. Modularidad en Ada Packages y compilacin separada o

Uso de un package desde subprogramas


Desde otras unidad de compilacin podemos usar un package con o la palabra clave with incluida en la llamada clusula de contexto a (a) Desde unidades de compilacin formadas por un subprograma: o with id-package ; [ use id-package ; ] ... procedure Ejemplo is ... begin ..... id-package.id .... end Ejemplo;
Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 33/86. n o a

Uso de un package desde otros packages


Desde otras unidad de compilacin podemos usar un package con o la palabra clave with incluida en la llamada clusula de contexto a (b) Desde la parte visible u oculta de otro package with id-package ; [ use id-package ; ] ... package [body ] Ejemplo is ... end Ejemplo;

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 34/86. n o a

Cap. 8. Modularidad. Modularidad en Ada Packages y compilacin separada o

Cap. 8. Modularidad. Modularidad en Ada Packages y compilacin separada o

Ejemplo de uso de un package

1 2 3 4 5 6

Uso de un package desde la cabecera de otro

1 2

Aqu usamos el package Text IO desde el subprograma Proc06 , with T e x t I O ; procedure Proc06 i s begin T e x t I O . P u t L i n e ( Hola Mundo ! ) ; end ;

Archivo pack01.ads package pack01 i s type E n t e r o i s new I n t e g e r ; end ;

Archivo pack02.adb with pack01 ; package pack02 i s i : pack01 . E n t e r o ; procedure E j e m p l o ( p : pack01 . E n t e r o ) ; end ;

1 2 3 4 5

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 35/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 36/86. n o a

Cap. 8. Modularidad. Modularidad en Ada Packages y compilacin separada o

Cap. 8. Modularidad. Modularidad en Ada Restricciones de acceso en Ada

Ejemplo de uso de un package desde el cuerpo de otro

1 2 3 4 5 6 7 8

Restricciones de acceso en Ada

Archivo pack02.adb with T e x t I O ; package body pack02 i s procedure E j e m p l o ( p : pack01 . E n t e r o ) i s begin i := p ; Text IO . Put Line ( hola ! ) ; end ; end ;

La cabecera de un package puede contener una seccin privada, o que puede contener declaraciones de tipos accesibles exclusivamente desde el cuerpo del package: package id-package is declaraciones-pblicas u private declaraciones-privadas end [ id-package ] ; A la parte anterior a private se le llama seccin pblica o u

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 37/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 38/86. n o a

Cap. 8. Modularidad. Modularidad en Ada Restricciones de acceso en Ada

Cap. 8. Modularidad. Modularidad en Ada Restricciones de acceso en Ada

Ejemplo de restricciones de acceso

1 2 3 4 5

Tipos privados en packages Ada

Archivo pack03.ads package pack03 i s type E n t e r o P u b l i c o i s new I n t e g e r ; private type E n t e r o P r i v a d o i s new I n t e g e r ; end ;

La forma anterior no es muy util, ya que se podr haber denido a EnteroPrivado en la parte oculta (el cuerpo del package). La utilidad de la seccin privada proviene de la posibilidad de uso de o declaraciones de tipos privados: package id-package is type id-tipo is private ; ... private type id-tipo is descriptor-tipo ; end [ id-package ] ; Se pueden declarar variables del tipo privado y copiarlas, pero no se puede acceder a la representacin del tipo. o
Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 40/86. n o a

Archivo proc07.adb with pack03 ; procedure Proc07 i s i : pack03 . E n t e r o P u b l i c o ; b i e n j : pack03 . E n t e r o P r i v a d o ; e r r o r begin n u l l ; end ;
Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 39/86. n o a

1 2 3 4 5

Cap. 8. Modularidad. Modularidad en Ada Restricciones de acceso en Ada

Cap. 8. Modularidad. Modularidad en Ada Restricciones de acceso en Ada

Ejemplo de tipo privado en un package


Un ejemplo de un tipo privado es el tipo Rep en el siguiente package:

1 2 3 4 5 6 7

Uso de tipos privados


El anterior package puede ser usado para declarar variables de tipo T, pero no para acceder a su estructura: with Pack04 ; procedure Proc08 i s r , s : Pack04 . T ; b i e n i : Integer ; begin r := s ; b i e n i := r . x ; e r r o r end ;
Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 42/86. n o a


1 2 3 4 5 6 7 8

Archivo pack04.ads package pack04 i s type T i s p r i v a t e ; private type T i s r e c o r d x : Integer ; end r e c o r d ; end ;

9 10 11

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 41/86. n o a

Cap. 8. Modularidad. Modularidad en Ada Restricciones de acceso en Ada

Cap. 8. Modularidad. Modularidad en Ada Restricciones de acceso en Ada

Uso de variables de tipos privados


El uso de variables de tipos privados solo se puede hacer mediante subprogramas declarados en la seccin pblica: o u

Acceso a tipos privados en la parte oculta



1 2 3 4 5 6 7 8 9 10

La implementacin de los subprogramas aparece en la parte oculta: o

1 2 3 4 5 6 7 8 9

package Pack05 i s type T i s p r i v a t e ; procedure A s i g n a r ( r : o u t T ; v : I n t e g e r ) ; function Leer ( r : T ) return Integer ; private type T i s r e c o r d x : Integer ; end r e c o r d ; end ;

package body Pack05 i s procedure A s i g n a r ( r : o u t T ; v : I n t e g e r ) i s begin r . x := v ; end ; function Leer ( r : T ) return Integer i s begin return r . x ; end ; end ;

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 43/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 44/86. n o a

Cap. 8. Modularidad. Modularidad en Ada Restricciones de acceso en Ada

Cap. 8. Modularidad. Modularidad en Ada Restricciones de acceso en Ada

Ejemplo de uso de tipos privados


Ahora podemos declarar variables tipo T y acceder a las mismas via los subprogramas anteriores: with Pack05 ; procedure Proc09 i s r , s : Pack05 . T ; i : Integer ; begin Pack05 . A s i g n a r ( r , 3 ) ; i := Pack05 . L e e r ( r ) ; Pack05 . A s i g n a r ( s , i ) ; end ;
Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 45/86. n o a

Tipos limited private en packages


En algunos casos, es conveniente no permitir asignaciones de variables del tipo privado (por ejemplo, una cabecera de una lista). Lo anterior se puede conseguir declarando el tipo privado como limited private en lugar de solo private, es decir, con una clausula de la forma: type id-tipo is limited private ;

1 2 3 4 5 6 7 8 9 10 11 12

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 46/86. n o a

Cap. 8. Modularidad. Modularidad en Ada Implementacin de TADs en Ada o

Cap. 8. Modularidad. Modularidad en Ada Implementacin de TADs en Ada o

Los TADs se pueden implementar mediante tipos privados en Ada. Hay dos opciones: como tipos-valor, con la representacin en la seccin privada o o como tipos-referencia, con la representacin en la parte oculta o

1 2 3 4 5 6 7 8 9 10 11 12 13 14

Ejemplo: TAD pila lifo de enteros (tipo-referencia) package P i l a s E n t e r o s i s type P i l a E n t i s p r i v a t e ; function procedure procedure function function Nueva r e t u r n P i l a E n t Push ( p : P i l a E n t ; Pop ( p : P i l a E n t ) Tope ( p : P i l a E n t ) Vacia ( p : PilaEnt )

; v : Integer ) ; ; return Integer ; r e t u r n Boolean ;

private type R e p r P i l a E n t ; type P i l a E n t i s a c c e s s R e p r P i l a E n t ; end ;


Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 48/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 47/86. n o a

Cap. 8. Modularidad. Modularidad en Ada Implementacin de TADs en Ada o

Cap. 8. Modularidad. Modularidad en Ada

1 2

Implementacin de TADs en Ada o

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

package body P i l a s E n t e r o s i s type Nodo ; type R e p r P i l a E n t i s a c c e s s Nodo ; type Nodo i s r e c o r d v : Integer ; sig : ReprPilaEnt ; end r e c o r d ; f u n c t i o n Nueva r e t u r n P i l a E n t i s begin r e t u r n new R e p r P i l a E n t ( n u l l ) ; end ;

.... procedure Push ( p : P i l a E n t ; v : I n t e g e r ) i s begin p . a l l := new Nodo ( v , p . a l l ) ; end ; p r o c e d u r e Pop ( p : P i l a E n t ) i s begin p . a l l := p . a l l . s i g ; end ;

3 4 5 6 7 8 9 10 11 12 13

....

.....
Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 49/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 50/86. n o a

Cap. 8. Modularidad. Modularidad en Ada Implementacin de TADs en Ada o

Cap. 8. Modularidad. Modularidad en C/C++

1 2 3 4 5 6 7 8 9 10 11 12 13

... f u n c t i o n Tope ( p : P i l a E n t ) r e t u r n I n t e g e r i s begin return p . a l l . v ; end ; f u n c t i o n V a c i a ( p : P i l a E n t ) r e t u r n Boolean i s begin return p . a l l = null ; end ;

Indice de la seccin o
Seccin 3 o Modularidad en C/C++ 3.1. Compilacin separada o 3.2. Implementacin de TADs en C o 3.3. Namespaces en C++

end P i l a s E n t e r o s ;

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 51/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 52/86. n o a

Cap. 8. Modularidad. Modularidad en C/C++

Cap. 8. Modularidad. Modularidad en C/C++ Compilacin separada o

En esta seccin veremos los mecanismos de compilacin separada y o o ocultamiento de informacin en C/C++, as como namespaces de o C++

En C/C++, una unidad de compilacin es una archivo con o una serie de declaraciones. Las declaraciones son declaraciones de tipos, valores (constantes), subprogramas (y clases). las declaraciones son en principio invisibles desde otras unidades de compilacin, con lo cual se implementa el o ocultamiento de informacin o

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 53/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 54/86. n o a

Cap. 8. Modularidad. Modularidad en C/C++ Compilacin separada o

Cap. 8. Modularidad. Modularidad en C/C++ Compilacin separada o

En los lenguajes C y C++ No existen mecanismos expl citos para denir modulos No es posible indicar expl citamente que declaraciones de una unidad de compilacin son visibles desde otras unidades o No es posible indicar explicitamente en una unidad de compilacin que otras unidades de compilacin o o o declaraciones de las mismas se usan.

Sin embago en C y C++ es posible usar declaraciones de una unidad en otras: Para que una declaracin de una unidad de compilacin A sea o o usable en (visible desde) otra unidad de compilacin B, es o necesario duplicar en B el texto de dicha declaracin (solo la o cabecera en el caso de subprogramas o declaraciones incompletas de tipo). El ocultamiento de informacin se implementa dando a o conocer unicamente las declaraciones de B que su programador desee publicar, y no proporcionando el texto de dicha unidad B

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 55/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 56/86. n o a

Cap. 8. Modularidad. Modularidad en C/C++ Compilacin separada o

Cap. 8. Modularidad. Modularidad en C/C++ Compilacin separada o

1 2 3

archivo A.c typedef i n t Entero ; const i n t dos = 2 ; v o i d d o b l a ( E n t e r o j ) { j = d os ; }

Los traductores o compiladores de C/C++ suelen usarse conjuntamente con otro programa llamado preprocesador El preprocesador es una herramienta que ayuda a realizar esos duplicados de forma automtica, mediante el uso de directivas a include en el cdigo fuente. o Estas directivas son independientes del lenguaje en si, sirven simplemente para sustituir sus apariciones en el texto de un programa por una secuencia de carcteres obtenida de un a archivo.

archivo B.c typedef i n t Entero ; void dobla ( Entero j ) ; i n t main ( ) { Entero k = 3 ; d o b l a (&k ) ; return 0 ; }
Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 57/86. n o a

1 2 3 4 5 6 7 8

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 58/86. n o a

Cap. 8. Modularidad. Modularidad en C/C++ Compilacin separada o

Cap. 8. Modularidad. Modularidad en C/C++ Compilacin separada o

El esquema anterior es causa de frecuentes errores en programas medianos y grandes con muchas unidades de compilacin ya que: o El preprocesador es transparente para el compilador o traductor, de forma que este ultima programa procesa las distintas apariciones de las declaraciones en distintas unidades de compilacin de forma completamente independiente. o El compilador no tiene informacin expl o cita alguna de la relacin de uso entre unidades de compilacin o mdulos. o o o

La directiva #include permite repetir en un programa un conjunto de declaraciones. Cada unidad de compilacin suele situarse en dos o archivos fuente: uno de extensin .c, que contiene todas las declaraciones o completas (visibles y ocultas) del mdulo o otro (para el cual se usa, por convencin, la extensin .h) con o o aquellas declaraciones del archivo .c que son pblicas. A este u archivo se le llama archivo de cabecera. Es el que se proporciona a los usuarios del mdulo. o

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 59/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 60/86. n o a

Cap. 8. Modularidad. Modularidad en C/C++ Compilacin separada o

Cap. 8. Modularidad. Modularidad en C/C++ Compilacin separada o

Ejemplo de una unidad de compilacin con declaraciones pblicas y o u ocultas: Archivo cmod01.h typedef int Entero ; void dobla( Entero * j ) ; Archivo cmod01.c #include "cmod01.h" const int dos = 2 ; void dobla( Entero * j ) { *j *= dos ; }

Ejemplo de uso de las declaraciones pblicas de cmod01 u #include "cmod01.h" int main() { Entero k = 3 ; dobla(&k) ; return 0 ; }

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 61/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 62/86. n o a

Cap. 8. Modularidad. Modularidad en C/C++ Implementacin de TADs en C o

Cap. 8. Modularidad. Modularidad en C/C++ Implementacin de TADs en C o

Una TAD puede ser implementado en C usando una unidad de compilacin que conforma un mdulo. o o Las declaraciones pblicas del mdulo se incluirn en un u o a archivo de cabecera .h, y las ocultas en un .c (es conveniente dar el mismo nombre base al archivo .c y al .h, este nombre es el nombre del mdulo) o Al igual que en Ada, se puede lograr que los mdulos que o usen el TAD sean completamente independientes de la representacin usada, dejando dicha representacin en la parte o o oculta.

La implementacin del TAD pila LIFO de enteros en C puede o hacerse como sigue: Archivo PilasEnteros.h typedef struct ReprPilaEnt * PilaEnt ; PilaEnt void void int int Nueva() ; Push ( PilaEnt Pop ( PilaEnt Tope ( PilaEnt Vacia( PilaEnt

p, int v ) ; p ) ; p ) ; p ) ;

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 63/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 64/86. n o a

Cap. 8. Modularidad. Modularidad en C/C++ Implementacin de TADs en C o

Cap. 8. Modularidad. Modularidad en C/C++ Implementacin de TADs en C o

Archivo PilasEnteros.c #include <stdlib.h> #include "PilasEnteros.h" struct ReprPilaEnt { struct Nodo * cabe ; } ; struct Nodo { int v ; struct Nodo * sig ; } ; ...
Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 65/86. n o a

... PilaEnt Nueva() { PilaEnt p = (PilaEnt) malloc(sizeof(struct ReprPilaEnt)) ; p->cabe = NULL ; return p ; } void Push( PilaEnt p, int v ) { struct Nodo * n = (struct Nodo *) malloc(sizeof(struct Nodo)) ; n->v = v ; n->sig = p->cabe ; p->cabe = n ; } ....
Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 66/86. n o a

Cap. 8. Modularidad. Modularidad en C/C++ Implementacin de TADs en C o

Cap. 8. Modularidad. Modularidad en C/C++ Implementacin de TADs en C o

.... void Pop( PilaEnt p ) { struct Nodo * n = p->cabe ; p->cabe = n->sig ; free(n) ; } int Tope ( PilaEnt p ) { return p->cabe->v ; } int Vacia( PilaEnt p ) { return p->cabe == NULL ; Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 67/86. n o a }

Una ejemplo de unidad de compilacin que use el modulo de pilas o podr ser este: a #include <stdio.h> #include "PilasEnteros.h" int main() { PilaEnt p = Nueva() int i ;

Push(p,5); i = Tope(p); Pop(p) ; if (Vacia(p)) printf("p esta vaca\n"); }


Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 68/86. n o a

Cap. 8. Modularidad. Modularidad en C/C++ Namespaces en C++

Cap. 8. Modularidad. Modularidad en C/C++ Namespaces en C++

Uno de los principales problemas que se plantean en C para la construccin de programas grandes, dotados de muchos mdulos, o o son las colisiones de nombres. Ocurre cuando dos modulos o unidades de comilacin distintas o producen distintas asociaciones para un mismo identicador Cuando se hace un #include del segundo de ellos, se produce un error o un efecto indeterminado, con lo cual es imposible que un tercer mdulo use estos dos mdulos simultneamente o o a Lo anterior reduce notablemente la reusabilidad de los mdulos. o

Una solucin consiste en anteponer un prejo comn a cada o u identicador declarado en un mdulo. Soluciona el problema o en muchos casos, pero no siempre, y adems, hace los a programas menos legibles (los identicadores tienden a ser muy largos) En una revisin de C++ se introdujo el mecanismo de la o namespaces para solucionar este problema.

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 69/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 70/86. n o a

Cap. 8. Modularidad. Modularidad en C/C++ Namespaces en C++

Cap. 8. Modularidad. Modularidad en C/C++ Namespaces en C++

Al igual que los packages de Ada, un namespace en C++ es un conjunto de declaraciones a las que se les asocia un identicador (su nombre). Un namespace se introduce con una declaracin o como la siguiente: namespace id-namespace { declaraciones } Donde id-namespace es el nombre del namesapce y declaraciones es el conjunto de declaraciones asociadas.

Los namespaces en C++ se pueden introducir en varias declaraciones separadas, es decir, es vlido escribir: a namespace id-namespace { declaraciones-1 } .... namespace id-namespace { declaraciones-2 }

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 71/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 72/86. n o a

Cap. 8. Modularidad. Modularidad en C/C++ Namespaces en C++

Cap. 8. Modularidad. Modularidad en C/C++ Namespaces en C++

la primera declaracin introduce el namespace y le asocia el o con de declaraciones declaraciones-1 la segunda declaracin aade declaraciones-2 al namespace. o n lo anterior implica que en distintos entornos un mismo namespace puede tener asociado distintos conjuntos de declaraciones

Ejemplo de namespace: namespace Ejemplo { const double pi = 3.1415927 ; double x = pi ; typedef double MiArray[10] ; } ; double y = 2.0 ; Ejemplo::MiArray a = {5,5,5,5,5, 5,5,5,5,5 } ; int main() { a[3] = y + Ejemplo::x ; Ejemplo::x = Ejemplo::pi ; return 0 ; }

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 73/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 74/86. n o a

Cap. 8. Modularidad. Modularidad en C/C++ Namespaces en C++

Cap. 8. Modularidad. Modularidad en Java

La clausula using permite acortar la notacin: o namespace Ejemplo { const double pi = 3.1415927 ; double x = pi ; typedef double MiArray[10] ; } ; double y = 2.0 ; Ejemplo::MiArray a = {5,5,5,5,5, 5,5,5,5,5 } ; int main() { a[3] = y + Ejemplo::x ; using namespace Ejemplo ; x = pi ; return 0 ; }
Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 75/86. n o a

Indice de la seccin o
Seccin 4 o Modularidad en Java 4.1. Compilacin separada en Java o 4.2. Packages y restricciones de acceso de Java

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 76/86. n o a

Cap. 8. Modularidad. Modularidad en Java

Cap. 8. Modularidad. Modularidad en Java Compilacin separada en Java o

En los lenguajes orientados a objetos, como Java, el concepto esencial es el de clase, y los programas consisten bsicamente en a conjuntos de declaraciones de clases. En la mayor de los a lenguajes OO, existen, sin embargo, mecanismos para agrupar las clases relaccionadas en conjuntos de clases, asimilables a los mdulos de los lenguajes no OO. o En Java, cabe destacar, en esta l nea, las siguientes posibilidades: Compilacin separada o Packages y restricciones de acceso

En Java, una unidad de compilacin es un archivo de o extensin .java que contiene una o varias declaraciones de o clases y/o interfaces. Cada unidad de compilacin puede ser o traducida independientemente de otras. La traduccin de un .java produce un archivo con cdigo o o intermedio (de extensin .class) por cada clase contenida en o el archivo .java original.

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 77/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 78/86. n o a

Cap. 8. Modularidad. Modularidad en Java Compilacin separada en Java o

Cap. 8. Modularidad. Modularidad en Java Packages y restricciones de acceso de Java

Los archivos .class son interpretables con el interprete de cdigo intermedio de Java. o Las declaraciones de una unidad de compilacin son visibles o desde otras unidades de compilacin, siempre y cuando al o traducir esas otras unidades se tenga acceso los archivos .class obtenidos de traducir la primera.

En Java, las declaraciones de clases e interfaces se pueden agrupar en packages. El mecanismo de los packages de Java es similar a los namespaces de C++ (evita colisiones de nombres), excepto que aade la posibilidad de restriciones de acceso. n Las declaraciones de una unidad de compilacin se aaden a un o n package si al inicio del texto aparece una clausula de la forma: package id-package ;

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 79/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 80/86. n o a

Cap. 8. Modularidad. Modularidad en Java Packages y restricciones de acceso de Java

Cap. 8. Modularidad. Modularidad en Java Packages y restricciones de acceso de Java

En Java: Al igual que ocurre en C++ con los namespaces, un package puede estar denido en ms de una unidad de compilacin a o Las declaraciones de un package son por defecto ocultas, es decir, su mbito es exclusivamente el package que las declara. a En un package, las declaraciones de clases etiquetadas como public son acesibles desde otras unidades de compilacin. o Estas clases deben ser declaradas en un archivo que solo las contenga a ellas.

A modo de ejemplo, veamos un package Java (P1) Archivo P1/Privadas.java package P1 ; class Privada1 { public void escribe() { System.out.println("clase privada 1") ; } } class Privada2 { public void escribe() { System.out.println("clase privada 2") ; } }

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 81/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 82/86. n o a

Cap. 8. Modularidad. Modularidad en Java Packages y restricciones de acceso de Java

Cap. 8. Modularidad. Modularidad en Java Packages y restricciones de acceso de Java

Archivo P1/Publica.java package P1 ; public class Publica { public void escribe() { Privada1 p1 = new Privada1() ; Privada2 p2 = new Privada2() ; System.out.println("clase pblica:") ; u p1.escribe() ; p2.escribe() ; } }

El package anterior podr usarse desde una unidad de compilacin a o como esta: class Main { public static void main( String[] args ) { P1.Publica p = new P1.Publica() ; p.escribe() ; } }

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 83/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 84/86. n o a

Cap. 8. Modularidad. Modularidad en Java Packages y restricciones de acceso de Java

Cap. 8. Modularidad. Modularidad en Java Packages y restricciones de acceso de Java

La clausula import permite acortar la notacin: o n del cap tulo. import P1.* ; class Main2 { public static void main( String[] args ) { Publica p = new Publica() ; p.escribe() ; } }

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 85/86. n o a

Autor: Carlos Urea. Fecha creacin: January 14, 2010. Pgina: 86/86. n o a

También podría gustarte