Encapsulamiento Romeo Alvarez Arana



Descargar 21,46 Kb.
Fecha de conversión14.05.2017
Tamaño21,46 Kb.

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.
  • 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.
  • 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.
  • 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
  • begin
      • serie de instrucciones que permiten ingresar una sección en la lista de clases.
  • end Enter;

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

  • 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

  • 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

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

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?
      • 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 Tipos

  • Dos tipos de datos son considerados equivalentes solo si tienen el mismo nombre
      • 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 Tipos

  • 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
      • 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 Tipos

      • type Metros = integer;
      • Litros = integer;
      • var Long: Metros;
  • Vol: Litros;
  • Dos variables pueden ser estructuralmente equivalentes


La base de datos está protegida por derechos de autor ©absta.info 2016
enviar mensaje

    Página principal