Está en la página 1de 12

Machine Translated by Google

yo

Aplicando “Diseño por


contrato ”
Bertrand Meyer
Ingeniería de software interactivo

Las técnicas orientadas a objetos ganan cada vez más terreno en el mundo del desarrollo de
software . Los usuarios y posibles usuarios de estas técnicas están clamando cada vez más
por una “metodología” de construcción de software orientada a objetos , o al menos por
algunas pautas metodológicas. Este artículo presenta dichos lineamientos, cuyo objetivo principal es
ayudar a mejorar la confiabilidad de los sistemas de software. La confiabilidad se define aquí como la
combinación de corrección y robustez o. más prosaicamente, como la ausencia de errores.

Todos los que desarrollan sistemas de software. o simplemente usándolos, sabe cuán apremiante es
esta cuestión de confiabilidad en el estado actual de la ingeniería de software. Sin embargo, la literatura
en rápido crecimiento sobre el análisis orientado a objetos. diseño. y la programación incluye muy pocas
contribuciones sobre cómo hacer que el software orientado a objetos sea más confiable. Esto es
sorprendente y lamentable, ya que al menos tres razones justifican dedicar especial atención a la
confiabilidad en el contexto del desarrollo orientado a objetos:

La piedra angular de la tecnología orientada a objetos es la reutilización. Para los componentes


reutilizables, que pueden usarse en miles de aplicaciones diferentes, las posibles consecuencias de
un comportamiento incorrecto son incluso más graves que para los desarrollos específicos de
aplicaciones.
Los defensores de los métodos orientados a objetos hacen fuertes afirmaciones sobre sus beneficios.

..
El enfoque orientado a objetos, basado en la teoría de tipos de datos abstractos, proporciona un
La confiabilidad es aún más marco particularmente apropiado para discutir y hacer cumplir la confiabilidad.

importante en la
programación orientada a Las técnicas pragmáticas presentadas en este artículo, si bien ciertamente no brindan formas infalibles
para garantizar la confiabilidad, pueden ayudar considerablemente a lograr este objetivo.
objetos que en cualquier
Se basan en la teoría del diseño por construcción. que subyace al diseño del lenguaje de análisis, diseño
otra parte* Este artículo y programación de Eiffel y de las bibliotecas de apoyo, de las que se extraerán una serie de ejemplos.

muestra cómo reducir los Las contribuciones del trabajo informado a continuación incluyen

errores mediante la creación un conjunto coherente de principios nrrthocfológicos que ayuden a producir software correcto y

de componentes de software robusto ; un enfoque sistemático del delicado problema de cómo tratar los casos anormales. que
conduce a un mecanismo de manejo de excepciones simple y poderoso ; y
sobre la base de contratos cuidadosamente diseñados.

Uso con licencia autorizado limitado a: Universidad Tecnológica de Michigan. Descargado el 21 de febrero de 2010 a las 19:03:00 EST desde IEEE Xplore. Se aplican restricciones.
Machine Translated by Google

una mejor comprensión de la herencia y de complejidad y dificultad de manejo que a menudo carta o paquete entregado en otra dirección de
las técnicas asociadas (redeclaración, caracteriza al software. París, puede optar por entregarlo usted mismo o
polimorfismo y enlace dinámico) a través de Obtener y garantizar la confiabilidad requiere contratar un servicio de mensajería.
la noción de subcontrato, lo que permite un un enfoque más sistemático.
enfoque sistemático para usar estos En particular, los elementos de software deben Dos propiedades principales caracterizan los
mecanismos poderosos pero a veces considerarse implementaciones destinadas a contratos humanos que involucran a dos partes:
peligrosos. satisfacer especificaciones bien entendidas, no
como textos ejecutables arbitrarios. Aquí es donde Cada parte espera algunos beneficios del
entra la teoría del contrato. contrato y está dispuesta a incurrir en algunas
La mayoría de los conceptos presentados aquí obligaciones para obtenerlos.
han aparecido en otros lugares. Fueron presentados Estos beneficios y obligaciones son
en el libro Construcción de software orientada a
La noción de contrato documentado en un documento de contrato.
objetos'; y se presentó una exposición más
completa en un capítulo de libro reciente, del cual Suponga que está escribiendo una unidad de La Tabla 1 muestra un cuadro imaginario de
se ha adaptado este artículo. Más profundamente, programa que implementa una tarea que se obligaciones y beneficios para el servicio de
este trabajo encuentra su raíz en trabajos anteriores realizará en tiempo de ejecución. A menos que la mensajería del ejemplo.
sobre programas sistemáticos y tipos de datos tarea sea trivial, implica una serie de subtareas. Un documento de contrato protege a ambas
abstractos. hX Este artículo se enfoca en las ideas Por ejemplo, podría aparecer como partes:
centrales, presentándolas de manera concisa para
que los desarrolladores las apliquen directamente. mi tarea es Protege al cliente especificando cuánto se
hacer debe hacer: El cliente tiene derecho a recibir un
subtarea, ; determinado resultado.
subtarea2 ; Protege al contratista al especificar qué tan
... poco es aceptable: El contratista no debe ser
Revisión de la programación subtarea,, ; responsable por no realizar tareas fuera del
defensiva final alcance especificado.

una forma que es suficiente para esta discusión.


Los libros de texto de ingeniería de software y aunque en muchos casos la estructura de control Como lo demuestra este ejemplo, lo que es una
metodología de programación que analizan la que vincula las diversas subtareas es menos obligación para una parte suele ser un beneficio
confiabilidad a menudo enfatizan la técnica simple que la mera secuencia que se muestra aquí. para la otra.
conocida como programación defensiva, que dirige Este ejemplo también sugiere una observación
a los desarrolladores a proteger cada módulo de Para cada una de estas subtareas, puede algo más sutil, que es importante en la siguiente
software contra las hondas y flechas de la fortuna escribir la solución correspondiente en línea como discusión (y en el estudio de la aplicación de estas
escandalosa. En particular, esto alienta a los parte del cuerpo de my-task o depender de una ideas a la computación concurrente). Si el contrato
programadores a incluir tantas comprobaciones llamada a otra unidad. La decisión es una es exhaustivo, cada entrada de "obligación"
como sea posible, incluso si son redundantes con compensación típica del diseño: demasiadas también describe en cierto sentido un "beneficio"
las comprobaciones realizadas por las personas llamadas provocan la fragmentación del texto del al establecer que las restricciones dadas son las
que llaman. Inclúyalos de todos modos, dice el software: muy pocas dan como resultado unidades únicas relevantes. Por ejemplo, la entrada de
consejo; si no ayudan. al menos no harán daño. individuales demasiado complejas. obligación para el cliente indica que un cliente que
Suponga que decide utilizar una llamada de satisface todas las restricciones enumeradas tiene
Este enfoque sugiere que las rutinas deben ser rutina para una de las subtareas. Esto es similar a derecho a los beneficios que se muestran en la
lo más generales posible. Una rutina parcial (una la situación encontrada en ev siguiente entrada. Esta es la regla de No hay
que funciona solo si la persona que llama garantiza vida cotidiana cuando decide subcontratar para cláusulas ocultas: con un contrato completamente
ciertas condiciones restrictivas en el momento de una determinada tarea (humana) en lugar de detallado entre partes honestas, no hay requisitos
la llamada) se considera peligrosa porque puede hacerlo usted mismo. Por ejemplo. si estás en
producir consecuencias no deseadas si la persona París y quieres un urgente
que llama no cumple con las reglas.

Esta técnica, sin embargo, a menudo frustra Tabla 1. Ejemplo de contrato.


sus propios propósitos. Agregar código
posiblemente redundante "por si acaso" solo Fiesta Obligaciones Beneficios
contribuye a la complejidad del software, el peor
obstáculo para la calidad del software en general. Cliente Entregar carta o paquete de no más de Obtenga el paquete entregado
y a la fiabilidad en particular. El resultado de esta 5 kgs. cada dimensión no más de 2 metros. al destinatario en cuatro horas o
verificación a ciegas es simplemente introducir más menos.
software. por lo tanto, más fuentes de cosas que Paga 100 francos.
podrían salir mal en el momento de la ejecución,
por lo tanto, la necesidad de más comprobaciones, Proveedor Entrega el paquete al destinatario en No hay necesidad de tratar con
y así hasta el infinito. Tan ciego y a menudo redun cuatro horas o menos. entregas demasiado grandes,
demasiado pesadas o sin pagar.
la verificación de dant causa gran parte de la com

octubre de 1992 41

Uso con licencia autorizado limitado a: Universidad Tecnológica de Michigan. Descargado el 21 de febrero de 2010 a las 19:03:00 EST desde IEEE Xplore. Se aplican restricciones.
Machine Translated by Google
yo

