Romeo Alvarez Arana Jorge A. Davila Montoya Fernando Hernández Guzmán Encapsulamiento Romeo Alvarez Arana Jorge A. Davila Montoya Fernando Hernández Guzmán
Tipos abstractos de datos. Introducción: La abstracción es un proceso mental que tiene dos aspectos complementarios: El aspecto de destacar los detalles relevantes del objeto en estudio. El aspecto de ignorar los detalles irrelevantes del objeto.
Los llamados lenguajes de alto nivel Las lenguajes ensambladores La historia de la programación está repleta de ejemplos del uso de la abstracción como mecanismo para disminuir la complejidad: Los llamados lenguajes de alto nivel Las lenguajes ensambladores La de procedimiento con parámetros, Las construcciones creadas para sincronizar procesos.
Podemos decir que la historia de la programación es, en realidad, un camino hacia un grado creciente de abstracción
La abstracción funcional Los primeros lenguajes de alto nivel (Fortran, Cobol), ya tenían este mecanismo. Sin embargo no es posible especificar sus tipos de datos,
El siguiente paso fue la creación de tipos definidos por el programador,
Imaginemos que el programador desea definir un tipo fecha para manipular valores cuyo significado sean fechas del calendario. Una forma de hacerlo en Pascal es la siguiente: type fecha = record día: 1..31; mes: 1..12; año: 1900..2000 end
El programador puede definir variables del nuevo tipo mediante declaraciones de la forma: var fl,f2: fecha; e incluso definir procedimientos que operen sobre, o consulten propiedades de los valores del tipo: function fiesta (f: fecha): boolean; Sin embargo, no puede impedir que se generen valores que no tienen semántica, teniendo en cuenta la intención del programador: f1.dia := 30; f1.mes := 2;. .. o que se realicen operaciones sin sentido sobre los valores del tipo: f1.dia := 5 * f2.mes
La situación equivalente respecto a los tipos predefinidos sería permitir que los programadores directamente los bits de un carácter o de un número real (de hecho, los primeros lenguajes de alto nivel proporcionaban esta "facilidad").
Con el advenimiento de Algol, y luego de Pascal, poco a poco se introdujo la verificación de tipos en los argumentos de cada rutina, como una herramienta para reducir el tiempo de desarrollo de un programa. Sin embargo, todavía no se reconocían las grandes ventajas de especificar procedimientos. El usuario del procedimiento sólo necesita conocer la especificación de la abstracción (el qué) y puede ignorar el resto de los detalles (el cómo).
Por eso decimos que que la abstracción produce un ocultamiento de información.
El concepto de tipo abstracto de datos, propuesto hacia 1974 por John Guttag y otros investigadores, es la siguiente: · Definición Tipo abstracto de datos Es una colección de valores y de operaciones que se definen mediante una especificación que es independiente de cualquier representación.
Características: ABSTRACCIÓN. ENCAPSULAMIENTO
ENCAPSULAMIENTO La encapsulación sirve para separar la interfaz de una abstracción y su implementación. Es un concepto complementario al de abstracción. La encapsulación da lugar a que las clases se dividan en dos partes: Especificacion Implementación
Para que sirve? Ocultamos los detalles, de forma que no se conoce como se implementa. Esta propiedad de los objetos se vive en el mundo real en muchas situaciones con las cajas negras. Tal es el caso de la labor de conducir un automóvil: no es necesario que el conductor sepa de mecánica automotriz, sólo tiene que saber cómo interactuar con el vehículo.
Protege los datos del uso arbitrario y no pretendido. Ventajas: Evita la corrupción de los datos de un objeto. Se permite modificar los elementos internos del objeto sin afectar a los usuarios del objeto. Protege los datos del uso arbitrario y no pretendido.
Para implementar un TDA un lenguaje debe proveer: Una forma de definir los tipos de datos Una forma de definir operaciones abstractas para estos objetos Encapsular los datos, es decir que solo puedan ser manipulados por operaciones abstractas.
Posibilidad de verificar formalmente los programas usuarios del tipo. Otros motivos que hacen conveniente la especificación formal de un tipo abstracto son los siguientes: Unanimidad de interpretación por parte de los distintos usuarios del tipo. Posibilidad de verificar formalmente los programas usuarios del tipo. Deducción, a partir de la especificación, de propiedades satisfechas por cualquier implementación válida de tipo
Encapsulación por Subprogramas
Características de los Subprogramas Permite crear abstracción de proceso: – encapsulando código – definiendo una interfaz de invocación para paso de parámetros y resultados Permite reutilizar código, ahorrando memoria y tiempo de codificación.
Elementos en la definición de interfaces Nombre: permite referenciar al subprograma como unidad e invocarlo. Parámetros (Opcional): Define la comunicación de datos (nombre, orden y tipo de parámetros formales) Valor de retorno: Opcional para funciones (tipificado).
Firmas y protocolos de la Interfaz La firma (signature) es un contrato entre el invocador y el subprograma que define la semántica de la interfaz. El protocolo especifica cómo debe realizarse la comunicación de parámetros y resultados (tipo y orden de los parámetros y, opcionalmente, valor de retorno).
Encapsulación por Subprogramas Diseño del Programa. Diseño del lenguaje.
Diseño del Programa
Subprogramas como operaciones abstractas Especificación. Implementación.
Especificación de un Subprograma Nombre del subprograma. Prototipo del subprograma. Acción realizada por el subprograma.
Subprogramas como funciones Especificación de una Función en C: float FN(float X, int Y) Representación: FN : real x integer real
Subprogramas como funciones Especificación de una Función en Pascal: function FN(X: real;Y: integer): real Representación: FN : real x integer real
Subprogramas como funciones Especificación de una función en Ada: function Arcsin(X : Real) return Real Representación: Arcsin : real real
Subprogramas como subrutinas Especificación de una subrutina en C: void Sub(float X, int Y, float *Z, int *W)
Subprogramas como subrutinas Especificación de una subrutina en Ada: procedure Sub(X: in REAL; Y: in integer; Z: in out REAL; W: out BOOLEAN) Representación: Sub: real1 x integer x real2 real3 x Boolean
Implementación de Subprogramas Un subprograma representa una operación del nivel de computadora virtual construido por el programador. Es implementado haciendo uso de las operaciones y estructuras de datos que posee el lenguaje.
Implementación de Subprogramas Las declaraciones e instrucciones se encuentran encapsuladas. El usuario podrá invocar el subprograma solo con un determinado número de argumentos.
Implementación de Subprogramas Forma típica de la implementación: Especificación del subprograma. Declaración de tipos de datos locales. Secuencia de instrucciones que definen las acciones que realiza el subprograma.
Cuerpo de Subprogramas Implementación de un subprograma en C: float FN(float X, int Y) { float M(10); int N; . }
Cuerpo de Subprogramas Implementación de un subprograma en Ada: function Strip_Leading_Blank (Str : String) return String is begin -- Strip_Leading_Blank if Str (Str'First) = ' ' then return Str (1+Str'First .. Str'Last); else return Str; end if; end Strip_Leading_Blank;
Cuerpo de Subprogramas Implementación de un subprograma en LISP: (defun recur (x) (when (> x 0) (recur (1- x)))) => RECUR Uso de un subprograma en LISP: (recur 8) => (7)
Cuerpo de Subprogramas Especificación de una función en LISP: defun function-name lambda-list [[declaration* | documentation]] form* => function-name
Diseño del Lenguaje
Definición e invocación de Subprogramas Definición y activación de subprogramas. Implementación de la definición e invocación de subprogramas. Subprogramas genéricos.
Definición y activación de Subprogramas Definición de un programa como propiedad estática. La activación como medio para el uso del subprograma.
Definición de un Subprograma Almacenamiento de un programa en forma escrita. Es la única información que se tiene de un porgrama cuando es traducido.
Activación de un Subprograma Representa un bloque de almacenamiento cuando el subprograma se ejecuta. Su tiempo de vida transcurre entre la llamada al subprograma en el que la activación es creada y el regreso de resultados, instante en el que la activación es destruida.
Componentes de la definición La especificación. Declaración de variables. Almacenamiento de literales y variables constantes. Instrucciones o cuerpo del subprograma.
Definición de Subprogramas Definición de un subprograma en C: float FN (float X, int Y) { const initval=2; #define finalval 10 float M(10); int N; N=initval; if (N < finalval) . } return (20 * X + M(N));
Segmento de código y Registro de Activación
Estructura en ejecución
Subprogramas genéricos Subprograma genérico en FORTRAN 90: INTERFACE ENTER SUBROUTINE ENTER_STUDENTS(STUDENT, SECT) INTEGER :: STUDENT SECTION :: SECT END SUBROUTINE ENTER_STUDENTS SUBROUTINE ENTER_SECTION(S, TAB) SECTION :: S CLASSLIST :: TAB END SUBROUTINE ENTER_SECTION END INTERFACE ENTER
Subprogramas genéricos Subprograma genérico en Ada: procedure Enter (Student: in integer; Sect: in out Section) is begin serie de funciones que permiten inscribir a un alumno a una clase. end Enter; procedure Enter(S: in Section; Tab: in out Classlist) is serie de instrucciones que permiten ingresar una sección en la lista de clases.
Compilación de Subprogramas Compilación Separada: unidades de programas pueden compilarse en diferentes tiempos, pero se consideran dependencias. Compilación Independiente: Se compilan unidades de programa sin información de otras.
Definición de Tipos
Definición de Tipos Mecanismo para la definición de una clase de un objeto dato, en los lenguajes es llamado definición de tipo Una definición de tipo no define completamente un tipo de dato abstracto
Definición de Tipos end Nombre de tipo, junto con una declaración que describe la estructura de una clase del objeto dato type Racional = record Numerador : integer; Denominador : integer end var A, B, C : Racional;
Definición de Tipos Struct Tiporacional {int numerador; int denominador;} struct Tiporacional A,B,C;
Definición de Tipos Typedef struct Tiporacional {int numerador; int denominador;} Racional; Racional A,B,C;
Definición de Tipos La modificación de la estructura del objeto dato se realiza solo en la definición del tipo Al pasar el objeto dato como argumento a un subprograma, solo se necesita su nombre
Nueva forma de encapsulamiento y ocultamiento de información Definición de Tipos Nueva forma de encapsulamiento y ocultamiento de información La estructura interna del objeto dato es independiente de la declaración de variables
Nueva forma de encapsulamiento y ocultamiento de información Definición de Tipos Nueva forma de encapsulamiento y ocultamiento de información La definición puede ser modificada sin alterar los subprogramas en donde es llamado Estructura encapsulada, solo subprogramas definidos accesan a los componentes internos
Definición de Tipos Implementación El traductor pone la información de la definición de tipo en una tabla, y en donde el nombre del tipo es referenciado, utiliza la información de la tabla para producir el código ejecutable
Equivalencia de Tipos La verificación de tipos involucra una comparación entre el tipo de dato del argumento dado y el tipo de dato del argumento esperado por la operación
Equivalencia de Tipos ¿Qué significa que dos tipos sean el mismo? ¿Qué significa que dos objetos dato del mismo tipo son iguales?
Equivalencia de Tipos program main(input,output); type Vect1: array [1..10] of real; Vect2: array [1..10] of real; Var X,Z: Vect1; Y: Vect2; procedure Sub(A:Vect1); . end; begin X:=Y; Sub(Y) end.
Equivalencia de Tipos Equivalencia de nombres Dos tipos de datos son considerados equivalentes solo si tienen el mismo nombre
Equivalencia de Tipos program main(input,output); type Vect1: array [1..10] of real; Vect2: array [1..10] of real; Var X,Z: Vect1; Y: Vect2; procedure Sub(A:Vect1); . end; begin X:=Y; Sub(Y) end.
Equivalencia de Tipos Equivalencia de nombres, desventajas Cada objeto usado en una asignación debe tener el mismo nombre de tipo y no pueden tener tipos anónimos Var W: array [1..10] of real;
Equivalencia de Tipos Equivalencia de nombres, desventajas Una vez que el tipo de un objeto dato es pasado como un argumento a una serie de subprogramas, no puede ser definido nuevamente en cada subprograma
Equivalencia de Tipos Equivalencia estructural Dos tipos de datos son considerados equivalentes si definen objetos dato que tengan los mismos componentes internos
Equivalencia de Tipos program main(input,output); type Vect1: array [1..10] of real; Vect2: array [1..10] of real; Var X,Z: Vect1; Y: Vect2; procedure Sub(A:Vect1); . end; begin X:=Y; Sub(Y) end.
Equivalencia de Tipos Equivalencia estructural, desventajas Dos variables pueden ser estructuralmente equivalentes type Metros = integer; Litros = integer; var Long: Metros; Vol: Litros;