ambar-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Ambar-dev] Enfoque más sistemático del tratamiento de errores


From: Andres Moya
Subject: [Ambar-dev] Enfoque más sistemático del tratamiento de errores
Date: Fri, 8 Feb 2002 20:29:45 +0100

Buenas.

Ya tengo el Linux bien en el trabajo, y también he encontrado ratos para 
trastear con el Mine ...  (guay)  Lo que no tengo es CVS, porque tengo un 
firewall gordo que no me deja pasar. Pero bueno, no es grave, me lo mando por 
mail a mi casa y hago el update desde aquí.

Estoy pensando que hay que meter un poco más de "ingeniería del software" 
para conseguir que el programa sea más robusto sin meter demasiados pegotes. 
Voy a repasar todo el programa añadiendo una técnica que se llama "diseño por 
contrato" (algún día te lo explicaré), que a grosso modo significa que hay 
que añadir en todas las clases y todas las funciones unas "aserciones", que 
son como las cláusulas del contrato que la clase/funcion se compromete a 
cumplir. En realidad es un poco más largo, pero así se consigue prevenir y 
detectar mejor los errores. Lo malo es que el Python no incorpora esto en el 
lenguaje, así que me tengo que inventar una manera de hacerlo...

He empezado por el fichero sala.py. Hay tres tipos de aserciones:

- Invariantes: pertenecen a una clase. Son condiciones que se tienen que 
cumplir siempre. Por ejemplo, en la clase Sala, la invariante "id != None" 
significa que desde fuera siempre es seguro escribir unasala.id (no hace 
falta chequear if unasala.id != None). O la invariante "personajes[i].sala == 
self" significa que la lista "personajes" contiene sólo personajes cuya sala 
es la actual. Todos los métodos de la clase tienen que asegurarse de que 
ninguna invariante esté rota antes de hacer return. 

- Precondiciones: son condiciones que deben cumplirse antes de llamar a una 
función, y es responsabilidad del llamante asegurarse de que se cumplen (se 
etiquetan con la palabra "requiere"). Por ejemplo, salir_personaje tiene la 
precondición "personaje in self.personajes.values()", que significa que sólo 
puede salir un personaje que ya esté en la sala.

- Postcondiciones: son condiciones que la función se compromete a cumplir 
cuando termine. Por ejemplo, salir_personaje "asegura" que "personaje not in 
self.personajes.values()". O sea, cuando termine la función el personaje ya 
no está en la sala.

Hay un lenguaje (Eiffel) - que, por cierto, también me gusta bastante - que 
incorpora esto en el propio lenguaje y tiene opciones para comprobarlo 
automáticamente. En Python por el momento, lo pondremos en los comentarios y 
lo comprobaremos a mano.

Cuando las aserciones están colocadas, el tratamiento de excepciones y 
errores se puede hacer de una manera bastante sistemática, pero eso ya te lo 
explicaré otro día :)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]