1.087 visualizaciones desde el 31 de Mayo del 2018
444,7 KB
30 paginas
Creado hace 18a (06/11/2006)
Programación Orientada a Objetos
TEMA 3
Corrección y Robustez
Facultad de Informática
Universidad de Murcia
Contenido
1. Introducción
• Fiabilidad = Corrección y Robustez
2. Aserciones. Programación por Contrato
3. Abordando los casos excepcionales
Corrección y Robustez
2
•1
Introducción
• “La reutilización y la extensibilidad no se deben lograr a expensas
de la fiabilidad (corrección y robustez)”.
• Corrección:
– Capacidad de los sistemas software de ajustarse a la especificación.
– Asegura que el programa hace lo correcto durante la ejecución normal del
programa.
– Los asertos establecen las condiciones que se deben cumplir.
• Robustez:
– Capacidad de los sistemas software de reaccionar ante circunstancias
inesperadas.
– El mecanismo de excepciones proporciona un mecanismo para
manejar estas situaciones excepcionales durante la ejecución de un programa.
Corrección y Robustez
3
2.- Aserciones. Diseño por Contrato
• Corrección de un elemento software = consistencia entre su
implementación y su especificación
• Las aserciones permiten especificar la semántica de una clase
asociada al TAD.
• Una aserción es una expresión que establece una propiedad que
debe satisfacer alguna de las entidades de un programa, en
algún punto de la ejecución del software.
• El código define “el cómo”, las aserciones “el qué”
Corrección y Robustez
4
•2
Lenguaje de Aserciones
• El lenguaje de aserciones de Eiffel es muy
simple:
– Expresiones booleanas con unas pocas
extensiones
(old, ‘;’)
– Una aserción puede incluir funciones.
Positivo: n>0;
autor = not void
not vacia; conta = old conta + 1
saldo = old saldo – cantidad
Corrección y Robustez
5
Uso de las aserciones:
(A) Especificar la semántica de las rutinas mediante:
– PRECONDICIONES:
Condiciones para que una rutina funcione adecuadamente.
– POSTCONDICIONES:
Describen el efecto de una rutina, definiendo el estado final.
(B) Especificar las propiedades globales de una
clase mediante el INVARIANTE:
Aserción que expresa restricciones de integridad que deben
ser satisfechas por cada instancia de la clase si se encuentra en una
situación estable.
Corrección y Robustez
6
•3
Momentos “estables”
• Los “momentos estables” son aquellos en los que una
instancia está en un estado observable (e1, e2, …):
– Después de la creación: !!a o !!a.make(...)
– Antes y después de la invocación remota de una rutina de la
clase: a.r(...)
!!a.make(…)
En etapas intermedias el INV no se cumplirá
¿Cuál es el papel de las rutinas de creación?
Corrección y Robustez
e1
a.f(...)
e2
a.g(...)
e3
a.f(...)
e4
Ejemplo: Pre y Postcondiciones
put (elemento: T; key: STRING) is
-- Insertar en la tabla elemento con clave key
require
• Importante basarse en aserciones para expresar las
propiedades precisas de un diseño.
--count=nº de elementos
0<=index; index <=count
before = (index=0);
after = (index=count+1);
is_first = ((not empty) and (index=1));
is_last = ((not empty) and (index=count));
empty implies (before or after);
not (before and after)
• Invariante es la mejor manera de comprender una clase
Corrección y Robustez
10
•5
Contrato Software
Definir una pre y una post para una rutina
es una forma de definir un contrato que
liga a la rutina con quien la llama.
put
Cliente
Obligaciones
Al invocar a put
debe asegurar que
la tabla no está llena
Beneficios
Obtiene una tabla en la que
elemento está asociado con clave
Servidor
Insertar elemento
en la tabla asociándolo de tabla llena antes de la inserción
a clave
No necesita tratar la situación
Corrección y Robustez
11
Contrato Software
Definir una pre y una post para una rutina
es una forma de definir un contrato que
liga a la rutina con quien la llama.
put
Cliente
Obligaciones
Beneficios
Satisfacer
Al invocar a put
debe asegurar que
la tabla no está llena
precondición
Obtiene una tabla en la que
De la postcondición
elemento está asociado con clave
Servidor
Satisfacer
Insertar elemento
No necesita tratar la situación
De la precondición
en la tabla asociándolo de tabla llena antes de la inserción
postcondición
a clave
Corrección y Robustez
12
•6
Contrato Software
satisfecho
“Si usted me promete llamar a rcon
pre
le
prometo entregar un estado final en
el que post es satisfecho”
entonces
yo
Lo que es una obligación para
uno es un beneficio para el otro
CLIENTE
CLASE
Corrección y Robustez
13
Rechazo a la “programación defensiva”
sqrt(x: REAL): REAL is do
if x<0 then “Manejar error”
else “Calcular raíz”
end;
No hay que comprobar la precondición en la rutina
sqrt(x: REAL): REAL is
require
x >= 0;
CLIENTE:
if (x>=0)
Math.sqrt(x);
do
end;
“Calcular raíz”
El cuerpo de la rutina no comprueba el cumplimiento
de la precondición
Corrección y Robustez
14
•7
Rechazo a la “programación defensiva”
• Redundancia es perjudicial: software más complejo.
¡¡La complejidad es el mayor enemigo de la calidad!!
• Mejor identificar condiciones y establecer responsabilidades.
• Tedioso eliminar o ignorar los controles cuando no se necesiten
• Paradoja: “La fiabilidad se mejora chequeando menos”
¡¡Garantizar mas comprobando menos!!
“El código cliente debe comprobar la precondición”
Corrección y Robustez
15
Utilidad de las Aserciones
• Escribir software correcto:
describir requisitos exactos de cada rutina y las propiedades
globales de las clases ayuda a producir software que es correcto
desde el principio.
• Ayuda para la documentación:
pre, post- condiciones e invariante proporcionan información
precisa a los clientes de los módulos.
• Apoyo para la prueba y depuración:
el programador establece como opción del compilador el efecto
de las aserciones en tiempo de ejecución.
Corrección y Robustez
16
•8
Asertos en Java (JDK 1.4)
• Expresión booleana que un desarrollador
indica
explícitamente que se debe cumplir en un punto del
programa en tiempo de ejecución.
• El sistema evalúa la expresión booleana e informa del
error en el caso de que el valor sea false.
– Lanza AssertionException
• Las aserciones en Java NO proporcionan el soporte para
el Diseño por Contrato tal y como se entiende en Eiffel.
Corrección y Robustez
17
Ejemplo
/** Insertar en la tabla elemento con clave key */
public void put (Object elemento, String key) {
assert count < capacity: “fallo en la pre”;
int oldCount = count;
... "algoritmo de inserción"
assert count <= capacity &&
item (key).equals(elemento) &&
count == oldCount + 1: “fallo en la post”;
}
Corrección y Robustez
18
•9
Ejemplos
assert ref != null;
assert saldo == (oldSaldo + cantidad);
assert ref.m1(parametro);
assert valor>0 : “argumento negativo”;
assert x>0 : x;
• La expresion_booleana no debe tener efectos
laterales
• La expresión se pasa como argumento al constructor de
la excepción en el caso de que el aserto sea false.
Corrección y Robustez
19
Activación de asertos en Java
• Los asertos los soporta sólo a partir de la versión 1.4. Se debe
indicar explícitamente al compilador para que reconozca la palabra
clave assertion
javac –source 1.4 MiAplicacion.java
• La comprobación de los asertos se puede desactivar en tiempo de
ejecución para incrementar el rendimiento.
– Normalmente se activa durante la fase de depuración y pruebas
• En la versión 1.4 por defecto no se tienen en cuenta los asertos, en
la versión JDK 5.0 si.
Corrección y Robustez
20
•10
Usos de los asertos
• Invariantes internos:
if (i%3 == 0){
…}else if (i%3 == 1){
…} else {
assert (i%3 ==2);
…
}
• Invariantes de flujo de control:
void met(){
if(…) return;
for (…){
}
//nunca deberíamos llegar a este punto
assert false;
}
• Precondiciones, postcondiciones e invariantes:
Corrección y Robustez
21
Pre, post e invariantes en Java
private void setIntervalo(int intervalo){
//precondición
assert intervalo>0 && intervalo<=MAXIMO;
...//establecer el intervalo
}
//devuelve this-1 mod m
public BigInteger modInverso (BigInteger m){
//comprobaciones de la precondición
...
//hacer el cálculo
//postcondición
assert this.multiply(result).mod(m).equals(UNO);
return result;
}
Corrección y Robustez
22
•11
Invariante en Java
class Pila{
//método que comprueba el invariante
private boolean invariante(){
return ((count>=0) && (count <=capacity) &&
(capacity == representation.length));
}
...
}
• Se debe cumplir antes y después de la terminación de cada método.
• Todo método y constructor debe contener la línea
assert invariante();
inmediatamente antes de que termine.
Corrección y Robustez
23
¿Cuándo utilizar assert?
• Localizar errores internos irrecuperables durante la
fase de pruebas y depuración.
• No utilizar para evaluar condiciones externas al
programa (existencia de un fichero, conexión de red,
…)
• Puesto que se pueden desactivar, la corrección de un
programa no puede depender de los asertos.
Corrección y Robustez
24
•12
assert de Java ≠ Diseño por Contrato
• En DxC existen distintos tipos de asertos.
– en Java todos son assert
• Los aser
Links de descarga
http://lwp-l.com/pdf11487
Comentarios de: TEMA 3 Corrección y Robustez - Programación Orientada a Objetos (0)
Comentarios de: TEMA 3 Corrección y Robustez - Programación Orientada a Objetos (0)
No hay comentarios