seminario de lenguajes a – opción ada seminario de lenguajes a – opción ada – raúl...

27
Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 1 • Packages – Unidad de compilación que permite la especificación de grupos de entidades lógicamente relacionadas: •Colección de tipos, variables y/o constantes, subprogramas, packages •Combinación de los anteriores •Tipos de datos abstractos y datos abstractos – Dos partes •Especificación •Cuerpo

Upload: faramundo-moncayo

Post on 22-Apr-2015

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 1

• Packages– Unidad de compilación que permite la

especificación de grupos de entidades lógicamente relacionadas:• Colección de tipos, variables y/o constantes,

subprogramas, packages• Combinación de los anteriores• Tipos de datos abstractos y datos abstractos

– Dos partes• Especificación• Cuerpo

Page 2: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 2

• Packages– Especificación

• Cada package tiene una especificación pero no necesariamente un cuerpo

• En la especificación se encuentran las declaraciones públicas

package Rational_Numbers is type Rational is record Numerator: integer; Denominator: Positive; end record; function "="(X,Y: Rational) return boolean; function "/"(X,Y: integer) return Rational; function "+"(X,Y: Rational) return Rational; function "-"(X,Y: Rational) return Rational; function "*"(X,Y: Rational) return Rational; function "/"(X,Y: Rational) return Rational;end Rational_Numbers;

Page 3: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 3

• Packages– Cuerpo

• En el cuerpo se encuentra la parte “no pública del package

• Implementa las declaraciones de la especificación• El cuerpo es obligatorio cuando

– La especificación tiene declaraciones que requieren un cuerpo

– Se requiere inicialización

Page 4: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 4

• Packages– Cuerpo

package body Rational_Numbers is procedure Same_Denominator(X, Y: in out Rational) is begin -- reduces X and Y to the same denominator: -- ... end Same_Denominator; function "="(X,Y: Rational) return Boolean is U : Rational := X; V : Rational := Y; begin Same_Denominator(U, V); return U.Numerator = V.Numerator; end "="; function "/"(X, Y: Integer) return Rational is begin if Y > 0 then return (Numerator => X, Denominator => Y); else return (Numerator => -X, Denominator => -Y); end if; end "/"; function "+"(X, Y: Rational) return Rational is ... end "+"; function "-"(X, Y: Rational) return Rational is ... end "-"; function "*"(X, Y: Rational) return Rational is ... end "*"; function "/"(X, Y: Rational) return Rational is ... end "/";end Rational_Numbers;

Page 5: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 5

• Packages– Uso de un package (with y use)

with Rational_Numbers;procedure Use_Rational_Numbers is R1, R2: Rational_Numbers.Rational;begin R1 := Rational_Numbers."/"(1, 2); R2 := Rational_Numbers."/"(2, 4);end Use_Rational_Numbers;

with Rational_Numbers;use Rational_Numbers;procedure Use_Rational_Numbers is R1, R2: Rational;begin R1 := 1 / 2; R2 := 2 / 4;end Use_Rational_Numbers;

– Posibles conflictos con la cláusula use

Page 6: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 6

• Packages– Tipos privados

• Parte privada del package = mayor abstracción

package StackInt is type Stack is private; procedure Push(S: in out Stack; I: in integer); procedure Pop(S: in out Stack; I: out integer); function IsEmpty(S: in Stack) return boolean; -- ...private type Nodo; type Stack is access Nodo; type Nodo is record Valor: integer; Siguiente: Stack; end record;end StackInt;

Page 7: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 7

• Packages– Tipos privados

package body StackInt is procedure Push(S: in out Stack; I: in integer) is begin S := new Nodo'(I, S); end Push; procedure Pop(S: in out Stack; I: out integer) is begin if S /= null then I := S.Valor; S := S.Siguiente; end if; end Pop; function IsEmpty(S: in Stack) return boolean is begin return S = null; end IsEmpty; -- ....end StackInt;

Page 8: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 8

• Packages– En el programa se puede:

• Tipos comunes (ej: Rational_Numbers):– Declarar variables y constantes– Asignar– Comparar por igualdad– Operaciones definidas por el package– Acceder a la estructura, referenciar campos, elementos, etc.