distintas de las obligaciones oficiales Este es el contrato impuesto por

del contrato pueden ser impuestas al nombre-rutina (declaraciones de argumento) es put-child a cualquier posible llamante.
-- Comentario de cabecera Contiene la información más importante
cliente como condición para obtener
los beneficios oficiales del contrato. requerir que se puede dar sobre la rutina: lo
Condición previa que cada una de las partes en el
hacer
El principio de Cláusulas No Ocultas contrato debe garantizar para una
Cuerpo de rutina , Le. instrucciones
no nos impide incluir referencias. ensoltado correcta llamada, ya qué tiene derecho
implícito o explícito, a reglas que no poscondición cada parte a cambio. Debido a que
final esta información es tan crucial para la
forman parte físicamente del contrato.
construcción de sistemas confiables
Por ejemplo, las reglas generales,
usando tales rutinas, debería ser una
como las leyes pertinentes y las Figura 1. Una rutina equipada con afirmaciones.
prácticas comerciales comunes, se parte formal del texto de la rutina (vea
consideran implícitamente como parte la Figura 2).
de todo contrato de cierto tipo. aunque put-child (nuevo: NODO) es
-- Agregar nuevo a los elementos secundarios del nodo
no se repita explícitamente en el texto
de cada contrato. Se aplican tanto al actual requiere nuevo / = Void Unos pocos detalles más sobre las

cliente como al proveedor y conducirán reglas de la programación orientada a


más adelante a la noción de invariante
hacer objetos tal como se incorporan en
de clase. ... Algoritmo de inserción ... Eiffel debería ayudar a dejar este
asegurar ejemplo completamente claro:
nuevo.padre = actual;
recuento de niños = recuento de niños anterior + 1 Una referencia como nueva es
fin - poner-niño nula (no adjunta a ningún objeto) o
Afirmaciones: adjunta a un objeto. En el primer caso,
Figura 2. Aserciones para la rutina de inserción del niño. es igual al valor Void. Aquí la condición
Contratación de previa expresa que la referencia nueva
software no debe ser nula, como se establece
afirmación es una lista de expresiones booleanas, informalmente por la entrada correspondiente en la
No es difícil ver cómo se aplican las ideas separadas por punto y coma; aquí, un punto y coma Tabla 2.
anteriores a la construcción de software. Si la es equivalente a un booleano “y”, pero permite la
ejecución de una determinada tarea se basa en una identificación individual de las cláusulas de aserción. De acuerdo con los principios orientados a
llamada de rutina para manejar uno de objetos de Eiffel, la rutina aparecerá en el texto de
sus subtareas, es necesario especificar la relación La precondición expresa requisitos que toda una clase que describa árboles o nodos de árboles.
entre el cliente (el llamador) y el proveedor (la rutina llamada debe satisfacer para que sea correcta; la Es por eso que no necesita un argumento que
llamada) con la mayor precisión posible. Los condición posterior expresa propiedades que se represente el nodo al que la rutina agregará la
mecanismos para expresar tales condiciones se garantizan a cambio mediante la ejecución de la referencia new como hijo; todas las rutinas de la

denominan aserciones. Algunas afirmaciones. llamada. clase son relativas a un nodo de árbol típico, la
llamadas condiciones previas y condiciones Una cláusula de condición previa faltante es "instancia actual" de la clase.
posteriores. aplicar a rutinas individuales. Otros, los equivalente a la cláusula Require True, y una
invariantes de clase, restringen todas las rutinas de condición posterior faltante a la cláusula En sure En una llamada específica como some -nodeput-
una clase dada y se discutirán más adelante. True. La afirmación Verdadera es la menos child (x), el valor anterior al punto, aquí some-node,
comprometedora de todas las afirmaciones posibles. sirve como instancia actual.
Cualquier estado posible de la computación lo
Es importante incluir las condiciones previas y satisfará . *En el texto de la clase, el nombre predefinido
posteriores como parte de las declaraciones de rutina Considere, por ejemplo. en una clase ÁRBOL que Actual sirve, si es necesario, para referirse a la
(ver Figura 1 ). describe los nodos del árbol. una rutinaput-child para instancia actual.
En esta notación de Eiffel, las cláusulas Requerir agregar un nuevo hijo a un nodo de árbol Currmr. Aquí se usa en la poscondición.
y Asegurar (así como el comentario del encabezado) Se puede acceder al hijo a través de una referencia, La notación Old child-count, que aparece en
son opcionales. Introducen afirmaciones , que debe adjuntarse a un objeto de nodo existente. la poscondición de put-child, denota el valor de child-
respectivamente la precondición y la poscondición. La Tabla 2 expresa informalmente el contrato. count capturado en la entrada a una llamada en
Cada particular. En

Tabla 2. El contrato put-child .


~~~~~~~

Fiesta Obligaciones Beneficios

Cliente Use como argumento una referencia, digamos nuevo. a un Obtenga un árbol actualizado donde el nodo actual tiene un
objeto de nodo existente. hijo más que antes; new ahora tiene Current como padre.

Proveedor Inserte un nuevo nodo según sea necesario. No es necesario hacer nada si el argumento no está adjunto a
un objeto.

42 COMPUTADORA

Uso con licencia autorizado limitado a: Universidad Tecnológica de Michigan. Descargado el 21 de febrero de 2010 a las 19:03:00 EST desde IEEE Xplore. Se aplican restricciones.
Machine Translated by Google
yo

En otras palabras, la segunda cláusula de aunque significativa en la práctica, llega


si nuevo = Vacío
la poscondición expresa que la rutina debe sólo después de lograr ese objetivo más
aumentar el número de niños en uno. La entonces ... Encárguese del caso especial ... fundamental.
más
construcción Old puede aparecer solo en ... Cuide el caso estándar ... Otra forma de expresar esta observación
una condición posterior de rutina. es notar que las aserciones no describen
final
casos especiales sino esperados que
Figura 3. Manejo de un caso especial. requieren un tratamiento especial. En otras
palabras, las afirmaciones anteriores no
El papel de son una
las afirmaciones las aserciones son monitoreadas en tiempo de manera de describir (por ejemplo) el manejo de
ejecución, dependiendo de los deseos del argumentos void para put-child. Si quisiéramos
programador. Pero esta no es una pregunta crucial en este punto.
tratar los argumentos nulos como un caso aceptable
Es posible que se esté preguntando qué sucede si una de estas condiciones falla . El objetivo principal (aunque especial), no lo manejaríamos a través de
de esta discusión es encontrar formas de escribir software confiable
Estos ~ que
sistemas quesefuncionan.
satisfaga durante la ejecución.
La pregunta de qué afirmaciones sino a través de estructuras de control
pregunta será respondida por si sucede cuando no funcionan. Alabama condicional estándar (ver Figura 3).

