Documentos de Académico
Documentos de Profesional
Documentos de Cultura
yo
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:
..
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.
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
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
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
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
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
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.
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
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
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
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:
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
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
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
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
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.
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.