• Tipos privados (ej: StackInt):– Declarar variables y constantes– Asignar– Comparar por igualdad– Operaciones definidas por el package

Page 9: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 9

• Packages– Tipos privados limitados

package StackInt is type Stack is limited private; procedure Push(S: in out Stack; I: in integer); procedure Pop(S: in out Stack; I: out integer); function IsEmpty(S: in Stack) return boolean; -- ...private type Nodo; type Stack is access Nodo; type Nodo is record Valor: integer; Siguiente: Stack; end record;end StackInt;

– En el programa se puede • Declarar variables y constantes• Operaciones definidas por el package

Page 10: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 10

• Packages– Inicialización

package body PkgImagen is -- ....begin -- abrir archivo de imagen -- leer contenido del archivo y cargarlo en una variable Imagen

-- cerrar archivoend PkgImagen;

Page 11: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 11

• Excepciones– Terminación normal y anormal– Mecanismo de tratamiento y recuperación de errores en

tiempo de ejecución y situaciones excepcionales– Ejemplos: división por cero, overflow, indice de un arreglo que excede

sus límites, fin de archivo, etc.

procedure Clase7_Excepciones1 is subtype Rango is integer range 1..10; Vector: array (Rango) of integer := (...........); I: integer; package IIO is new Integer_IO(integer); use IIO;begin loop Get(I); (posible Data_error) exit when I = 0; Put(Vector(I)); (posible

Constraint_error) end loop;end Clase7_Excepciones1;

Page 12: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 12

• Excepciones– Algunas excepciones predefinidas son:

• Constraint_error– Se produce cuando el programa viola alguna forma de

restricción (restricciones de rango, restricciones de índice, restricciones de discriminante, etc.)

• Data_Error– Se produce cuando se lee un valor que no se corresponde

con el tipo de la variable sobre la cual se lee

• Storage_error– Se produce cuando hay una cantidad de memoria

insuficiente para satisfacer los requerimientos de memoria en tiempo de ejecución de un programa

Page 13: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 13

• Excepciones– Cómo atrapar y manejar un error?

• Manejadores de excepcionesbegin Sentencia 1; ...... Sentencia N;exception when Constraint_error => Sentencias; when others => Sentencias;end;

– Los manejadores de excepciones pueden aparecer en:• Bloques begin/end, cuerpo de subprograma, package o task

– Qué pasa luego de manejar un error?• Dos esquemas. En Ada termina anormalmente la unidad en

ejecución y devuelve el control a la unidad llamadora

Page 14: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 14

• Excepciones– Qué pasa si la unidad no define un manejador?

• => Propagación

procedure P is procedure Q is begin .... end Q;begin ... Q; ...exception when constraint_error => ......end P;

se “propaga” alllamador

Page 15: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 15

• Excepciones– Propagación automática

procedure P is procedure Q is begin .... exception when constraint_error => .... end Q;begin ... Q; ...exception when constraint_error => ......end P;

(1) se maneja y vuelve al punto de llamado

(2) se maneja y termina

Page 16: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 16

• Excepciones– La propagación

sigue la cadena dinámica

procedure P is procedure R is begin .... (1)

end R; procedure Q is begin ....

R; (2) ....

exception when constraint_error => ....

end Q;begin ...

Q; (3) ...

exception when constraint_error => ......

end P;

P

Q

R

Page 17: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 17

• Excepciones– Propagación por programa

begin Sentencia 1; Sentencia 2; ....... Sentencia N;exception when Constraint_error => Sentencias; raise;end;

Page 18: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 18

• Excepciones– Ejemplo procedure Clase7_Excepciones1 is

subtype Rango is integer range 1..10; Vector: array (Rango) of integer := (...........); I: integer; package IIO is new Integer_IO(integer); use IIO;

begin loop Get(I); exit when I = 0; Put(Vector(I)); end loop;end Clase7_Excepciones1;