Otras fuentes
Una de las dos principales fuentes de inspiración para este trabajo es la La noción de cláusula de rescate en realidad se derivó de una noción
investigación sobre la demostración de programas y la construcción formal correspondiente de función sustituta, también llamada doppelgiinger,
sistemática de programas iniciada por Floyd,' Hoare,2 y Dijk~tra.~ Otro que apareció en el método de especificación y el lenguaje M, es un sucesor
trabajo bien conocido sobre la aplicación de métodos de prueba a la directo del 2 1ang ~age original de Abrial . Eiffel, M era un lenguaje de
construcción de software incluye contribuciones de Gries4 y Milk5 La otra especificación formal, no un lenguaje ejecutable. Las funciones en una
gran influencia es la teoría de los tipos de datos abstractos (ver referencias especificación M pueden ser parciales. Un sustituto está asociado con una
en el cuerpo del artículo). función parcial y sirve como respaldo para los argumentos que no pertenecen
El uso de afirmaciones en un lenguaje orientado a objetos y el enfoque al dominio de esa función.
de la herencia presentado aquí (basado en la noción de subcontratación)
parecen originales de Eiffel. El modelo de manejo de excepciones y su
implementación también se encuentran entre las contribuciones de Eiffel.
Estos mecanismos, y el razonamiento que los condujo a ellos, se discuten Referencias
en detalle en las referencias 1 y 2 de la bibliografía principal al final del
1. RW Floyd, “Asignación de significados a los programas”, Pm. Soy. Matemáticas.
artículo.
Soc. Síntoma en Matemáticas Aplicadas, vol. 19, JT Schwartz, ed..
Sociedad Matemática Americana, Providence, RI, 1967, pp. 19-31.
La noción de invariante de clase proviene directamente del invariante de
2. CAR Hoare, "Una base axiomática para la programación de computadoras",
datos de Hoare.6 Los invariantes, así como otras afirmaciones, también
Com. ACM, vol. 12, No. 10, octubre de 1969, págs. 576-580, 583.
juegan un papel importante en el método de especificación de software
3. EW Dijkstra, Una disciplina de programación, Prentice Hall, Englewood
VDM, como lo describe Jones.7 La transposición de invariantes de datos al
Cliffs, NJ, 1976.
desarrollo de software orientado a objetos, en la forma de invariantes de
clase, parece ser nueva con Eiffel. 4. D. Gries. The Science of Programming, Springer-Verlag, Berlín y
Nueva York, 1981.
Los lenguajes de investigación no orientados a objetos que admiten
aserciones han incluido Euclids y Alphards; ver también el lenguaje de 5. HD Mills et al., Principios de programación informática: un enfoque
especificación basado en Ada Anna.lo CLU, citado en el texto, incluye matemático, Allyn y Bacon, Boston, 1987.
afirmaciones no formales. 6. CAR Hoare, 'Prueba de corrección de representaciones de datos'
La visión de los programas como mecanismos para computar Acta Informática, vol. 1, núm. 4, 1972, págs. 271-281.
funciones es central en el método VDM mencionado. 7. CB Jones, Desarrollo sistemático de software mediante VDM, Prentice
Otra visión de las excepciones se puede encontrar en Cristian.” Hall, Englewood Clis, NJ, 1986.
La noción de Eiffel de una cláusula de rescate tiene cierta semejanza con 8. BW Lampson et al., 'Informe sobre el lenguaje de programación
los bloques de recuperación de Randell,12 pero el espíritu y los objetivos Euclid', SlGPlan Notices, vol. 12, No. 2, febrero de 1977, págs. 1-79.
son diferentes. Los bloques de recuperación, tal como los define Randell, 9. Mary Shaw et al., Alphard: form and Content, Springer-Verlag, Berlín
son implementaciones alternativas del objetivo original de una rutina, que y Nueva York, 1981.
se utilizarán cuando la implementación inicial no logre este objetivo. Por el
10 D. Luckham y FW von Henke, 'An Overview of Anna, a Specification
contrario, una cláusula de rescate no intenta continuar con los asuntos Language for Ada', /E€ Software, vol. 2, No. 2, marzo de 1985, págs.
oficiales de la rutina; simplemente arregla las cosas llevando el objeto a un 9-22.
estado estable. Cualquier reintento utiliza la implementación original 11 F. Cristian, Y)n Excepciones, fallas y errores”, Tecnología y ciencia de la
nuevamente. Además, los bloques de recuperación requieren que se informática, vol. 4, No. 4, julio-agosto. 1985.
restablezca el estado inicial del sistema antes de intentar una implementación 12 B. Randell, “Estructura del sistema para tolerancia a fallas de software”, /
alternativa después de una falla. Esto parece imposible de implementar en E€ € Trans. Ing. de software, vol. SE-I, No. 2, junio de 1975, pp. 220-232.
cualquier entorno práctico para el cual la eficiencia es de alguna preocupación.
13 B. Meyer, 'M: Un método de descripción del sistema ”, Tech. Informe
Las cláusulas de rescate de Eiffel no requieren tal preservación del estado; TRCS85-15. Departamento de Ciencias de la Computación, Univ. de
la única regla es que la cláusula de rescate debe restaurar la invariante de California, Santa Bárbara, 1986.
clase y, si se intenta la reanudación, la condición previa de rutina. 14 J.4. Abrial, SA Schuman y B. Meyer, “A Specification Language”, en
On the Construction of Programs, R. McNaughten y RC McKeag, eds.,
Cambridge University Press, Inglaterra, 1980.

Uso con licencia autorizado limitado a: Universidad Tecnológica de Michigan. Descargado el 21 de febrero de 2010 a las 19:03:00 EST desde IEEE Xplore. Se aplican restricciones.
Machine Translated by Google

Las afirmaciones (aquí la ular el diseño de las bibliotecas,


condición previa) son otra cosa: sugiere que el uso sistemático de
formas de describir las condiciones Izquierda I = ierpliss vacío (izqarent = un estilo exigente puede ser bastante
en las que funcionarán los elementos actual); right I = Void intp8ies (right.parent = Current)
exitoso. En este enfoque, cada rutina
del software y las condiciones. se concentra en hacer un trabajo
__
bien definido para hacerlo bien, en
devolver. Poniendo la condición new / lugar de tratar de manejar todos los
= Void en la condición previa, la casos imaginables. Los programadores
hacemos parte de la especificación de la rutina; la Verificando a ciegas, como con la programación de clientes no esperan milagros.
última forma mostrada (con el If) significaría que hemos defensiva, puede usar contratos claramente
cambiado esa especificación, ampliándola para incluir definidos que asignan la responsabilidad de cada Mientras las condiciones sobre el uso de una rutina
el caso especial new = Void como aceptable. condición de consistencia a una de las partes. Si tengan sentido, y la documentación de la rutina
el contrato es preciso y explícito, no hay necesidad establezca estas condiciones (el contrato)
de comprobaciones redundantes. explícitamente, los programadores podrán usar la
Como consecuencia. cualquier violación en rutina
tiempo de ejecución de una aserción no es un caso Cuanto más fuerte sea la condición previa, correctamente observando su parte del trato.
especial sino siempre la manifestación de un error mayor será la carga para el cliente y más fácil para
de software. Para ser precisos: el proveedor. La cuestión de quién debe tratar con Una objeción a este estilo es que parece obligar
valores anormales es esencialmente una decisión a cada cliente a hacer las mismas verificaciones,
Una violación de condición previa indica un pragmática sobre la división del trabajo: la mejor correspondientes a la condición previa, y por lo
error en el cliente (persona que llama). La persona solución tanto da como resultado repeticiones innecesarias
que llama no observó las condiciones impuestas a ción es la que logra la arquitectura más simple. Si y dañinas. Pero este argumento no está justificado:
las llamadas correctas. todas las rutinas y las personas que llaman
Una violación de la condición posterior es un verificaran todos los posibles errores de llamada,
error en el proveedor (rutina). La rutina no cumplió las rutinas nunca realizarían ningún trabajo útil. La presencia de una precondición p en una
sus promesas. rutina r no significa necesariamente que cada
En muchos programas existentes, es difícil llamada deba probar p, como en
encontrar islas de procesamiento útil en océanos
Observaciones de código de verificación de errores. si x entonces
sobre contratos de software En ausencia de afirmaciones, la programación xr
defensiva puede ser el único enfoque razonable. más
Pero con técnicas para definir con precisión la ... Trato Especial ...
En la Tabla 2, la entrada de abajo a la derecha responsabilidad de cada parte, tal como lo final
es particularmente notable. Si la condición previa proporcionan las afirmaciones, tal redundancia (tan
no se cumple, la rutina no está obligada a hacer dañina para la consistencia y simplicidad de la Lo que significa la condición previa es que el
nada, como una empresa de entrega de correo estructura) no es necesaria. cliente debe garantizar la propiedadp; esto no es
que recibe un paquete que no cumple con las lo mismo que probar esta condición antes de cada
especificaciones. Esto significa que el cuerpo de la llamada. Si el contexto de la llamada implica p,
rutina no debe tener la forma mencionada entonces no hay necesidad de tal prueba. Un
anteriormente: ¿Quién debe verificar? esquema típico es

si nuevo = Vacío entonces El rechazo de la programación defensiva xs; xr


... significa que el cliente y el proveedor no son ambos
más responsables de una condición de consistencia. O donde la poscondición de s implica p.
... la condición es parte de la condición previa y debe
final ser garantizada por el cliente, o no se establece en * Suponga que muchos clientes de hecho
la condición previa y debe ser manejada por el necesitarán verificar la condición previa. Entonces
Usar tal construcción anularía el propósito de proveedor. lo que importa es el “Trato Especial”. Es el mismo
tener una condición previa (cláusula Requerir). para todas las llamadas o específico para cada
Esta es una regla absoluta: O tiene la condición ¿Cuál de estas dos soluciones se debe elegir? llamada. Si es el mismo, causando una repetición
en Require, o la tiene en una instrucción If en el No existe una regla absoluta; Son posibles varios indebida en varios clientes, esto es simplemente la
cuerpo de la rutina, pero nunca en ambos. estilos de rutinas de escritura, que van desde las señal de un diseño de interfaz de clase pobre,
"exigentes" donde la condición previa es fuerte utilizando un contrato demasiado exigente para r.
(poner la responsabilidad sobre los clientes) a las El contrato debe ser renegociado y ampliado (más
Este principio es exactamente lo contrario de la "tolerantes" donde es débil ( aumentando la carga tolerante) para incluir el Trato Especial estándar
idea de programación defensiva, ya que dirige a de la rutina). Elegir entre ellos es, hasta cierto como parte de la especificación de la rutina.
los programadores a evitar pruebas redundantes. punto, una cuestión de preferencia personal;
Tal enfoque es posible y fructífero porque el uso nuevamente, el criterio clave es maximizar la
de aserciones anima a escribir software para simplicidad general de la arquitectura. Si. sin embargo, el Tratamiento Especial es
explicar las condiciones de consistencia que diferente para varios clientes, entonces la necesidad
podrían salir mal en el tiempo de ejecución. de que cada cliente realice su propia prueba
Entonces en lugar de La experiencia con Eiffel, en par- individual para p es intrínseca y no