begin loop begin Get(I); exit when I = 0; Put(Vector(I)); exception when Data_error => Put("El valor ingresado no es entero"); when Constraint_error => Put("El valor debe estar en 1..10"); end; end loop;end Clase7_Excepciones2;

Page 19: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 19

• Excepciones– Generación de excepción por programa

• El programador puede generar cualquier excepción por programa

Get(PossiblePrice);

if PossiblePrice <= MinPrice or

PossiblePrice > MaxPrice then

raise Data_Error;

end if;

Page 20: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 20

• Excepciones– Declaración de excepciones

• El programador puede declarar sus propias excepcionesPrice_error: exception;--------------------------------

Get(PossiblePrice);

if PossiblePrice <= MinPrice or

PossiblePrice > MaxPrice then

raise Price_Error;

end if;--------------------------------

exception

when Price_Error =>

...............

Page 21: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 21

• Excepciones– Declaración de excepciones. Ejemplo

package StackInt2 is type Stack is private; procedure Push(S: in out Stack; I: in integer); procedure Pop(S: in out Stack; I: out integer); Overflow, Underflow: exception; .....end StackInt2;

begin loop I := I + 1; Push(S, I); end loop;exception when Overflow => Put_Line("llena");end;begin loop Pop(S, I); Put(I); end loop;exception when Underflow => Put_Line("Vacia");end;

procedure Push(S: in out Stack; I: in integer) isbegin if S.CantNodos = MaxCount then raise Overflow; end if; .....end Push;procedure Pop(S: in out Stack; I: out integer) isbegin if S.CantNodos = 0 then raise Underflow; end if; .....end Pop;

Page 22: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 22

• Excepciones– Alcance de una excepción

• Es igual que para cualquier identificadorprocedure P is E: exception; procedure Q is begin raise E; end Q; procedure R is E: exception; begin Q; exception when E => -- excepción E local end R;begin R;exception when E => -- excepción E globalend P;

Page 23: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 23

• Excepciones en Javapublic void writeList() { PrintWriter out = null; try { System.out.println("Entering try statement"); out = new PrintWriter(new FileWriter("OutFile.txt")); for (int i = 0; i < SIZE; i++) out.println("Value at: " + i + " = " + victor.elementAt(i));

} catch (ArrayIndexOutOfBoundsException e) { System.err.println("Caught " + "ArrayIndexOutOfBoundsException: " + e.getMessage());

} catch (IOException e) { System.err.println("Caught IOException: " + e.getMessage());}

Page 24: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 24

• Excepciones en Javapublic void writeList() { PrintWriter out = null; try { System.out.println("Entering try statement"); out = new PrintWriter(new FileWriter("OutFile.txt")); for (int i = 0; i < SIZE; i++) out.println("Value at: " + i + " = " + victor.elementAt(i));

} finally { if (out != null) { System.out.println("Closing PrintWriter"); out.close(); } else { System.out.println("PrintWriter not open"); } }}

Page 25: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 25

• Excepciones en Javapublic void writeList() { PrintWriter out = null; try { System.out.println("Entering try statement"); out = new PrintWriter(new FileWriter("OutFile.txt")); for (int i = 0; i < SIZE; i++) out.println("Value at: " + i + " = " + victor.elementAt(i));

} catch (ArrayIndexOutOfBoundsException e) { System.err.println("Caught " + "ArrayIndexOutOfBoundsException: " + e.getMessage());

} catch (IOException e) { System.err.println("Caught IOException: " + e.getMessage());

} finally { if (out != null) { System.out.println("Closing PrintWriter"); out.close(); } else { System.out.println("PrintWriter not open"); } }}

Page 26: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 26

• Excepciones en Delphi

Zero := 0;try

dummy := 10 / Zero;except

on EZeroDivide do  MessageDlg('Can not divide by zero!', mtError, [mbOK], 0) ;

end;

Page 27: Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Packages –Unidad de compilación que permite la especificación

Seminario de Lenguajes A – Opción Ada

Seminario de Lenguajes A – Opción Ada – Raúl Champredonde 27

• Excepciones en Delphi

AboutBox := TAboutBox.Create(nil) ;try AboutBox.ShowModal;finally AboutBox.Release;end;