44 COMPUTADORA

Uso con licencia autorizado limitado a: Universidad Tecnológica de Michigan. Descargado el 21 de febrero de 2010 a las 19:03:00 EST desde IEEE Xplore. Se aplican restricciones.
Machine Translated by Google
yo

una consecuencia del método de diseño sugerido la creación de cada instancia de la clase (cada
aquí. Estas pruebas tendrían que incluirse de árbol binario en este ejemplo). Esto significa que
todos modos. cada procedimiento de creación de la clase debe
producir un objeto que satisfaga el invariante.
El último caso corresponde a la situación (Una clase puede tener uno o más procedimientos
frecuente en la que un proveedor simplemente de creación, que sirven para inicializar objetos.
carece del contexto adecuado para manejar casos
anormales. Por ejemplo, es imposible que un El procedimiento de creación que se llamará en
módulo STACK de uso general sepa qué hacer cualquier caso dado se especifica en la instrucción
cuando se le solicita extraer un elemento de una de creación.)
pila vacía. Solo el cliente , un módulo de un El invariante debe ser preservado por cada
compilador u otro sistema que usa pilas , tiene la rutina exportada de la clase (es decir, cada rutina
información necesaria. disponible para los clientes). Cualquier rutina de
este tipo debe garantizar que el invariante se
satisfaga a la salida si se cumplió a la entrada.

invariantes de clase Figura 5. La invariante en el ciclo de vida


de un objeto.
en efecto luego, el invariante se agrega a la
Las condiciones previas y posteriores de condición previa y posterior de cada rutina
rutina pueden usarse en enfoques no orientados necesario aquí; se han añadido para mayor exportada de la clase.
a objetos, aunque encajan particularmente bien claridad.) Pero el invariante caracteriza a la clase como un
con el método orientado a objetos. Los invariantes, La cláusula invariable de clase opcional todo más que a sus rutinas individuales.
el siguiente uso principal de las aserciones, son aparece al final de un texto de clase:
inconcebibles fuera del enfoque orientado a La figura 5 ilustra estos requisitos al representar
objetos. clase ÁRBOL-BINARIO [ característica q el ciclo de vida de cualquier objeto como una
Una invariante de clase es una propiedad que secuencia de transiciones entre estados
,.. Atributo y rutina
se aplica a todas las instancias de la clase, "observables". Los estados observables, que se
declaraciones ...
trascendiendo rutinas particulares. Por ejemplo, muestran como rectángulos sombreados, son los
el invariante de una clase que describe los nodos invariante estados que siguen inmediatamente a la creación
de un árbol binario podría tener la forma que se ... Como se muestra arriba ... del objeto y cualquier estado alcanzado
muestra en la Figura 4, indicando que el padre de final - TABLA de clase posteriormente después de la ejecución de una
los hijos izquierdo y derecho de un nodo, si estos rutina exportada de la clase generadora del objeto.
hijos existen, es el nodo mismo. . (El operador Dos propiedades caracterizan un invariante de El invariante es la restricción de consistencia en
Implica denota implicación. Las reglas de clase: los estados observables. (No se satisface
precedencia del operador Eiffel hacen que los necesariamente entre estos estados).
paréntesis sean El invariante debe satisfacerse después de El invariante corresponde a lo que

Sobre el lenguaje de aseveraciones

Este artículo incluye muchos ejemplos de afirmaciones típicas. con el cálculo de predicados de primer orden, la necesidad de tal
Pero, ¿qué es exactamente permisible en una afirmación? extensión no parece crucial. En Eiffel, pensado como un vehículo para
Las afirmaciones de Eiffel son expresiones booleanas, con algunas el desarrollo de software industrial en lugar de solo para la investigación,
extensiones, como la antigua notación. Dado que todo el poder de las el uso de llamadas a funciones en aserciones parece proporcionar un
expresiones booleanas está disponible, pueden incluir llamadas a compromiso aceptable entre diferentes objetivos de diseño: confiabilidad,
funciones. Debido a que se dispone de todo el poder del lenguaje para la capacidad de generar código eficiente y simplicidad general del
escribir estas funciones, las condiciones que expresan pueden ser lenguaje.
bastante sofisticadas. Por ejemplo, el invariante de una clase ACYCLIC- De hecho, el cálculo de predicados de primer orden no sería
GRAPH puede contener una cláusula de la forma necesariamente suficiente. Muchas propiedades importantes en la
práctica, como el requisito de que un gráfico no sea cíclico, requerirían
un cálculo de orden superior.
no cíclico El uso de funciones , es decir, cálculos , no está exento de peligros.
donde cyck es una función con valores booleanos que determina si un En software, una función es un caso de una rutina: prescribe ciertas
gráfico contiene ciclos mediante el uso del algoritmo de gráficos adecuado. acciones. Esto hace imperativas las funciones de software , mientras que
se dice que las funciones matemáticas son aplicativas . La principal
En algunos casos, uno podría querer usar expresiones cuantificadas diferencia es que las funciones del software pueden producir efectos
de la forma "Para todo x de tipo T, se cumple p (x) " o "Existe x de tipo 7, secundarios (cambiar el estado de la computación). La introducción de
tal que se cumple p (x) ", donde p es cierta propiedad booleana. Tales funciones en las afirmaciones permite que el zorro imperativo regrese al
expresiones no están disponibles en Eiffel. Sin embargo, es posible gallinero aplicativo.
expresar las propiedades correspondientes utilizando la misma técnica:
llamadas a funciones que se basan en bucles para emular los En la práctica, esto significa que cualquier función utilizada en asser
cuantificadores. Las prestaciones deben ser de una calidad intachable, evitando
Aunque se ha pensado en ampliar el lenguaje para incluir un cualquier alteración del estado actual y cualquier operación que pueda
lenguaje de especificación formal completo dar lugar a situaciones anómalas.

Uso con licencia autorizado limitado a: Universidad Tecnológica de Michigan. Descargado el 21 de febrero de 2010 a las 19:03:00 EST desde IEEE Xplore. Se aplican restricciones.
Machine Translated by Google

las suposiciones siguen siendo informales e


yo

put-child (nuevo: NODO) implícitas. Aquí, el mecanismo de aserción permite


-- Agregar nuevo a los hijos del nodo actual a los desarrolladores expresarlas explícitamente.
Requerir El monitoreo de afirmaciones, entonces, es una
nuevo I = Vacío
forma de llamar la atención del desarrollador
más
comparando lo que hace el software con lo que
newgarent = actual;
recuento de niños = recuento de niños anterior + 1 su autor cree que hace. Esto produce un enfoque
productivo para la depuración y prueba. y el
L Figura 6. La forma abreviada de una rutina. aseguramiento de la calidad, en el que la
búsqueda de errores no es ciega sino que se
basa en condiciones de coherencia proporcionadas
Se denominó “condiciones generales” en la rasgos heredados al mismo nivel que los por los propios desarrolladores.
discusión inicial de los contratos: leyes o ”inmediatos” (aquellos declarados en la propia Particularmente interesante aquí es el uso de
reglamentos que se aplican a todos los contratos clase). precorzditioiis en las clases de biblioteca. En el
de una determinada categoría. a menudo a través enfoque general para la construcción de software
de una cláusula de la forma "todas las disposiciones sugerido por el método Eiffel, los desarrolladores
del código XX se aplicarán a este contrato". Supervisión de afirmaciones construyen "grupos" sucesivos de clases en un
orden de abajo hacia arriba. de más general
Qué pasa si. durante la ejecución. un sistema (reutilizable) a más específico (dependiente de la
Documentación de viola una de sus propias afirmaciones? aplicación). Este es el "modelo de clúster" del
un contrato de software ciclo de vida del software".' Decidir lanzar un
En el entorno de desarrollo. la respuesta clúster de biblioteca 1 para uso general
depende de una opción de compilación . Para normalmente implica un grado razonable de
Para que la teoría del contrato funcione cada clase. puede elegir entre varios niveles de confianza en su calidad : la creencia de que no
correctamente y conduzca a sistemas correctos. supervisión de aserciones: sin comprobación de quedan errores en 1. Por lo tanto, puede ser no
los programadores de clientes deben contar con aserciones. solo condiciones previas es necesario monitorear las condiciones
una descripción adecuada de las propiedades de (predeterminado). condiciones previas y posteriores de las rutinas en las clases de 1. Pero
la interfaz de una clase y sus rutinas : la condiciones posteriores. todo lo anterior más las clases de un clúster de aplicaciones que es
contratos invariantes de clase. o todas las afirmaciones. (La un cliente de I (consulte la Figura 7) aún pueden
Aquí las afirmaciones pueden jugar un papel diferencia entre las dos últimas se deriva de la ser "jóvenes" y contener errores: dichos errores
clave. ya que ayudan a expresar el propósito de existencia de otras afirmaciones, como bucles pueden aparecer como argumentos erróneos en
un elemento de software como una rutina sin in\ariantes, que no se cubren en la presente llamadas a las rutinas de las clases de 1. El
referencia a su implementación. discusión). seguimiento de las condiciones previas de las
El comando breve del entorno Eiffel sirve para Para una clase compilada bajo la opción "sin clases de 1 ayudó a encontrarlas. Esta es una de
documentar una clase extrayendo información de monitoreo de aserción". aserciones no tienen las razones por las que la verificación de
la interfaz. En este enfoque. La documentación ningún efecto sobre la ejecución del sistema. Las condiciones previas es la opción de compilación
del software no se trata como un producto que opciones subsiguientes provocan la evaluación predeterminada.
debe desarrollarse y mantenerse por separado de aserciones en varias etapas: entrada de rutina
del código real: en cambio, es la parte más para condiciones previas, salida de rutina para
abstracta de ese código y puede extraerse con condiciones posteriores. y ambos pasos para en Introducción a la herencia
herramientas informáticas. variantes.
Bajo las opciones de monitoreo, el efecto de Una de las consecuencias de la teoría del
El comando corto conserva solo las una violación de aserción es generar una contrato es una mejor comprensión y control de
características exportadas de una clase y. para excepción. Las posibles respuestas a una la noción fundamental de herencia orientada a
una rutina exportada, descarta el cuerpo de la excepción se analizan más adelante. objetos y de las técnicas clave asociadas:
rutina y cualquier otro detalle relacionado con la redeclaración, polimorfismo y vinculación dinámica .
implementación. Sin embargo. se mantienen las
condiciones previas y posteriores . (También lo ¿Por qué monitorear?
es el comentario del encabezado, si está presente). A través de la herencia. puede definir nuevas
Por ejemplo, la Figura 6 muestra lo que produce Como se señaló, las violaciones de aserción clases combinando las anteriores.
el comando short para la rutina piit . Expresa de no son casos especiales (pero esperados); son el Una clase que hereda de otra tiene todas las
manera simple y concisa el propósito de la rutina. resultado de errores. La principal aplicación de características (rutinas y atributos) definidas en
sin referencia a una implementación particular. monitoreo de aserciones en tiempo de ejecución. esa clase, más las propias. Pero no es necesario
entonces, es de errores. Activar la verificación de conservar la forma exacta de las características
Toda la documentación sobre los detalles de aserciones (en cualquiera de los niveles heredadas: puede volver a declararlas para
las clases de Eiffel (por ejemplo, las cambiar su especificación. su implementación, o
enumerados anteriormente) hace posible detectar errores.
especificaciones de clase en el libro sobre las Al escribir software. los desarrolladores hacen ambas. Esta flexibilidad del mecanismo de
bibliotecas básicasY) se produce automáticamente muchas suposiciones acerca de las propiedades herencia es fundamental para el poder del método
de esta manera. Para las clases que heredan de que se mantendrán en varias etapas de la orientado a objetos.
otras, el comando short debe combinarse con otro ejecución del software, especialmente la entrada
tool.flat. que aplana la jerarquía de clases al incluir y el retorno de rutina. En los enfoques usuales Por ejemplo. una clase de árbol binario podría
para la construcción de software, estos proporcionar una representación predeterminada y

46 COMPUTADORA

Uso con licencia autorizado limitado a: Universidad Tecnológica de Michigan. Descargado el 21 de febrero de 2010 a las 19:03:00 EST desde IEEE Xplore. Se aplican restricciones.
Machine Translated by Google
yo

las implementaciones correspondientes para las por supuesto. Ninguna técnica de diseño es
operaciones de búsqueda e inserción. Un inmune al mal uso. Pero al menos es posible
descendiente de esa clase puede proporcionar ayudar a los diseñadores serios a utilizar la técnica
una representación que se adapte específicamente correctamente; aquí la teoría del contrato
a ciertos casos (como árboles binarios casi proporciona la perspectiva adecuada.
completos) y redeclarar las rutinas en consecuencia. Lo que significan la redeclaración y el enlace
dinámico es la capacidad de subcontratar una
yo

Tal forma de redeclaración se llama redefinición . Figura 7. Grupo de bibliotecas y grupo tarea; prevenir el uso indebido significa entonces
Supone que la rutina heredada ya tenía una de aplicaciones. garantizar que los subcontratistas cumplan las
implementación. La otra forma de redeclaración, promesas del contratista principal en el contrato
llamada efecto, se aplica a funciones para las original.
cuales la versión heredada, conocida como función flexibilidad que resulta del uso del enfoque Considere la situación descrita en la Figura 8.
diferida (o abstracta), no tenía implementación. orientado a objetos.: Sin embargo, estas técnicas A exporta una rutina r a sus clientes. (Para
pero sólo una especificación. El efecto proporciona también pueden plantear preocupaciones de simplificar, ignoramos los argumentos de r). Un
entonces una implementación (haciendo que el posible uso indebido: ¿Qué es evitar que una cliente X ejecuta una llamada
rasgo sea efectivo, lo contrario de diferido). La nueva declaración produzca un efecto incompatible
discusión subsiguiente se aplica a ambas formas con la semántica de la versión original?
de redeclaración, aunque por simplicidad se particularmente mala manera, especialmente en tu
concentra en la redefinición. el contexto de enlace dinámico? Norte
donde U se declara de tipo A. Ahora B, un

La redeclaración toma todo su poder gracias al


polimorfismo y al enlace dinámico. El polimorfismo
El problema de la concurrencia
es una adaptación de tipos controlada por la
herencia. Más concretamente, esto significa que La teoría del diseño por contrato plantea cuestiones importantes con respecto a la aplicación
si tiene b de tipo BINARY-TREE y sb de tipo de ideas orientadas a objetos a la computación concurrente. Al discutir los contratos, este artículo
SPECIAL-BINAR Y-TREE, la última clase es menciona que los clientes pueden ver la condición previa de una rutina no solo como una
descendiente de la primera, entonces la asignación obligación sino también en parte como un beneficio, ya que el contrato indica implícitamente que
una llamada que satisfaga la condición previa será atendida correctamente. Esta es la regla de
la Cláusula No Oculta. Por ejemplo, si la rutina de inserción puesta para una clase BOUNDED-
QUEUE tiene la condición previa
h := sh no lleno

está permitido, lo que permite que h se adjunte para indicar que una operación de inserción requiere una cola que no está llena, entonces
en tiempo de ejecución a instancias de SPECIAL- una llamada protegida de la forma
BINARY-TREE, de una forma más especializada
q: COLA LIMITADA [ TJ;
que la que especifica la declaración de b . Por XT;
supuesto, esto sólo es posible si la relación de ...
herencia se mantiene entre las dos clases como
si no q.full entonces
se indica.
4. Poner (4
¿Qué sucede entonces para una llamada de la final
forma
tendrá éxito, ya que el cliente que ejecuta esta llamada se ha tomado la molestia de
verificar la condición previa explícitamente.
t.insrrt (v)
En computación paralela, sin embargo, las cosas no son tan agradables. La cola limitada
en este ejemplo puede usarse como un búfer limitado, accesible para varios procesadores. El
que aplica el procedimiento de inserción, con el encargado del cliente, que llevará a cabo las instrucciones anteriores, y el encargado de q, que
argumento v, al objeto adjunto a t? llevará a cabo la ejecución de put, podrán ser encargados diferentes. Entonces, incluso si la
La vinculación dinámica significa que dicha prueba para q.full arroja falso, entre el momento en que el cliente ejecuta esta prueba y el
llamada siempre utiliza la versión adecuada del momento en que ejecuta la llamada q.put (x), pueden haber ocurrido bastantes eventos. Por
procedimiento : la original si el objeto al que se ejemplo, otro cliente puede haber llenado la cola al ejecutar su propia llamada para poner.
adjunta t es una instancia de BINARY-TREE, la
versión redefinida si es una instancia de SPECIAL-
BINARY- ÁRBOL. La política inversa, el enlace En otras palabras, puede ser necesaria una interpretación semántica diferente para las
estático (usar la declaración de h para hacer la condiciones previas en el contexto del cálculo paralelo. Esta observación sirve como punto de
elección), sería un absurdo: elegir deliberadamente partida para algunos de los trabajos actuales sobre modelos para sistemas orientados a objetos
la versión incorrecta de una operación. concurrentes.

Referencias
1. B. Meyer, “Programación orientada a objetos secuencial y concurrente”, en
La combinación de herencia, redeclaración, TOOLS 2 (Tecnología de lenguajes y sistemas orientados a objetos), Angkor/SOL,
París, junio de 1990, págs. 17-28.
polimorfismo y vinculación dinámica produce gran
parte del poder y 2. J. Potter y G. Jalloul. 'Modelos para Eiffel concurrente', en TOOLS 6 (Tecnología de
lenguajes y sistemas orientados a objetos), Prentice Hall, Englewood Cliffs, NJ, 1991,
pp. 183-1 92.
octubre de 1992

Uso con licencia autorizado limitado a: Universidad Tecnológica de Michigan. Descargado el 21 de febrero de 2010 a las 19:03:00 EST desde IEEE Xplore. Se aplican restricciones.
Machine Translated by Google

descendiente de A, redeclara r. A través del excepto que las restricciones de consistencia en un


polimorfismo, u bien puede vincularse a una instancia padre A también se aplican a las instancias de B.
de B en lugar de A. Tenga en cuenta que a menudo Por ejemplo, si la invariante de una clase ÁRBOL,
no hay forma de saber esto solo del texto de X : por 4 que describe los nodos del árbol, incluye la cláusula
ejemplo, la llamada que se acaba de mostrar podría
estar en una rutina de X que comienza con
child.parent = Actual
Figura 8. Redefinición de una rutina bajo
alguna-rutina (U: A) es ... expresando que el padre del hijo actualmente activo
contrato.
de un nodo es el propio nodo, esta cláusula se
donde el polimorfismo solo resulta de una llamada aplicará automáticamente a las instancias de una
de la forma clase BINARY-TREE, que hereda de TREE. Como
idioma. Eiffel usa una convención simple. En una resultado, la especificación del lenguaje define “la

z.alguna-rutina (v) redeclaración, no se permite utilizar las formas invariante de una clase” como la afirmación obtenida
requieren ... y aseguran ... La ausencia de una al concatenar la afirmación en la cláusula invariante

por lo que el argumento real v es de tipo B. Si esta cláusula de precondición o poscondición significa de la clase con las invariantes de todos los padres
última llamada está en una clase distinta de X, el que la versión redeclarada conserva la aserción de (obtenida recursivamente bajo esta definición).
autor de X ni siquiera sabe que u puede vincularse la versión original. Dado que esta es la situación
a una instancia de B. De hecho, es posible que ni más frecuente, el autor de la clase no está obligado

siquiera sepa sobre la existencia de una clase B. a escribir nada especial en este caso. Un autor de Como resultado, la invariante de una clase
clase que quiera adaptar la aserción usará una o siempre es más fuerte o igual que las invariantes de
Pero entonces el peligro es claro. Para ambas formas cada uno de sus padres.
determinar las propiedades de la llamada ur, el autor Estas reglas conducen a una mejor comprensión

de X solo puede mirar el contrato para r en A. Sin de por qué el enlace estático sería, como se dijo
embargo, debido a la vinculación dinámica, A puede anteriormente, un desastre.
subcontratar la ejecución de r a B, y es el contrato requerir más Asumir de nuevo la declaración y llamar
de B el que sera aplicado. nuevo
tu: un:
asegurate entonces
¿Cómo evitas “engañar” a X en el proceso? Hay ,..
nuevogost
dos formas en que B podría violar las promesas de tu
su contratista principal: que producen lo siguiente como nueva condición
previa y condición posterior: donde un descendiente B de A redefine r.

B podría hacer que las condiciones previas Llame a rA y rB las dos implementaciones.
sean más estrictas, aumentando el riesgo de que newgre o bien originalgrecondition Entonces r, debe conservar INV,, la invariante de
algunas llamadas que son correctas desde el punto A, y r, debe conservar INV,, la invariante de B, que
newgost y luego
de vista de X (que satisfacen las obligaciones es más fuerte o igual que INV,.
originalgost condition
originales del cliente) no se manejen correctamente.
B podría debilitar la poscondición, dando un donde Or Else y And Then son las versiones no Por supuesto, no hay ningún requisito de que r4
resultado menos favorable que el prometido a X. conmutativas de los operadores "o" y "y" (evaluando conserve INV,. De hecho, la clase A puede haber
su segundo argumento solo si es necesario). De sido escrita mucho antes que la B, y el autor de A
este modo. se garantiza que la nueva condición no necesita saber nada acerca de los descendientes

Nada de esto, entonces, está permitido. Pero los previa será más débil o igual que las originales, y se eventuales de esta clase.
cambios inversos son, por supuesto, legítimos. Una garantiza que la nueva condición posterior será más
nueva declaración puede debilitar la condición previa fuerte o igual que las originales. Si LL se adjunta dinámicamente a una instancia
del original o puede fortalecer la condición posterior. de B, el enlace dinámico requiere la ejecución de rH
Los cambios de cualquier tipo significan que el para esta llamada.
subcontratista hace un mejor trabajo que el La unión estática desencadenaría r,. Dado que esta
contratista original , lo cual no hay motivo para versión de la rutina no se requiere para preservar
prohibirlo. Invariantes y INV, el resultado produciría una situación catastrófica:

Estas reglas iluminan algunas de las propiedades


enlace dinámico un objeto de tipo B que no satisface la restricción de
consistencia -el invariante- de su propia clase. En
fundamentales de la herencia, la redeclaración, el tales casos, cualquier intento de comprender los
polimorfismo y el enlace dinámico. Redeclaración. Además de las reglas sobre precondiciones y textos del software o razonar sobre su comportamiento
por todo el poder que aporta al desarrollo de poscondiciones, otra restricción vincula las en tiempo de ejecución se vuelve inútil.
software. no es una manera de convertir una rutina afirmaciones con la herencia: las invariantes siempre
en algo completamente diferente. La nueva versión se transmiten a los descendientes.
debe seguir siendo compatible con la especificación Un ejemplo sencillo hará que la situación sea
original. aunque puede mejorarlo. Las reglas Este es un resultado directo de la opinión de que más concreta. Supongamos una CUENTA de clase

anotadas expresan esto con precisión. la herencia es (entre otras cosas) clasificación. Si que describa cuentas bancarias, con los atributos
queremos considerar cada instancia de una clase B que se muestran en la Figura Ya y un procedimiento
como una instancia de los ancestros de R , debemos para registrar un nuevo depósito que se muestra en
Estas reglas deben ser aplicadas por el ac la Figura 9b.

48 COMPUTADORA

Uso con licencia autorizado limitado a: Universidad Tecnológica de Michigan. Descargado el 21 de febrero de 2010 a las 19:03:00 EST desde IEEE Xplore. Se aplican restricciones.
Machine Translated by Google

En algunos ejemplos, uno puede criticar


Con esta versión de la clase, obtener
el diseño del mecanismo de excepción
el saldo actual de una cuenta requiere un
cálculo expresado por una función. La en sí mismo por no alentar, o incluso
figura 10 muestra cómo podría aparecer definir , una disciplina adecuada para
la función de saldo , asumiendo la manejar las anomalías.
casos malos.
función apropiada en la clase TRANSA depósito de registro ~
CTION-LIST. La teoría del contrato proporciona un
buen punto de partida para una solución
En una clase descendiente AC más racional. Si una rutina se ve no solo

COUNTI, puede ser una mejor como una "pieza de código" sino como la
compensación de espacio-tiempo implementación de una determinada
almacenar el saldo actual con cada objeto Figura 9. Características de una clase de Cuenta Bancaria. especificación , el contrato , es posible
de cuenta. Esto se puede lograr definir una noción de falla. La falla ocurre
redefiniendo la función balance en un cuando la ejecución de una rutina no
puede cumplir con el contrato de la rutina.
atributo (un proceso que de hecho es
Las posibles razones de una falla incluyen
compatible con el lenguaje). Naturalmente,
un mal funcionamiento del hardware, un
este atributo debe ser consistente con los
demás; esto se expresa mediante el error en la implementación o algún evento

invariante de CUENTA1, que se muestra externo inesperado.


en la Figura 11.

Sin embargo, para que esto funcione, “Fracaso” es aquí el concepto básico.

B debe redefinir cualquier rutina de A que i “Excepción” es una noción derivada. Una
modifique depósitos o retiros; la versión Me imagino. Cálculo del saldo. excepción ocurre cuando cierta estrategia
redefinida también debe modificar el para cumplir con el contrato de una rutina
campo de saldo del objeto en no ha tenido éxito. Esto no es un fracaso,
al menos no todavía, porque la rutina
consecuencia, para mantener el invariante.
puede tener una estrategia alternativa.
Es el caso, por ejemplo, del procedimiento
registro-depósito.
Ahora supongamos que tenemos el Figura 11. Invariante de la clase Cuenta. El ejemplo más obvio de excepción es
declaración y convocatoria el fallo de una rutina llamada: la estrategia
de r para cumplir -_ suacontrato una
implicaba
llamada
s; la llamada
a: CUENTA no logra definir con precisión qué es un caso falló; claramente, esta es una excepción para r.
... anormal. Entonces, el manejo de excepciones a
a.registro-depósito (1 -000-000) menudo se convierte en una especie de mecanismo Otro ejemplo, mencionado anteriormente, es una
generalizado de "ir a" entre rutinas, sin pautas violación de aserción en tiempo de ejecución, si se
Si en una determinada ejecución, se adjunta a claras para el uso adecuado. supervisan las aserciones. También es conveniente

un objeto de tipo AC COUNT1 en el momento de Para comprender mejor el problema, realicé un tratar como excepciones las señales enviadas por
la llamada, el enlace estático significaría aplicar la estudio (reportado en otro lugar) de los libros de el sistema operativo o el hardware: desbordamiento
versión original de ACCOUNT de record -deposit, texto de Ada y CLU , en busca de ejemplos de aritmético, agotamiento de memoria, etc. De hecho,
que no actualiza el campo de saldo . El resultado manejo de excepciones y principios metodológicos. corresponden a fallas en las llamadas a las
sería un objeto ACCOUNT1 inconsistente y un Los resultados fueron decepcionantes, ya que los instalaciones básicas (operaciones aritméticas,
desastre seguro. libros mostraban muchos ejemplos de activación asignación de memoria).
de excepciones pero pocos de cómo manejarlas .
Además, algunos de estos últimos eran Equipados con esta noción de falla y excepción,
espeluznantes. Por ejemplo, un libro de texto podemos definir una respuesta coherente a una
propuso un ejemplo de una rutina de raíz cuadrada excepción. La excepción ocurre porque la estrategia
Lidiando con que, cuando se confronta con un argumento utilizada para lograr el contrato de la rutina no
situaciones anormales negativo, desencadena una excepción. El funcionó. Solo tres respuestas posibles tienen
controlador de excepciones imprime un mensaje y sentido:
luego simplemente regresa a la persona que llama
La teoría del Diseño por Contrato tiene una sin notificarle que ha ocurrido algo incorrecto ,
aplicación más inmediata a la práctica del desarrollo engañando a la persona que llama, por así decirlo, (1) Quizás haya una estrategia alternativa
de software confiable: el manejo de excepciones. haciéndole creer que todo va según lo planeado. disponible. Hemos perdido una batalla, pero no
Dado que un uso típico de las raíces cuadradas en hemos perdido la guerra. En este caso, la rutina

Las excepciones -casos anormales- han sido un programa típico de Ada es el cálculo de la debería devolver los objetos a un estado coherente
objeto de mucho estudio: y varios lenguajes de trayectoria de un misil, es fácil ver las consecuencias y hacer otro intento, utilizando la nueva estrategia.
programación, en particular Ada, PLII y CLU, probables. Esto se llama reanudación.
ofrecen mecanismos de manejo de excepciones.
Gran parte de este trabajo es decepcionante, sin (2) Quizás, sin embargo, hemos perdido la
embargo, porque Más allá del mal gusto de tal individuo guerra por completo. No hay nueva estrategia

octubre de 1992 49

Uso con licencia autorizado limitado a: Universidad Tecnológica de Michigan. Descargado el 21 de febrero de 2010 a las 19:03:00 EST desde IEEE Xplore. Se aplican restricciones.
Machine Translated by Google

el usuario de nuevo. La figura 12 muestra una solución


get-integerfrom-user: INTEGER es ción
-- Leer un número entero (permitir al usuario hasta cinco intentos) Las primeras cinco veces el interactivo
el usuario ingresa una entrada incorrecta, la rutina
fallas
comienza de nuevo, gracias al Reintento. Esta es la
locales : ENTERO
hacer
implementación directa de la reanudación.

Resultado := getint
movimiento rápido del ojo Los fallos de entidad local sirven para registrar el
número de llamadas fallidas a getint. Como cualquier
fallas :=fallas + 1; entidad local entera, se inicializa automáticamente a
cero en una llamada de rutina . (La definición del
si fallas < 5 entonces lenguaje Eiffel especifica valores de inicialización
mensaje ("La entrada debe ser un número entero. Ingrese de simples para cada tipo posible).
nuevo: "); rever
final
En este ejemplo, solo es posible un tipo de
excepción. En algunos casos, la cláusula de rescate
end -- getintegerfrom-user
podría necesitar discriminar entre posibles tipos de
excepciones y manejarlas de manera diferente. Esto
Figura 12. Lectura de un entero con una primitiva insegura. es posible gracias a las características simples de la
clase EX CEPTIONS de la biblioteca del núcleo,
aunque no es necesario mirar los detalles (sencillos)
disponible. Luego, la rutina debería volver a poner Para especificar cómo debe ser una rutina aquí. Esta clase también proporciona mecanismos
los objetos en un estado consistente, renunciar al después de una excepción, el autor de una rutina para manejar el caso de falsa alarma al especificar
contrato e informar la falla a la persona que llama. Eiffel puede incluir una cláusula de "rescate", que que para ciertas señales se puede permitir que se
Esto se llama pánico organizado. expresa el comportamiento alternativo de la rutina (y reanude la ejecución.
es similar a las cláusulas que ocurren en los contratos
(3) Un tercer caso raro pero posible es la falsa humanos, para permitir por circunstancias

alarma. Esto puede ocurrir solo para el sistema excepcionales no planificadas). Cuando una rutina ¿Qué sucede después de cinco fallas sucesivas
operativo o las señales de hardware. incluye una cláusula de rescate, cualquier excepción de getint? La cláusula de rescate finaliza sin ejecutar
En algunos sistemas de ventanas múltiples, por que ocurra durante la ejecución de la rutina interrumpe un Reintento y la ejecución de la rutina falla (pánico
ejemplo, un proceso recibe una señal (que el tiempo la ejecución del cuerpo (la cláusula Do ) y comienza organizado). La regla clave en este caso es que la
de ejecución transforma en una excepción) cuando la ejecución de la cláusula de rescate. persona que llama a get-integer obtendrá una
se cambia el tamaño de su ventana. excepción, que tendrá que manejar usando la misma
En la mayoría de los casos, el proceso debería poder política, eligiendo entre pánico organizado,
continuar con su ejecución, posiblemente después La cláusula contiene cero o más instrucciones, una reanudación y falsa alarma.
de realizar algunas acciones correctivas (como de las cuales puede ser un Reintento.
registrar las nuevas dimensiones de la ventana para La ejecución termina en cualquiera de
que las utilicen los editores y otras herramientas). dos caminos: En un sistema típico, solo un puñado de rutinas
tiene una cláusula de rescate explícita.
Si la cláusula de rescate finaliza sin ejecutar ¿Qué pasa si ocurre una excepción durante la
La descripción tanto de la reanudación como del un Reintento, la rutina falla. ejecución de una rutina que no tiene tal
pánico organizado menciona volver a colocar los Informa de la falla a la persona que llama activando ¿cláusula? La regla es simple: una cláusula ausente
objetos “en un estado consistente”. una nueva excepción. Este es el caso del pánico se considera equivalente a una cláusula implícita de
Esto es esencial si las ejecuciones posteriores organizado. la forma
(después de una eventual reanudación) volverán a Si la cláusula de rescate ejecuta un Re
utilizar los objetos. La noción de estado consistente try, el cuerpo de la rutina ( cláusula Do) se ejecuta rescate

debe quedar clara a partir de la discusión anterior: de nuevo. rescate por defecto
cualquier manejo de excepción, ya sea para la
reanudación o para el pánico organizado, debe Como ejemplo, aquí hay una solución a un donde default-rescue es un procedimiento de
restaurar la invariante. problema que se encuentra en muchos libros de texto propósito general que, en su forma básica, no hace
de Ada: usando una función getint, que lee un número nada. Luego, una excepción simplemente inicia la
entero, solicita al usuario que ingrese un valor entero; cláusula de rescate, que, al ejecutar el rescate
si la entrada no es un número entero, vuelva a predeterminado vacío , provoca el fallo de la rutina;
Un mecanismo preguntar, a menos que el usuario no pueda esto desencadena la cláusula de rescate, explícita o
disciplinado de manejo proporcionar un número entero después de cinco implícita. Si las excepciones se pasan de esta manera
intentos, en cuyo caso se produce un error. Se
de excepciones hasta el "objeto raíz" que inició la ejecución, esa
supone que getint es una rutina externa, tal vez ejecución se detiene después de imprimir una tabla
escrita en C o en lenguaje ensamblador, y no tenemos de historial de excepciones que documenta claramente
No es difícil idear un mecanismo de excepción control sobre ella. Activa una excepción cuando se la secuencia de eventos anormales registrados.
que apoye directamente el método anterior para aplica a una entrada que no es un número entero; la
manejar casos anormales. rutina debe detectar esa excepción y solicitar
Pero claro, alguna rutina en la llamada

50 COMPUTADORA

Uso con licencia autorizado limitado a: Universidad Tecnológica de Michigan. Descargado el 21 de febrero de 2010 a las 19:03:00 EST desde IEEE Xplore. Se aplican restricciones.
Machine Translated by Google
yo

4. Coche Hoare. "Una base axiomática para la


cadena puede tener una cláusula de rescate.
programación de computadoras", Comm. ACM, vol.
incluso uno que contenga un reintento que
Estado de Eiffel 12. NO. 10 de octubre de 1969, págs. 576-580. 583.
intentará una reanudación.
¿Por qué definir el comportamiento La definición de la lan Eiffel
predeterminado como una llamada a rlefuulr- 5. EW Dijkstra. Una disciplina de programación.
El lenguaje, utilizado como
Prcnticc Hall, Englewood Cliffs, Nueva Jersey. 1976.
rescite en lugar de simplemente como una vehículo para este artículo, es
cláusula de rescate vacía? La razón proviene de de dominio público. La evolución
la discusión metodológica. En el caso de pánico del lenguaje está bajo el control 6. JA Cogüen. JW Thatcher y EG
organizado. es esencial restaurar la invariante de una organización de usuarios Wagner. “Un enfoque de álgebra inicial para la
especificación, corrección. and Im plementation of
antes de reconocer la derrota y rendirse. Una y desarrolladores de la tecnología
Abstract Data Types”, en Cirrrenr Trends in
acción nula no lograría esto para una clase con Eiffel: el Nonprofit International
Programming Meth OdO/ Og?;. vol. 3. RT Sí. ed..
un invariante no trivial. Consortium for Eiffel (NICE). La Prentice Hall. Englewood Cliffs, NJ, 1978. págs.
La solución la proporcionan una vez más las membresía en NICE está abierta a 80-149.
fuerzas fusionadas de la herencia y las cualquier organización interesada.
afirmaciones. Procedimiento predeterminado La dirección es PO BOX 6884, Santa Bárbara, CA 93160.
7. JV Cuttag. "Tipos de datos abstractos y el desarrollo
-rescue . en su forma nula predeterminada . de estructuras de datos".
aparece como un procedimiento de la clase de Com. AC'M, vol. 20. No. 6. Junio de 1977, págs.
propósito general ANY. Esta clase de biblioteca, 396-404.
tal como la definen las reglas del lenguaje, es
la poscondición). También es parte del contrato
8. B. Meyer. “La Description des Struc
automáticamente un ancestro de todas las
tures de DonnCes,” Bulletin de la Direc
posibles clases definidas por el desarrollador. del cocinero. aunque quizás uno implícito. para tion des Etudes et Recherches
Por lo tanto, es responsabilidad de los evitar prender fuego al restaurante en el proceso d'Electricite de France. SCrie C
diseñadores de una clase C si están preocupados (para mantener lo invariable). (Informática). N° 2, París, 1976.
por las posibles excepciones que ocurren en las
9. B. Meyer. Eifjelc Las Bibliotecas. Prentice Hall.
rutinas que no tienen cláusulas de rescate Cuando se pide ayuda al bombero, por el
Englewood Cliffs, NJ, (aparecerá en 1993).
específicas. para redefinir defuiill-rescue para contrario. no se garantiza el estado del
que asegure la clase invariante de C. restaurante. Puede estar ardiendo o (en el caso
A menudo, uno de los procedimientos de de una alerta incorrecta) no ardiendo. Pero IO. B. Meycr. "La nueva cultura del desarrollo de
software". HERRAMIENTAS I (Tecnología de
creación puede servir como una redefinición de t/ entonces, el único deber del bombero es devolver
Lenguajes y Sistemas Orientados a Objetos). SOL.
efirirltp resew. ya que también se requieren el restaurante a un estado que no se queme . París, noviembre de 1989, págs. 13-23.
Servir comidas a los clientes reunidos no es
procedimientos de creación para asegurar la invariante. Versión ligeramente revisada en Avances en
Esto ilumina la diferencia entre el cuerpo (la parte de la descripción del trabajo del bombero. ingeniería de software orientada a objetos
W (referencia de escena 3).
cláusula Do ) y la cláusula de rescate:

El órgano debe ejecutar el contrato, o


garantizar la poscondición. Por consistencia,
también debe cumplir con la ley general del país :
Expresiones de gratitud
preservar lo invariable. Su trabajo se facilita un
He sido muy influenciado por los creadores del
poco por la suposición de que el invariante se trabajo clásico sobre el desarrollo sistemático de
mantendrá inicialmente, lo que garantiza que la software, mencionado en la barra lateral "Otras fuentes".
rutina encontrará el objeto en un estado Con su minuciosidad habitual . Kim Walden leyó el texto

consistente. y señaló errores y posibles mejoras. Los árbitros


anónimos hicieron varios comentarios útiles.
Por el contrario, la cláusula de salvamento
no puede hacer tal supuesto: no tiene condición Bertrand Meyer es presidente de Interactive Software
previa, ya que una excepción puede ocurrir en Eiffel i, una marca comercial del Nonprofit Engineering Inc. y Societe des Outils du Logiciel, París.
International Consortium for Eiffel. Sus áreas de interés incluyen especificación formal,
cualquier momento. Su recompensa es una tarea
métodos de diseño, lenguajes de programación, sistemas
menos exigente. Todo lo que se requiere hacer
interactivos , entornos de desarrollo de software y
al salir es restaurar el invariante.
diversos aspectos de la tecnología orientada a objetos.
Asegurar la poscondición -el contrato- no es su
trabajo. Referencias
Meyer tiene una licenciatura en ingeniería de la Ecole
Polytechnique, una maestría de la Universidad de
IB Meyer, Erffel : The Lattgziagc .. Prentice Hall.
Stanford y un doctorado de la Universidad de Nancy. Es
Acantilados de Englewood. NUEVA JERSEY. 1991.

A
Una analogía útil es el contraste entre autor de varios libros y artículos técnicos, editor de la
la grandeza y la servidumbre de dos Serie Orientada a Objetos de Prentice Hall y presidente
2. B. Meyer. Ohjrcl-OrietitrtlSoiftware Con stnicrioti.
profesiones igualmente respetables : de la serie de conferencias TOOLS (Tecnología de
Prentice Hall. Acantilados de Englewood.
Lenguajes y Sistemas Orientados a Objetos).
cocinero y bombero. Un cocinero puede suponer NUEVA JERSEY. 1988.

que el restaurante no se está quemando


(satisface el invariante) cuando comienza la 3. B. Meycr. “Diseño por Contrato.“ en Avances en
Ingeniería de Software Orientada a Objetos , D.
jornada laboral. Si el restaurante es de hecho Se puede contactar al autor en Interactive Software
Mandrioli y B. Meyer. eds.. Prentice Hall,
nonburning. el cocinero debe preparar las EnglewoodCliffs, Nueva Jersey. 1991 , págs. 1-50, Engineering, 270 Storke Rd., Suite 7. Goleta, CA 93117.
comidas (asegúrese

octubre de 1992 51

Uso con licencia autorizado limitado a: Universidad Tecnológica de Michigan. Descargado el 21 de febrero de 2010 a las 19:03:00 EST desde IEEE Xplore. Se aplican restricciones.

También podría gustarte