Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ingenieria Del Software - Benet Campderrich Falgueras PDF
Ingenieria Del Software - Benet Campderrich Falgueras PDF
del software
Ingeniería
del software
Benet Campderrich Falgueras
Primera edición: abril 2003
Ninguna parte de esta publicación, incluido el diseño general y la cubierta, puede ser copiada,
reproducida, almacenada o transmitida de ninguna forma, ni por ningún medio,sea éste eléctrico,
químico, mecánico, óptico, grabación, fotocopia, o cualquier otro, sin la previa autorización escrita
de los titulares del copyright.
Autor
Benet Campderrich Falgueras
Doctor en Ingeniería Industrial. Especializado en ingeniería del software y bases de datos.
Profesor titular de la Universidad Rovira i Virgili.
© Editorial UOC 7 Índice
Índice
Presentación ................................................................................................... 13
Conclusiones ................................................................................................... 35
Conclusiones ................................................................................................... 69
1. El diagrama de estados.............................................................................. 71
1.1. Conceptos básicos ............................................................................... 72
1.2. Notaciones básicas............................................................................... 74
1.3. Transiciones complejas ....................................................................... 78
1.4. Estados compuestos............................................................................. 79
1.5. Notación ampliada del estado............................................................. 82
2. El diagrama de casos de uso ..................................................................... 83
2.1. Actores ................................................................................................. 83
2.2. Concepto de caso de uso ..................................................................... 85
2.3. Relaciones entre casos de uso.............................................................. 86
2.4. Notación .............................................................................................. 87
3. Los diagramas de interacción................................................................... 88
3.1. Interacciones y colaboraciones ........................................................... 88
3.2. El diagrama de colaboración ............................................................... 93
3.3. El diagrama de secuencias ................................................................... 95
4. El diagrama de actividades....................................................................... 99
4.1. Elementos específicos .......................................................................... 99
5. Los diagramas de implementación ........................................................ 102
5.1. El diagrama de componentes ............................................................ 102
5.2. El diagrama de despliegue ................................................................. 105
Bibliografía.................................................................................................... 312
Presentación
La ingeniería del software comprende los métodos y las técnicas que se utili-
zan en el desarrollo profesional del software. Se trata de un campo muy amplio,
del cual esta materia sólo trata una parte.
La ingeniería del software consta principalmente de dos familias de técnicas:
Capítulo I
Por ejemplo...
… los bancos, las industrias de fabricación en serie, las empresas de comercio electró-
nico, etc. actualmente no podrían funcionar sin software.
Otras características del software son, como señala Pressman, que no se estro-
pea por el uso ni por el paso del tiempo. Si finalmente se tiene que sustituir es
porque se ha quedado tecnológicamente anticuado o inadaptado a nuevas ne-
cesidades o porque ha llegado a resultar demasiado caro mantenerlo.
plenamente comparables con los de otras tecnologías más antiguas. Todo esto,
combinado con un aumento realmente espectacular de la demanda de software,
ha provocado lo que se ha denominado la crisis del software.
En cuanto a la calidad, la causa principal de dificultades es la gran complejidad
del software comparado con otros tipos de productos, que provoca, por ejemplo,
que no sea posible, ni mucho menos, probar el funcionamento de un software en
todas las combinaciones de condiciones que se pueden dar. Y eso ocurre en una
época en la que se da cada vez más importancia a la calidad en todos los ámbitos,
al considerarla un factor de competitividad dentro de unos mercados cada vez
más saturados y, por tanto, más exigentes. No es extraño, pues, que el tema de la
calidad (y dentro de éste, cuestiones como la garantía de calidad y las certificacio-
nes oficiales de calidad) adquiera una importancia creciente dentro de la ingenie-
ría del software.
Por lo que respecta a la productividad, cabe decir para empezar que cual-
quier fabricación en serie tiene necesariamente una productividad mucho más
elevada que la fabricación de un producto singular; pero, incluso, si la compa-
ramos con otras ingenierías de producto singular, la productividad es clara-
mente inferior. La complejidad del producto también puede ser una causa de
este hecho, pero ciertamente no es la única. Un factor que tiene un peso real-
mente importante en la baja productividad es el hecho de que, a diferencia de
las otras tecnologías, en un proyecto de software el desarrollo empieza tradicio-
nalmente de cero (sólo recientemente se utilizan fragmentos de software “pre-
fabricados”).
Por tanto, no es extraño que uno de los grandes retos, por el momento, de
la ingeniería del software sea conseguir desarrollar fragmentos de software (de-
© Editorial UOC 19 Capítulo I. Introducción a la...
nominados componentes) que sean reutilizables, por un lado, y, por el otro, de-
sarrollar software y reutilizar sus fragmentos (que seguramente estarán mejor
probados que si se hicieran de nuevo, lo cual además mejoraría la calidad del
software producido).
Una de las vías mediante las cuales se pretende conseguir una cierta reuti-
lización en el desarrollo orientado a objetos es especialmente con compo-
nentes; otras son los patrones de diseño (reutilización, si no de fragmentos
de software, por lo menos de ideas o “recetas” para hacerlos) y los marcos o
frameworks, que son estructuras formadas por sistemas de software a los cuales se
pueden acoplar otros sistemas de software, sustituibles, para hacer funciones
concretas.
La figura siguiente nos muestra las etapas previstas en una cierta versión del
ciclo de vida clásico.
2.1.1. Etapas
En cualquier caso, tenemos que contar con el hecho de que, una vez termina-
da oficialmente la etapa de análisis y comenzada la de diseño, todavía surgirán re-
quisitos nuevos y cambios en los ya existentes.
¿Qué se puede hacer, entonces? Parece que la opción más razonable sea es-
tudiar a fondo una pequeña parte de los requisitos que tenga una cierta autono-
mía, y diseñarla, programarla y probarla, y una vez que el cliente la haya dado
por buena, hacer lo mismo con otra parte, y otra. Si partimos de un software ya
construido en parte, se puede esperar que la idea que nos hacemos de los requi-
sitos restantes pueda ser cada vez más precisa y que también obtengamos una
estimación cada vez más segura del coste y de la duración del proyecto comple-
to; esto es lo que denominamos ciclo de vida iterativo e incremental (iterativo por-
© Editorial UOC 25 Capítulo I. Introducción a la...
Los inconvenientes del modelo del ciclo de vida clásico mencionados en este subapar-
tado no quieren decir que no pueda haber plazo o límite de coste para un proyecto de
desarrollo de software; simplemente, se debe reconocer que no es realista creer que se
pueda fijar de forma exacta la funcionalidad, el coste y la duración del proyecto, todo
a la vez. Si el software tiene que funcionar en una fecha determinada y no se puede au-
mentar el gasto en personal, será necesario estar dispuesto a aceptar que el software no
realice todas las funciones deseadas; si la funcionalidad y la fecha de entrega del pro-
grama son innegociables, se tendrá que aumentar el número de programadores o ana-
listas. Y esto no supone ninguna renuncia en relación con los resultados que se
alcanzaban hasta ahora, porque en la práctica muy pocos eran los proyectos en los que
no se producían desviaciones en cuanto a la funcionalidad, presupuesto o plazo, sino
en varias de estas cosas al mismo tiempo.
Por tanto, el modelo de ciclo de vida en cascada puede ser válido si se aplica de
manera que cada etapa, del análisis de requisitos a la prueba, no prevea todo el
conjunto del software, sino sólo una parte cada vez; entonces tendríamos un ciclo
de vida iterativo e incremental basado en el ciclo de vida en cascada.
ta las indicaciones de los usuarios y se les enseña otra vez. En el momento en que
el prototipo ha permitido concretar y confirmar los requisitos, se puede comen-
zar un desarrollo según el ciclo de vida en cascada, en este caso, no obstante, par-
tiendo de una base mucho más sólida.
1) Inicio
Se establece la justificación económica del software y se delimita el alcance del
proyecto.
2) Elaboración
Se estudia el dominio del problema, o simplemente dominio (parte de la ac-
tividad de la empresa dentro de la cual se utilizará el software) y se tienen en
cuenta muchas de las necesidades de información y eventuales requisitos no
funcionales y restricciones, se establece la arquitectura general del software y se
realiza una planificación del proyecto.
3) Construcción
Se desarrolla todo el producto de forma iterativa e incremental, se tienen en
cuenta todas las necesidades de información que debe satisfacer y se desarrolla
la arquitectura obtenida en la fase anterior.
4) Transición
Comprende la entrega del producto al cliente y el comienzo de su utiliza-
ción; aunque es posible que sea necesario hacer retoques en el software y añadir
nuevas funciones como consecuencia de errores detectados o de requisitos que
se habían pasado por alto hasta el momento.
En cada una de estas fases se llevan a cabo (en diferentes proporciones) los
siguientes componentes de proceso:
Las técnicas más usadas en los métodos estructurados son seguramente los diagramas
de entidad-relación y de flujo de datos, con sus variantes. Los primeros se refieren a
los datos y los segundos, a los procesos.
Si bien los métodos estructurados continúan siendo muy utilizados, los de-
nominados métodos orientados a objetos ganan terreno rápidamente.
Si los métodos estructurados de desarrollo de software tienen su origen en la pro-
gramación estructurada, los métodos orientados a objetos tienen sus raíces en la
programación orientada a objetos.
Es lógico que haya sucedido así en los dos casos: una nueva técnica de pro-
gramar exige una nueva manera de diseñar los programas adaptada a las carac-
© Editorial UOC 29 Capítulo I. Introducción a la...
• Parece que permite –por primera vez en la historia de la tecnología del soft-
ware– la reutilización de software en un grado significativo, en forma de cla-
ses implementadas, lo cual podría significar una vía para solucionar, aunque
sólo sea en parte, los problemas de productividad y calidad descritos en apar-
tados anteriores.
• Su relativa simplicidad facilita el desarrollo de herramientas informáticas de
ayuda al desarrollo; este factor podría ser potenciado por el hecho de que en
© Editorial UOC 30 Ingeniería del software
estos últimos años ha aparecido una notación orientada a objetos muy am-
pliamente aceptada, el UML.
A veces se distingue entre herramientas UpperCASE, que son las de análisis y diseño, y
LowerCASE, que se usan durante la programación y la prueba.
Es conveniente que las herramientas que dan apoyo a diferentes técnicas utilizadas
dentro del mismo método estén integradas, en el sentido de que si hay un tipo de ele-
mento que es común a dos técnicas, sea compartido por las dos herramientas respec-
tivas, de manera que sólo sea necesario describirlo una vez y que todos los cambios
que se realicen después en esta descripción lleguen a las dos.
sarrollo de software que, tal como hemos visto, la tecnología orientada a objetos
tiene que fomentar.
5. El OMG y el UML
Además del UML, otro estándar que ha elaborado el OMG es CORBA, sobre objetos dis-
tribuidos, cuyas implementaciones tienen una expansión rápida.
Los primeros pasos hacia el modelo unificado se dieron en el año 1994, cuando Booch
y Rumbaugh, trabajando en Rational Software Corporation, comenzaron la unificación
de los modelos respectivos, y en octubre de 1995 se publicó la versión provisional 0.8
del entonces denominado Unified Method.
lo que se ha conseguido es que haya unos diagramas que todos los desarrollado-
res de software orientado a objetos entenderán y harán de la misma manera, lo
cual supone un adelanto realmente importante con respecto a la situación an-
terior en la que cada método tenía su notación gráfica; pero, incluso así, conti-
núa siendo posible que existan métodos diferentes que utilicen el UML y que,
por ejemplo, se valgan de los mismos diagramas en orden diferente o dentro de
modelos de ciclo de vida distintos.
© Editorial UOC 35 Capítulo I. Introducción a la...
Conclusiones
Capítulo II
En este capítulo veremos el modelo estático, que consta, por una parte, de clases
y objetos, y por la otra, de relaciones de diferentes tipos entre clases y entre objetos.
En capítulos posteriores trataremos el resto de los modelos y la utilización
del UML en el análisis y en el diseño.
El modelo estático del UML es aquél en el que se describen las clases y los
objetos. Se denomina estático porque muestra todas las relaciones posibles a lo
largo del tiempo, no las que son válidas en un cierto momento.
© Editorial UOC 38 Ingeniería del software
Un diagrama estático nos puede mostrar que cada profesor tiene, al menos, una asigna-
tura, y que cada asignatura tiene, al menos, un profesor, pero no nos dice qué asig-
naturas tiene un profesor concreto.
• Diagrama de clases, que puede contener clases y objetos y relaciones entre és-
tos, y que se hace siempre.
• Diagrama de objetos, que sólo contiene objetos y relaciones entre éstos, y que
es opcional, ya que se utiliza principalmente para realizar ejemplos del diagra-
ma de clases con objetos concretos de las mismas.
El modelo estático se utiliza en todas las etapas del ciclo de vida; en las diferentes etapas
se documentan diferentes tipos de objetos. En el análisis se consideran objetos del mun-
do del usuario (por ejemplo, artículos, facturas, clientes, etc.) y en el diseño, en cambio,
se consideran objetos de la tecnología informática: pantallas, gestores de disco, etc.
2. Clasificadores
Estereotipo
Un estereotipo de un elemento del UML es una variante más restrictiva de dicho ele-
mento; hay estereotipos que forman parte del UML, y también se pueden encontrar
estereotipos definidos referidos al diagrama, que son un instrumento para extender
el UML, pero así se pierde portabilidad.
3. Paquetes
Un paquete o package es sólo una “caja” que contiene elementos, como cla-
sificadores, objetos u otros paquetes, así como otras entidades que veremos más
adelante, como los casos de uso.
Paquetes en JAVA
Por la definición que ofrecemos de paquete, podemos ver que el concepto de paquete
en el UML es diferente –y más amplio– que en Java.
© Editorial UOC 41 Capítulo II. UML (I): el modelo estático
Todas las aplicaciones deben tener, por lo menos, un paquete que normal-
mente se denomina raíz. Cada elemento de un paquete tiene visibilidad, es decir,
puede ser reconocido o bien desde todos los otros paquetes, o bien sólo desde al-
gunos.
Ejemplo de paquetes
En la primera, se pueden incluir dentro del símbolo del paquete los símbolos de los
elementos que contiene; la segunda, simplificada, es más adecuada para representar
referencias al paquete (desde otros paquetes, por ejemplo).
Ejemplo
• De acceso. No sólo se reconocen los nombres de los elementos, sino que, ade-
más, se pueden utilizar.
El nombre de clases
Los nombres de las clases tienen que estar bien pensados. La posibilidad de reuti-
lización depende en gran medida de ello, porque cuando queramos reutilizar una
clase de una librería que tenga centenares de nombres, la única pista que tendre-
mos es el nombre, y si no se le dio un nombre adecuado, será muy difícil de en-
contrar.
Un atributo de clase es lo mismo que un atributo static de Java y una variable de clase de
Smalltalk y C++.
visibilidad nombre ‘:’ expresión-de-tipo ?=’ valor-inicial ‘{’ property string ‘}’
• Público: “+”
• Protegido: “#”
• Privado: “-”
• Dentro del paquete: “ ”
También tienen visibilidad otros elementos del modelo estático, como las
operaciones y los extremos de asociación.
*. Atributo de clase. Un atributo de clase es lo mismo que un atributo static de Java y una variable
de clase de Smalltalk y C++.
**. La visibilidad. En el UML no hay definiciones del significado de estas opciones de visibilidad,
sino que se dejan para los lenguajes de programación; si algún lenguaje incluye más tipos de visibi-
lidad, también se podrán indicar aquí.
© Editorial UOC 46 Ingeniería del software
En el lugar de los atributos, se pueden utilizar property strings, que son, respec-
tivamente, public, protected o private. Las property strings son opcionales; además
de las mencionadas, podemos encontrar frozen, que indica que no se puede cam-
biar el valor del atributo.
En lo referente al nombre de los atributos, se deben tener en cuenta las siguien-
tes pautas:
Consideremos:
hijos [0..3]: persona o bien, hijos [3]: persona; en el primer caso podría haber entre 0 y
3 hijos, pero en el segundo tiene que haber exactamente tres.
extremos serían las coordenadas de dos vértices opuestos del rectángulo, que lo determi-
nan; Punto sería una clase descrita en el mismo paquete; gruesoLínea tiene el valor 1 por
omisión, y área es un atributo derivado, ya que su valor se puede calcular a partir de las
coordenadas de los puntos de extremos.
En la programación conviene que los nombres de las operaciones estén bien pensa-
dos, porque son la base del polimorfismo, en el que se aplica que “a igual concepto,
igual nombre”.
Donde tipo es in, out o inout (por omisión, in), y nombre es el nombre del pa-
rámetro formal; expresión-de-tipo depende del lenguaje; valor-por-omisión depen-
de del lenguaje y es opcional.
El tipo-de-retorno sólo se tiene que utilizar cuando la operación devuelva un
valor como resultado, y también se puede usar un parámetro out en su lugar.
Opcionalmente, puede aparecer property strings: query, que denota que la ope-
ración no modifica el estado del sistema, y para especificar la semántica de concu-
rrencia se pueden utilizar una de éstas: sequential, guarded o concurrent, y abstract,
que indica que la operación es abstracta.
Se pueden utilizar estereotipos poniéndolos encima de la operación afectada.
© Editorial UOC 48 Ingeniería del software
Sabemos que la herencia presupone que existan dos clases, de las cuales una
desempeña el papel de superclase y la otra, el de subclase.
Se dice que la relación entre una subclase y su superclase es una relación
is_a_kind_of.
La subclase comprende un subconjunto de los objetos de la superclase, los
cuales, por tanto, tienen todos los atributos y operaciones de instancia de la su-
perclase (se dice que la subclase los hereda) y, además, pueden tener algunos adi-
cionales, específicos de la subclase.
Según se defina primero la superclase o sus subclases, tenemos respectiva-
mente dos tipos de herencia: herencia por especialización y herencia por gene-
ralización.
© Editorial UOC 49 Capítulo II. UML (I): el modelo estático
Se llama de esta manera porque lo que se hace es crear una clase más especia-
lizada, más restrictiva, a partir de una clase definida con anterioridad.
Ejemplo de especialización
La flecha con punta triangular vacía y cuerpo continuo expresa una relación
entre subclase y superclase, y su sentido indica cuál es cada una. También se ha-
bla de que hemos creado una jerarquía de herencia, muy sencilla en algunos ca-
sos (como por ejemplo el caso de especificación) pero que llega a ser un árbol de
diferentes niveles si hay superclases que presenten distintas subclases y subcla-
ses que sean a la vez superclases de otras.
Incluso la jerarquía se convierte en una red si algunas clases tienen más de
una superclase (herencia múltiple).
El proceso mediante el cual reconocemos una subclase dentro de otra clase –que,
consecuentemente, pasa a ser superclase de la primera– se denomina especializa-
ción o derivación.
© Editorial UOC 50 Ingeniería del software
En este caso hemos procedido al revés: a partir de las subclases, hemos en-
contrado la superclase. Este proceso se denomina generalización.
De la misma forma que en el ejemplo del hotel podía haber habitaciones que no
fueran suites y, por tanto, había objetos que, de las dos clases, sólo pertenecían a Ha-
bitación, en este último, cualquier vehículo de dos ruedas es o bien una moto o
bien un ciclomotor. Es decir, todos los elementos de Veh2Ruedas pertenecen a
una u otra subclase y, por lo tanto, Veh2Ruedas es una clase artificial, un simple
recurso para no describir dos veces lo que tienen en común Motos y Ciclomotores; se
dice que Veh2Ruedas es una clase abstracta.
Una clase abstracta es una superclase de la cual no se pueden crear (instanciar)
directamente objetos, sino que se tienen que crear necesariamente en alguna de
sus subclases.
© Editorial UOC 51 Capítulo II. UML (I): el modelo estático
Otro procedimiento
Por esta razón se dice que las clases abstractas son no instanciables.
Se indica que una clase es abstracta o bien poniendo su nombre en cursiva,
o bien con la propiedad {abstract} en el compartimento del nombre.
Una clase abstracta puede tener operaciones abstractas, que son las que sólo es-
tán implementadas en las subclases, en principio, de forma diferente en cada una.
Una operación abstracta debe tener o bien su definición en cursiva, o bien la
propiedad {abstract} al final de la misma.
Las clases diferidas son clases abstractas que tienen alguna operación abstracta.
También se denominan clases virtuales porque en algunos lenguajes como
C++ o Delphi, los servicios de las características que acabamos de indicar se de-
claran virtual; en Java se declaran abstract, y en Eiffel, deferred. En UML se definen
simplemente como clases abstractas.
4.3.3. Metaclases
Un parámetro puede ser, por ejemplo, el nombre de una operación o atributo, el tipo de
un atributo o de un parámetro o del resultado de una operación, el número de elemen-
tos de un atributo que sea una matriz o el número de bytes de un atributo de tipo string.
Cuando se dan valores a todos los parámetros de una plantilla se obtiene una
clase totalmente especificada que, por tanto, no puede ser modificada directa-
© Editorial UOC 53 Capítulo II. UML (I): el modelo estático
mente, pero se pueden definir sus subclases. Aunque una plantilla no es propia-
mente una clase, se puede definir como subclase de una clase A, y entonces las
clases que se han obtenido al dar valores a sus parámetros serán subclases de A.
En el diagrama que vemos a continuación hemos definido una plantilla, hemos ge-
nerado una clase y hemos dado un valor a cada parámetro. La relación entre la clase
y la plantilla se puede representar de las dos formas indicadas:
*. Las clases genéricas en otros lenguajes. C++ y Eiffel soportan plenamente las clases genéricas
pero con algunas diferencias, mientras que en Java se tienen que simular con la clase Object.
© Editorial UOC 54 Ingeniería del software
Puesto que esta clase no tendrá objetos, aunque los atributos y operaciones
se definan formalmente como atributos y operaciones de instancia, será como
si fuesen de clase y, por lo tanto, no se pueden definir ni operaciones ni atribu-
tos formalmente de clase.
4.4. Interfaces
Ejemplo de una interfaz con clase que la utiliza y otra que la implementa
La interfaz Comparable pretende declarar todas las operaciones que deberán tener las
clases que quieran permitir que dos de sus objetos se puedan comparar según algún
criterio de igualdad que sólo se define dentro de la implementación de la operación
esIgual dentro de la clase Cadena, que es la que implementa Comparable. La clase Cla-
seCliente utiliza la interfaz Comparable, en el sentido de que la implementación de
alguna operación de ClaseCliente llama alguna operación de Comparable. ¡Prestad
atención a cómo es cada flecha!
Lamentablemente, no existe acuerdo entre los autores más importantes sobre cuáles
son estos tipos (y menos todavía sobre su semántica y notación). Sin embargo, si el
UML, convertido en estándar, se acaba imponiendo, es probable que su versión sea
aceptada por todos o casi todos. No obstante, si el UML permite modelar gráficamen-
te diferentes tipos de relaciones entre clases (agregación, asociación y uso), el signifi-
cado de cada uno no queda concretado en los documentos oficiales del OMG y, por
lo tanto, la decisión sobre cuándo se debe aplicar un tipo de relación u otro será a me-
nudo una interpretación personal.
6.1. Asociaciones
Hay una asociación entre clases cuando una clase necesita otra u otras para
la implementación de sus operaciones, lo cual se cumple por medio del paso de
mensajes entre éstas.
Una asociación se define partiendo de la clase, y se concreta en la existencia
de enlaces (en inglés, links) entre objetos concretos de las clases relacionadas por
la asociación.
© Editorial UOC 58 Ingeniería del software
Dentro de una asociación, se considera que cada clase desempeña un papel (en
inglés, role) determinado; cada papel tiene asociada una cardinalidad. Entre las
mismas clases puede haber asociaciones diferentes con significado distinto.
Una asociación puede tener nombre, que sirve para identificar su significa-
do, y también se puede dar un nombre a cada uno de los papeles de las clases.
Asociaciones binarias son las que tienen lugar entre dos clases. Las dos clases
pueden ser la misma (asociación reflexiva), y en este caso es posible permitir que
un objeto esté enlazado consigo mismo o que no lo esté.
En una asociación binaria, la cardinalidad de un papel A es el número de ob-
jetos del otro papel B al que puede estar enlazado cada objeto de A; se indica el
valor máximo y mínimo de este número.
1) Asociación binaria
La asociación significa que una persona trabaja en una empresa (no al revés, obser-
vad el sentido indicado por la punta de flecha coloreada); la empresa es la que ofre-
ce el empleo y la persona desempeña el papel de empleado. Cada persona concreta
puede tener una empresa que ofrece el empleo o ninguna, mientras que una empre-
sa puede tener un empleado como mínimo y cualquier número como máximo, se-
gún indican las cardinalidades.
La punta de flecha abierta encima de la línea de la asociación indica que se puede ac-
ceder (navegar) de una empresa hacia sus empleados.
© Editorial UOC 59 Capítulo II. UML (I): el modelo estático
2) Asociación reflexiva
Consideremos la figura siguiente:
Una relación ternaria es aquella que tiene tres papeles, y en general una
relación n-aria es la que tiene n papeles. Las relaciones no binarias, ya que no
se pueden representar mediante una línea, se representan por medio de un
rombo.
El establecimiento de enlaces entre objetos según una asociación puede ser una ope-
ración de alguna de las clases asociadas, igual que la navegación de un objeto a otro
enlazado a éste.
En principio, una asociación no es una clase: no tiene por qué tener atributos
ni operaciones, y puede carecer incluso de nombre. No obstante, si una asocia-
ción debe tener atributos y operaciones propias o bien uno de los dos, entonces
es preciso que se defina como clase. En este caso se habla de clase asociativa.
Una clase asociativa se representa como una clase colgada del símbolo de la
asociación (la línea, en el caso de una asociación binaria, o el rombo en los otros
casos) por medio de una línea discontinua.
El caso que presentamos aquí es el mismo que el del ejemplo de asociación binaria,
excepto por el hecho de que aquí la asociación tiene un atributo. Puesto que la aso-
ciación ahora es una clase, se le ha añadido una operación para crear instancias, y
también se le ha cambiado el nombre por uno más apropiado para una clase.
© Editorial UOC 61 Capítulo II. UML (I): el modelo estático
Puede ocurrir que en una clase que participe en dos asociaciones, cada objeto
concreto participe en una o en la otra, pero no en las dos. Entonces se habla de
asociaciones alternativas.
Un servicio determinado puede ser prestado por un proveedor autónomo o bien por
una empresa, pero nunca por uno y otra a la vez. Esto también se podría describir así:
© Editorial UOC 63 Capítulo II. UML (I): el modelo estático
donde alumnos del curso es una asociación derivada, porque los alumnos de un curso
se pueden determinar recorriendo las asignaturas del curso y encontrando a los alum-
nos de cada una. Sin embargo, también podría ocurrir que esta relación se definiese
de una manera no redundante, por ejemplo, que comprendiese a los alumnos que es-
tuviesen matriculados sólo en asignaturas de dicho curso. Entonces no se pondría “/”,
que es el indicador de elemento derivado, como hemos visto al hablar de los atributos
derivados en el subapartado 5.1.2.
6.2.1. Agregaciones
Ejemplo de agregaciones
Cada jugador juega en un equipo (el del club al que pertenece) o en ninguno, y un
jugador sólo puede estar en una de las cuatro posiciones, como indica {or}. Se supone
© Editorial UOC 65 Capítulo II. UML (I): el modelo estático
que las de defensa, por ejemplo, son intercambiables entre sí, o de otro modo habría
once agregaciones diferentes. El rombo vacío en la parte de la clase compuesta u ob-
jeto compuesto denota que se trata de una agregación.
1) Ejemplo de composición
Un centro universitario (facultad, etc.) pertenece a una sola universidad (de hecho,
por la parte de la clase compuesta, la cardinalidad en una composición es siempre 1).
© Editorial UOC 66 Ingeniería del software
Puesto que en una composición cada objeto componente sólo puede pertenecer a un
único objeto compuesto, podemos representar los objetos componentes dentro del
objeto compuesto en un compartimento especial.
7. Comentarios y restricciones
7.1. Comentarios
7.2. Restricciones
Las restricciones (en inglés, constraints), expresan condiciones que debe cum-
plir el elemento del modelo al cual se asocian. Se representan del mismo modo
que los comentarios, salvo que van entre llaves {}, lo cual indica que pueden ser
interpretadas por las herramientas CASE.
Las especificaciones del UML incluyen un lenguaje para la descripción de las
restricciones, denominado OCL. No obstante, se puede utilizar el UML sin usar
este lenguaje.
OCL es la sigla de Object Constraint Language.
© Editorial UOC 68 Ingeniería del software
Las restricciones pueden servir para diseñar con vistas a hacer programación
por contrato, que se basa en unas condiciones sobre operaciones y objetos de-
nominadas aserciones, las cuales se pueden expresar en forma de restricciones
del UML.
© Editorial UOC 69 Capítulo II. UML (I): el modelo estático
Conclusiones
En este capítulo hemos estudiado el modelo estático del UML. Se han descri-
to los diferentes elementos del modelo, y de cada uno se ha descrito la notación.
Estos conceptos son los siguientes:
• Las clases, con sus variantes (clases abstractas, metaclases y otras) y concep-
tos relacionados con la clase (clasificador, interfaz, plantilla) y la herencia.
• Las relaciones entre clases (asociaciones, agregaciones, relaciones de depen-
dencia).
• Los comentarios y las restricciones.
© Editorial UOC 71 Capítulo III. UML (II): el modelo...
Capítulo III
1. El diagrama de estados
A veces hay objetos cuyo comportamiento puede variar a lo largo del tiempo;
cuando esto sucede, se dice que el objeto tiene estados. Existen algunos tipos de
aplicaciones, como las de tiempo real, para las cuales el modelado de estados es
especialmente importante.
presenta otro punto de vista sobre la dinámica de una parte del sistema que puede
contribuir decisivamente a comprenderla mejor.
Ejemplos de estados
Hay objetos a los cuales no se puede pedir alguna de sus operaciones en cualquier mo-
mento, u objetos para los que alguno de sus atributos sólo puede tener un valor no nulo
en circunstancias determinadas.
*. Conviene no confundir una transición interna con una a-totransición, que es una transición
ordinaria en la cual el estado de origen y el estado de destino son el mismo.
© Editorial UOC 74 Ingeniería del software
Tipos de acontecimientos
• De llamada. Se producen cuando se llama una operación del objeto al que corres-
ponde el diagrama.
• De señal. Representan la recepción de una señal por el objeto a la que corresponde
el diagrama.
• De cambio. Representan una notificación de que una condición ha llegado a ser
cierta. Esta condición no se tiene que confundir con condición de guarda, ya que
una guarda se evalúa una vez se ha presentado el acontecimiento correspondiente
a una transición para determinar si se provoca la transición o no, mientras que esta
condición produce el acontecimiento cuando ha llegado a ser cierta.
• De tiempo. Representan la notificación de que o ha pasado un periodo de tiempo
desde que se ha producido un acontecimiento determinado (por ejemplo, que se ha
entrado en el estado de origen de la transición), o de que es una hora determinada.
Acontecimientos internos
Nota terminológica
Respecto al uso de términos parámetro y argumento en relación con una llamada, hay
que tener presente que parámetro corresponde al punto de vista de lo que se llama, y
argumento, al punto de vista de lo que hace la llamada.
© Editorial UOC 76 Ingeniería del software
• Guarda. Es una expresión que puede tomar el valor verdadero o falso, escrita
en seudocódigo o en el lenguaje de programación que se utiliza.
• Acción. Es la especificación de una acción, en seudocódigo o en el lenguaje
de programación que se usa. En el caso de un acontecimiento diferido, debe
aparecer la palabra clave defer como primera acción.
• Envío. Este elemento presenta la forma siguiente:
Todo comienza cuando llega una factura, hecho que describimos como el aconteci-
miento llegada, que tiene como parámetro la fecha. Este acontecimiento pide la ope-
ración constructor de dicha clase en relación con un objeto de la clase que es la factura
llegada (identificada por factura) y provoca la transición hacia el estado Recibida; fe-
cha, y proveedor son parámetros de constructor. Después, la factura es verificada (esto
no aparece explícitamente), lo cual puede dar como resultado dos acontecimientos
alternativos: aceptación –que pide la operación aceptar y provoca la transición hacia el
estado Aceptada–, y error –que pide, a su vez, la operación retorno y provoca la transi-
ción al estado Devuelta. Si la factura está en el estado Aceptada y se produce el acon-
tecimiento pago, la factura pasa al estado Final y se pide la ejecución de la operación
pagar en relación con dicha factura. Si la factura está en el estado Devuelta, la transi-
ción hacia el estado Final es provocada por un acontecimiento de tiempo que consiste
en que hayan pasado tres días (puesto que no se especifica desde cuándo, se entiende
que es desde la entrada en el estado de origen), y entonces se pide la operación borrar.
Cuando un lector tiene un libro en préstamo, puede pedir renovaciones, que se le conce-
derán si otro lector no lo ha reservado. Los efectos del acontecimiento peticion_renovacion
son la autotransición, la llamada a la operación renovacion y la ejecución de la acción es-
tadisticas.
*. Seudoestado. Un seudoestado es un símbolo que figura en una posición del diagrama donde
normalmente habría un estado, y no representa ningún concepto, sino que tiene una función
puramente gráfica.
© Editorial UOC 79 Capítulo III. UML (II): el modelo...
Cuando llega una factura de una compra de material, pasa a estar pendiente de la ve-
rificación mediante la comparación con el pedido (V1) y con lo que se ha recibido
(V2), por medio de una transición compleja de bifurcación. Si de cada verificación re-
sulta una conformidad (acontecimientos OK1 y OK2), se pasa al estado Revisado1 y
Revisado2, respectivamente. Cuando llega el día 30, se paga la factura sólo si estaba al
mismo tiempo en estos dos estados, por medio de una transición compleja de sincro-
nización.
Existen varios tipos de transiciones que tienen por estado de origen o de des-
tino un objeto compuesto:
Este ejemplo describe el mismo caso que el ejemplo de transiciones complejas, pero
esta vez, por medio de un estado compuesto (de nombre EnVerificacion). Este estado
no tiene compartimento de transiciones internas.
© Editorial UOC 81 Capítulo III. UML (II): el modelo...
Desde el estado Est1 se va al estado compuesto Est2 en general (es decir, a todos sus
estados iniciales a la vez) si se produce el acontecimiento ev1 y se cumple la guarda
g1. En cambio, si con el mismo acontecimiento se cumple la guarda g2, entonces se
pasa al subestado de Est2, donde se estaba antes de salir de Est2 (observad que se pue-
de haber salido tanto desde Sub1 como desde Sub3) si es que se había estado alguna
vez en el mismo, y si no se pasa a Sub1. Si Sub1 o Sub3 tuvieran subestados, se iría al
subestado de éstos en el que se estaba cuando se salió de Est2 por última vez (esto lo
indica el hecho de que la H del indicador de historia vaya acompañada de un asteris-
co). Se puede pasar de Sub1 a Sub4 –que pertenece a otra secuencia– por medio de un
seudoestado de sincronización y una transición compleja de sincronización. El aste-
risco dentro del símbolo del estado de sincronización denota que no hay límite máxi-
mo en el número de veces que se puede disparar la transición hacia Sub4 como
© Editorial UOC 82 Ingeniería del software
Igual que la clase, el estado tiene dos representaciones gráficas: una que sólo
tiene el nombre, que es la que hemos utilizado hasta el momento, y otra con va-
rios compartimentos. Los compartimentos son los siguientes:
Los diagramas de casos de uso (en inglés, use case) sirven para mostrar las fun-
ciones de un sistema de software desde el punto de vista de sus interacciones con
el exterior y sin entrar ni en la descripción detallada ni en la implementación de
estas funciones.
Los casos de uso se utilizarán tanto en la recogida y documentación de requi-
sitos como en el análisis.
2.1. Actores
1) Ser autónoma con respecto al software, es decir, que la actividad en que uti-
liza la información suministrada por el software no esté subordinada a la de éste.
© Editorial UOC 84 Ingeniería del software
Ejemplos de actores
Algunos ejemplos nos ayudarán a aclarar el concepto de actor aplicando las reglas que
acabamos de indicar.
Un motor eléctrico que es puesto en marcha o parado por un software de tiempo real es
un actor, ya que su actividad es autónoma (su rotación sirve para accionar algún dispo-
sitivo mecánico), mientras que una impresora no tiene actividad autónoma porque se
limita a imprimir la información que le envía un sistema de software (o varios) y, por tan-
to, su actividad está subordinada a la generación de listados por parte del software.
Si en una biblioteca pública todos los bibliotecarios pueden utilizar las mismas fun-
ciones del software de apoyo a la gestión de la biblioteca, definiremos un único actor
para todos. Sin embargo, si hay un bibliotecario que puede realizar algunas funciones que
los demás no pueden (como variar la duración de los préstamos), estas funciones se
asignarían a otro actor. Hay dos maneras de hacerlo; podéis leer, unas líneas más aba-
jo, la segunda parte de este ejemplo.
Caso especial...
Caso especial
Entre los actores que participan en un caso de uso, conviene distinguir el ac-
tor primario del caso de uso, que es el que lo pone en funcionamiento pidiendo
la función correspondiente del software.
Los casos de uso son un caso particular de los clasificadores; una instancia
de un caso de uso es una ejecución de éste con intervención de casos particu-
lares de los actores involucrados. Los casos de uso pueden tener atributos y
operaciones que pueden servir para describir el proceso (que también es posi-
ble describir de otras maneras, como texto ordinario y diagramas de estados y
de actividad).
© Editorial UOC 86 Ingeniería del software
Se pueden hacer descripciones más formales y detalladas de los casos de uso durante
el análisis, así como de su implementación “suprimir por medio de diagramas de co-
laboración o de secuencias”.
Entre los casos de uso y los actores que intervienen se establecen asociaciones
(lo cual no tiene nada de especial, ya que unos y otros son clasificadores). El sig-
nificado de estas asociaciones es el papel del actor en relación con el caso de uso,
pero no representan ni la dirección ni el contenido de un eventual flujo de datos
entre el software y el actor.
2.4. Notación
Tanto para los casos de uso como para los actores, no se utiliza el símbolo de
los clasificadores, sino símbolos especiales como los siguientes:
Los usuarios correspondientes al actor Contable sólo pueden intervenir en los casos de
uso Asiento y CreacionCuenta, mientras que el actor JefeContable puede hacer también el
caso de uso Correccion. Por tanto, JefeContable es una especialización de Contable. El caso
de uso CreacionCuenta extiende el caso de uso Asiento porque cuando se intenta hacer
un asiento con una cuenta inexistente es necesario crear esta cuenta. El caso de uso Da-
© Editorial UOC 88 Ingeniería del software
tosCuenta representa el acceso a los datos de una cuenta desde dentro de los casos de
uso Asiento y Correccion. A diferencia de CreacionCuenta, no se trata de un caso de uso
que pueda ser llevado a cabo de manera directa e independiente por parte un actor y,
por tanto, la relación con los casos que utilizan es de inclusión y no de extensión.
3.1.1. Interacciones
3.1.2. Colaboraciones
De la misma forma que para que puedan circular mensajes entre ordenadores
es necesario que los ordenadores estén unidos por enlaces de comunicaciones,
también debe haber una cierta “infraestructura” para la circulación de mensajes
entre objetos (a diferencia del caso de las redes, aquí no se trata de una necesi-
dad física, sino de una necesidad de coherencia entre los diferentes diagramas
del UML que describen un software). Esta infraestructura está formada por las
clases o clasificadores y las asociaciones entre las mismas, definidas en el mode-
lo estático, así como las asociaciones entre actores y objetos que se obtienen
cuando se describen casos de uso mediante interacciones.
De acuerdo con esto, para cada interacción se tiene que indicar qué parte del
modelo estático utiliza.
Por tanto, en una colaboración sobre la cual debe tener lugar una interacción
determinada, es necesario que figuren todos los clasificadores y asociaciones
entre éstos que se utilizarán en la interacción. Sin embargo, de la misma manera
que en un caso de uso de las entidades exteriores no nos interesan todos los as-
pectos, sino sólo el papel que ejecutan en relación con aquel caso de uso, tam-
bién en una colaboración, más que clases u objetos, lo que se tendrá en cuenta
serán sus papeles* respectivos en relación con dicha interacción, y lo mismo es
válido para las asociaciones.
Resumiendo, una colaboración es un conjunto de papeles de clasificadores o
instancias y de papeles de asociaciones entre aquellos que intervienen en una
interacción. Una colaboración se puede definir en lo que respecta a clasificado-
res o por lo que respecta a instancias.
*. Conviene no confundir estos papeles con los que desempeñan los clasificadores con respecto a
una asociación que los relaciona.
© Editorial UOC 90 Ingeniería del software
o esta otra:
El nombre_estado corresponde a uno de los estados que pueden tener los ob-
jetos de dicho clasificador, y es opcional, juntamente con los corchetes que lo
rodean. La primera forma es aplicable tanto a clasificadores como a sus instan-
cias.
La representación gráfica de los papeles es igual que la de los clasificadores y
asociaciones correspondientes, aunque sólo es necesario especificar los elemen-
tos que están modificados –siempre en sentido restrictivo– en la colaboración. En
una colaboración pueden figurar varios papeles del mismo clasificador, con nom-
bres de papel diferentes.
Los multiobjetos representan un conjunto de objetos de un papel con cardi-
nalidad mayor que 1 dentro de una asociación.
Se representan con dos rectángulos superpuestos, de los cuales el de delante
está ligeramente desplazado hacia un ángulo para dar la sensación de que hay
muchos objetos.
Los multiobjetos necesitan dos mensajes para realizar una operación en cada
uno de sus objetos: uno sirve para seleccionar el conjunto de enlaces de la asocia-
ción que corresponden a los objetos, y el otro mensaje se envía de forma separada
a cada objeto individual por medio del enlace respectivo. Estos dos mensajes pue-
den estar combinados dentro de uno que incluya tanto la interacción como la
aplicación de la operación a cada objeto individual.
© Editorial UOC 91 Capítulo III. UML (II): el modelo...
Ejemplo de colaboración
El diagrama estático de partida sería éste (tal vez con otras clases y asociaciones, que no
vienen al caso):
Vemos que en el ejemplo de colaboración no se utilizan todos los aspectos que tie-
nen las dos clases y la asociación en el diagrama estático: sólo se usa la navegación
en un sentido y el papel préstamos y reservas de la clase Libro se sustituye por el pa-
pel más restrictivo préstamos, circunstancia que se refleja en la cardinalidad máxi-
ma. Se ha definido una colaboración entre objetos (más exactamente, entre un
objeto y un multiobjeto), y al papel que desempeña el objeto unLector se le ha dado
el nombre prestatario, mientras que ni el multiobjeto de la clase Libro ni su papel
tienen nombre.
3.1.3. Patrones
bolo del patrón por medio de líneas discontinuas en las clases u objetos que sus-
tituyen las del patrón en esta aplicación.
Este ejemplo corresponde a una aplicación del patrón Composite, muy conocido, que
trata de la implementación de un objeto compuesto, cuyos componentes pueden ser
compuestos o no.
En este caso, los objetos compuestos son grupos de datos, y cada uno de sus compo-
nentes puede ser un campo (es decir, un dato atómico) u otro grupo de datos. Las cla-
ses Campo, Dato y GrupoDeDatos son los argumentos que en este caso concreto
sustituyen respectivamente las clases Leaf, Component y Composite, que son los pará-
metros de la colaboración que describen los aspectos estructurales del patrón.
• guarda es la condición que se tiene que cumplir para que se envíe dicho men-
saje (además del hecho de que se hayan recibido los mensajes predecesores).
• expresión_de_secuencia tiene esta sintaxis:
• signatura está compuesta por el nombre del estímulo y por una lista de argu-
mentos entre paréntesis.
Tipos de mensajes
Este ejemplo corresponde al ejemplo de diagrama de colaboración del final del subapar-
tado 4.2:
Observad que no se indican los papeles de los objetos ni los números de secuencia de
los mensajes, pero de todas formas queda claro qué mensaje es consecuencia de qué
© Editorial UOC 98 Ingeniería del software
otro. Observad la diferencia entre línea de vida y activación: puesto que los objetos y
el actor existían antes de la interacción y continuarán existiendo después, sus líneas
de vida (las líneas verticales discontinuas) comienzan antes y acaban después de las
activaciones respectivas. Que las flechas de los mensajes sean horizontales quiere de-
cir que se pueden considerar instantáneos, pero en cambio, los procesos tienen una
duración no ignorada, ya que tienen una cierta medida en dirección vertical y los
mensajes en cascada se encuentran en flechas cada vez más abajo.
jeto de la clase campo desde el comienzo, pero las dos partes no se vuelven a juntar
porque cuando se destruye un objeto (observad la X al final de una de sus activa-
ciones), su línea de vida ya no continúa.
4. El diagrama de actividades
1) Estados de acción, que son un caso particular de los estados, en los cua-
les no hay un objeto que permanezca en espera de que se produzca un acon-
tecimiento que lo haga salir del mismo, sino que se está desarrollando una
acción, que es la acción de entrada del estado. Cuando ésta acabe, se producirá
la transición, lo cual significa que un estado de acción no puede tener acciones
vinculadas a otros acontecimientos que no sean el de entrada ni, por tanto,
transiciones internas.
Los estados de acción se representan como un rectángulo en el cual los la-
dos derecho e izquierdo son semicircunferencias, con el nombre de la acción
y el de un acontecimiento seguido de “/defer” si durante la acción se puede
producir un acontecimiento que no es posible tratar hasta que termine.
© Editorial UOC 100 Ingeniería del software
Si partimos del estado inicial, el departamento que hace la petición realiza la acción Pre-
paración propuesta, de la cual resulta un objeto de la clase Compra en el estado propuesta
que entra en la acción Revisión presupuesto, que está a cargo de Control de gestión. Como
resultado de esta acción, si no hay presupuesto para la compra (guarda no presupuesto)
el departamento que pide pone en marcha la acción Cancelación, con la que se llega al
estado final. Si la guarda que se cumple es hay presupuesto, el objeto Compra pasa al es-
tado presupuestada y entra dentro del estado de subactividad Gestión de compra (el cual
se supone que está detallado en un diagrama de actividades aparte). Observad que a la
vez se envía una señal que hace que el objeto de clase ConexionRed pase al estado acti-
© Editorial UOC 102 Ingeniería del software
vada y que la llegada a este estado produzca una señal que, juntamente con el cumpli-
miento sucesivo de la actividad Gestión de compra y las acciones Envío y Transporte,
permite que se ponga en marcha la acción Recepción, que lleva al estado final.
• El diagrama de componentes, que muestra cuáles son las diferentes partes del
software.
• El diagrama de despliegue, que describe la distribución física de las diferentes
partes del software en tiempo de ejecución.
Ejemplo de componente
Un componente podría ser, por ejemplo, un conjunto de clases –ya sea en forma
fuente o ejecutable– agrupadas dentro de un paquete de UML o de Java. La interfaz co-
rrespondiente constará no de todas las operaciones de alguna clase del paquete que
pueden ser pedidas desde otras clases, sino sólo de las que pueden ser pedidas desde fue-
ra del paquete. En un software, puede ser que se encuentren en tiempo de compilación
varios paquetes de clases hechas anteriormente que estén en forma ejecutable, que
sean necesarios para compilar otros paquetes, éstos de clases nuevas en forma fuente.
Después de la compilación, puede ocurrir que las clases resultantes, ahora ya todas en
forma ejecutable, se agrupen en paquetes de otro modo (con vistas a la comercializa-
ción del software, por ejemplo) y las clases de estos diferentes paquetes colaboren en
tiempo de ejecución.
Entre los nodos se establecen relaciones que significan que existe comunica-
ción entre éstos. Se representan mediante líneas continuas, y se puede hacer con
un estereotipo que indica el tipo de comunicación.
Un componente o un objeto se puede ejecutar si se utilizan los recursos de un
nodo o puede estar contenido en éste. En el primer caso, se da una dependencia
con el estereotipo supports; en el segundo, se establece una relación de agregación
o composición, que es posible representar de las maneras habituales.
Se puede representar que un objeto o componente emigra de un nodo a otro o
se transforma en otro. En el primer caso se representa el objeto o componente en
© Editorial UOC 106 Ingeniería del software
los dos nodos, y en los dos casos, la relación entre sí es una dependencia con el
estereotipo becomes. Podemos tener asociada una propiedad que indique el tiempo
en que se producirá la migración.
Además, entre componentes se pueden establecer las mismas relaciones me-
diante interfaces que en el diagrama de componentes, limitadas, pero en tiempo
de ejecución.
Conclusiones
En este capítulo hemos visto el resto de los diagramas que considera el estándar
UML. Dichos diagramas son los siguientes:
Capítulo IV
Aunque se trata de dos aspectos del software bastante diferentes, puesto que las
fuentes de información son las mismas, conviene recoger estos dos tipos de requi-
sitos al mismo tiempo.
El uso que se hace de la recogida de requisitos en las diferentes fases del ciclo
de vida mencionado es el siguiente:
• En la fase de inicio se identifican casi todos los casos de uso, para delimitar
el alcance del proyecto, pero sólo se describen detalladamente los más crí-
ticos.
• Durante la fase de elaboración se describen la gran mayoría de los casos de uso,
aunque sólo se implementa una pequeña parte de los mismos.
© Editorial UOC 110 Ingeniería del software
1. Los requisitos
Los requisitos son la especificación de lo que debe hacer el software; son des-
cripciones del comportamiento, propiedades y restricciones del software que hay
que desarrollar.
A menudo se dice que los requisitos deben indicar qué tiene que realizar el
software sin decir cómo debe hacerlo; pero esto es demasiado radical, por dife-
rentes razones:
• Los desarrolladores de software son técnicos y, tal vez, les resultaría difícil
entender unos requisitos extremadamente abstractos.
• Está claro que debe haber unas referencias mínimas a la tecnología utilizada.
• Finalmente, el software deberá ser compatible con el entorno técnico y orga-
nizativo.
• Los requisitos funcionales describen qué debe realizar el software para sus
usuarios: aceptar, verificar y registrar datos, transformarlos, presentarlos, etc.
Estos requisitos quedan recogidos en los casos de uso.
• Los requisitos no funcionales* no van asociados a casos de uso concretos y
consisten en restricciones impuestas por el entorno y la tecnología, especifi-
caciones sobre tiempo de respuesta o volumen de información tratado por
unidad de tiempo, requisitos en cuanto a interfaces, extensibilidad, facilidad
de mantenimiento, etc.
2. Fuentes de información
Para recoger información de los requisitos que debe cumplir el software, de-
beremos recurrir a las fuentes de información siguientes:
En cualquier caso, hay que elaborar un glosario de los términos más utilizados.
Incluso si no se realiza ninguno de los dos modelos, conviene confeccionar el
glosario.
© Editorial UOC 113 Capítulo IV. Recogida y documentación...
El modelo del dominio recoge los tipos de objetos –las clases– más importantes.
Como objetos importantes, podemos establecer la clasificación siguiente:
Para realizar el modelo del dominio, se utiliza el diagrama de clases del UML.
Al modelizar el contexto, hay que tener presente que se trata de realizar un
modelo del entorno del software, y no del software; esto último se realiza dentro
de otro componente de proceso, el análisis y diseño.
El modelo del negocio* describe a grandes rasgos los procesos y entidades prin-
cipales en torno al software.
Este modelo describe cada una de las grandes actividades del negocio en tér-
minos de casos de uso y de entidades y unidades de trabajo (que son agrupacio-
nes de entidades que tienen un significado para el usuario) que intervienen. Se
utilizan el diagrama de casos de uso y el de objetos, y para explicar los casos de
uso se pueden usar diagramas de interacción y de actividades.
El modelo del dominio y el modelo del negocio son bastante diferentes; no se puede
decir que el modelo del dominio sea la parte del modelo de negocio que considera las
entidades del mismo. Las clases del modelo del dominio se han obtenido a partir de
un estudio superficial del negocio, mientras que en el modelo del negocio primero se
*. Realmente, el término negocio no debe tomarse en sentido literal. El entorno del software puede
ser no sólo una organización no lucrativa (o una parte de ésta), sino también un robot, por ejem-
plo, si el software debe gestionar el funcionamiento de éste.
© Editorial UOC 114 Ingeniería del software
describen, en líneas generales, los casos de uso, después se identifican las entidades
que participan en el mismo y, finalmente, estos casos de uso se describen con más
detalle, pero siempre teniendo en cuenta los aspectos organizativos más que los in-
formáticos.
En realidad, los usuarios difícilmente identificarán los casos de uso de una ma-
nera explícita y sistemática. Generalmente nos explicarán algunas de las series
de operaciones más frecuentes que realizan en su trabajo; esto es lo que se deno-
mina guiones.
Los guiones tienen las características siguientes:
Los guiones son la fuente de información principal, ya que expresan las nece-
sidades de los usuarios tal como ellos las ven; conviene que cada guión describa
de manera precisa y completa la interacción correspondiente entre el usuario y el
software: También es preciso que se indiquen todas las excepciones, casos particu-
lares y precondiciones.
Cada actor tiene un papel para cada caso de uso en el que interviene; un papel
es primario si el actor pone en marcha el caso de uso correspondiente.
Algunas consideraciones sobre los actores:
1) Son procesos autónomos iniciados por un actor o por otro caso de uso.
Dos procesos iniciados por actores diferentes no pueden ser parte del mismo
© Editorial UOC 116 Ingeniería del software
caso de uso, como tampoco pueden serlo los procesos que no sean nunca pues-
tos en marcha directamente por un actor, excepto los casos de uso que formen
parte de otros mediante relaciones include.
2) Representan funciones ofrecidas por el software e identifican sus entradas
y salidas. Un caso de uso debe proporcionar siempre un resultado definido al ac-
tor primario.
3) Describen el qué de estas funciones y no el cómo, excepto las especifica-
ciones no funcionales, a las cuales a veces se puede dar la forma de casos de uso.
4) Pueden servir de base para pruebas de caja negra.
5) Los casos de uso que se describan por primera vez en una iteración deter-
minada deben encajar con los de las iteraciones anteriores; si es indispensable,
se pueden modificar estos últimos.
Es importante describir todos los casos de uso relativos al software considera-
do. Sin embargo, dentro de un ciclo de vida iterativo e incremental, se irá ha-
ciendo por partes.
Los casos de uso se obtienen de los guiones, y se identifican las partes autóno-
mas y eventualmente comunes a diferentes guiones en los que participa un mis-
mo actor; también puede suceder que un caso de uso agrupe diferentes guiones
enteros. A cada caso de uso se le da un nombre, que por lo general consta de un
verbo y un complemento directo.
Puede ocurrir que deba darse de alta a un cliente que no esté en la situación de uso
de registro de un pedido ni en el de planificación de una visita de un vendedor; el
actor debería ser, en ambos casos, el que puede dar de alta a clientes.
Una factura que tiene un error se debe poder rechazar y devolver tanto si la factura es
por una compra como por un servicio. Es decir, el caso de uso de rechazo de una fac-
tura se incluye tanto dentro del caso de uso de tratamiento de una factura de compra
como dentro del tratamiento de una factura de servicio.
3) Una relación de especialización indica que, de los dos casos de uso rela-
cionados, uno es una versión especializada de la otra, en el sentido, por ejem-
plo, de que el primero se aplica a una subclase de la clase a la cual se aplica el
segundo.
• documentación textual,
• documentación formal.
La descripción textual
Es necesario elaborar una descripción textual de cada caso de uso. Conviene
realizarla mediante una plantilla y aplicar sistemáticamente unas normas de
formato.
A continuación, se describe una manera de realizar la documentación textual
de un caso de uso.
Establecemos las convenciones siguientes:
El glosario
Es muy conveniente para unificar la terminología y su interpretación. Se
puede extraer del modelo del dominio o del negocio, pero también se puede ob-
tener a partir de entrevistas con usuarios.
Es imprescindible un diagrama de casos de uso que los muestre todos con las
relaciones entre éstos y entre los actores. Además, puede ser que para casos de
uso concretos convenga utilizar algún otro diagrama como complemento de la
descripción textual: diagrama de actividades, de estados o de interacción.
Quizá podría crear alguna confusión el hecho de que en el análisis se utilizan
también estos diagramas para describir de manera detallada y formalizada los
casos de uso; pero hay diferencias importantes:
La interfaz de usuario es lo que los usuarios ven del funcionamiento del software.
También se denomina interfaz hombre-máquina.
*. D. Weinschenk; P. Jamar; S.C. Yeo (1997). GUI Design Essentials. John Wiley & Sons.
© Editorial UOC 121 Capítulo IV. Recogida y documentación...
Los casos más habituales de interfaces son entradas mediante teclado y pantalla y
salidas por pantalla e impresora. También se pueden considerar entradas y salidas
sonoras y entradas por escáner.
Por lo tanto, hay que recoger información sobre las mismas funciones desde
dos puntos de vista.
Una buena manera de recoger requisitos para los dos usos sería que dos de-
sarrolladores realizaran de forma conjunta las entrevistas a los usuarios y que
cada uno se interesase por uno de los dos aspectos. Parece claro que es mucho
mejor que los dos entrevistadores lleven a cabo una entrevista y no dos en-
trevistas independientes, por dos motivos: para no hacer perder más tiempo
al usuario y para evitar tener dos versiones no coordinadas de las necesidades
de usuario.
© Editorial UOC 124 Ingeniería del software
• Que el 90% de los usuarios que han trabajado al menos un año con el sistema an-
tiguo sean capaces de aprender en una semana las funciones indicadas en una lista,
valiéndose sólo de la documentación y la ayuda on-line.
• Que el 80% de los usuarios después de una semana de aprendizaje puedan registrar
una media de diez facturas en treinta minutos o menos.
• Que después de haber practicado dando tres altas de clientes, el 75% de los usuarios
pueda dar de alta a diez clientes en veinte minutos o menos y el 90%, en veinticin-
co minutos o menos.
5. Ejemplo
Los propietarios de los locales pueden ser particulares o empresas. El propietario pue-
de cancelar en cualquier momento la oferta de su local, pero mientras no lo haga no
lo puede alquilar por su cuenta y está obligado a aceptar al arrendatario que proponga
la agencia si cumple las condiciones estipuladas; entonces la agencia prepara el con-
trato de alquiler, que siempre es por un tiempo determinado. Cuando se cumple el
plazo de preaviso de la renovación o no del contrato de alquiler, si hay renovación la
agencia prepara el nuevo contrato y si no hay renovación o el arrendatario cancela el
contrato antes del plazo mencionado, la agencia propone al propietario buscarle otro
arrendatario.
Otro servicio que realiza la agencia es recibir peticiones de alquiler de locales con ca-
racterísticas determinadas (situación y superficie, principalmente) y entonces se bus-
can locales que las tengan, entre los que alquila la agencia y, si es necesario, otras
agencias. Cuando encuentra uno conveniente, se propone al propietario que se con-
vierta en cliente y, si acepta, se prepara el contrato.
No es necesario que los nombres de los atributos, e incluso de las clases, respe-
ten las restricciones de algún lenguaje, porque este diagrama no se utilizará para
etapas posteriores.
Para elaborar el modelo del negocio, sería necesaria más información con
vistas a elaborar unos primeros casos de uso. La información adicional es la
siguiente:
Arrendatario eventual: persona que pide a la agencia que le busque un local con
unas determinadas características para alquilarlo con vistas a un uso concreto.
Código del local: dato que identifica un local, formado por el código de la zona, el
tipo de local y un número correlativo.
Informe: reporte que elabora un inspector de la agencia sobre un local después de vi-
sitarlo.
Inspector: empleado de la agencia que visita los locales antes de ofrecerlos en alquiler.
Local: inmueble o parte de éste que se alquila para usos comerciales, es decir, cual-
quier uso excepto de vivienda o industria. Puede ser inmueble, oficina, tienda-alma-
cén o polivalente.
Propietario: persona o empresa que tiene el título de propiedad del local. Los clientes
de la agencia son los propietarios de los locales que alquila.
Llega un cliente y se le piden los datos del local que quiere alquilar: dirección, tipo,
superficie, características, restricciones, el volumen si se trata de una tienda-alma-
cén y las características polivalentes si es un polivalente, y se le asigna un código
que contiene la zona, el tipo y un número correlativo. Si el propietario no estaba
introducido para un local anterior, hay que dar la razón social o los apellidos y
nombre –según se trate de una empresa o de un particular–, la dirección, el teléfono
y el NIF. Una vez añadido el local, no se puede alquilar aún, sino que queda pen-
diente de inspección.
La inspección consiste en una vista previa del inspector al local. El inspector examina
diferentes aspectos del local (forma, accesibilidad, instalaciones, estado de conserva-
ción, visibilidad, etc.) con el objetivo de determinar el precio de alquiler y los usos
posibles. El inspector mismo introduce esta información.
© Editorial UOC 130 Ingeniería del software
Una vez que se le ha puesto precio, el local está pendiente de alquilar; se anuncia en la
prensa y los vendedores lo ofrecen a los arrendatarios eventuales. Cuando llega un
arrendatario eventual, le atiende un vendedor que lo entrevista e introduce sus datos
(apellidos y nombre, NIF, teléfono, dirección, tipo de local que desea, zona o zonas, su-
perficie mínima y diferentes requisitos). A continuación, el vendedor lleva a cabo una
búsqueda entre los locales pendientes de alquilar; si encuentra locales adecuados, le co-
menta las características (excepto la dirección del local y los datos del propietario); si al
arrendatario eventual le interesa algún local, se marca el local como comprometido y
se pone en marcha la preparación del contrato, que empieza con el aviso al propietario.
Si entre los locales que la agencia ofrece no hay ninguno apropiado, la agencia busca
más locales por otros medios y, cuando encuentra uno conveniente, ofrece al propie-
tario presentarle un alquiler a cambio de que el propietario se convierta en cliente de
la agencia.
5.6.1. Actores
Los actores son tres: agente, inspector y vendedor, que son usuarios finales di-
rectos del sistema. En cambio, no son actores ni los propietarios ni los arrendata-
rios o arrendatarios eventuales, ya que no tienen interacción con el sistema, sino
que toda la relación que tienen es mediante los agentes y los vendedores (por lo
tanto, el software no los “ve”).
El agente tiene dos papeles, ya que añade locales, por un lado, y propietarios,
por otro. El vendedor tiene cuatro, ya que introduce arrendatarios, arrendata-
rios eventuales y contratos, y busca locales. Todos estos papeles son primarios.
Los tres actores son independientes. Entre ellos no hay ninguna relación de es-
pecialización, ya que, como veremos a continuación, no hay ningún caso de uso
que puedan hacer dos de los actores.
© Editorial UOC 131 Capítulo IV. Recogida y documentación...
Papel en el trabajo del usuario: es el caso de uso principal del trabajo de los agentes.
Actores: agente.
El agente introduce los datos del local: un código del local –que contiene la zona, el tipo
(tienda-almacén, oficina, polivalente o inmueble entero), y un número correlativo–,
la dirección, la superficie, un texto de características, otro de restricciones, el NIF del
propietario, el volumen si es tienda-almacén y el texto de características polivalentes
si es un polivalente.
• ¿Hay que registrar qué agente ha añadido el local? Respuesta: sí; el nombre del
agente se toma de una lista.
Papel en el trabajo del usuario: es un caso de uso esporádico en el trabajo de los agentes.
Actores: agente.
El agente introduce los datos del propietario: el NIF, la razón social si es una empresa
o los apellidos y nombre si es un particular, la dirección y el teléfono.
Este caso de uso puede ser ejecutado independientemente o ser llamado desde el caso
de uso Añadir local.
Papel en el trabajo del usuario: es el caso de uso único en el trabajo de los inspectores.
Actores: inspector.
Precondición: el local está introducido en la base, pero aún no tiene el informe y, por
lo tanto, no está disponible para alquilar.
El inspector introduce el código del local y después los textos sobre cada uno de los as-
pectos del local: la forma, la accesibilidad, las instalaciones, el estado de conservación,
la visibilidad y diferentes aspectos; también introduce los usos recomendados (los
toma de una lista) y el precio. Además, puede modificar la dirección, la superficie, el
tipo y el texto de características.
• ¿Hay que registrar qué inspector ha realizado el informe? Respuesta: sí; el nombre
del inspector se toma de una lista.
Papel en el trabajo del usuario: pertenece a la parte principal del trabajo de los vende-
dores.
El vendedor introduce el código del local y después el NIF del arrendatario; después se
añaden las fechas de inicio y de final del contrato.
• ¿Hay que registrar qué vendedor ha introducido el contrato? Respuesta: sí, el nom-
bre del vendedor se toma de una lista.
© Editorial UOC 134 Ingeniería del software
• ¿Hay que imprimir directamente el contrato? Respuesta: no, pero deben imprimirse
los datos del propietario, arrendatario, local y fecha de inicio y final del contrato con
el objetivo de preparar el contrato fuera de la aplicación.
Papel en el trabajo del usuario: lo utilizan ocasionalmente los vendedores como paso
previo a la introducción de un contrato.
Actores: vendedor.
El vendedor introduce los datos del arrendatario: el NIF, los apellidos y nombre (o la
razón social, si es una empresa), el teléfono y la dirección.
Papel en el trabajo del usuario: lo utilizan ocasionalmente los vendedores como paso
previo a la búsqueda de locales que puedan convenir al arrendatario eventual .
Actores: vendedor.
Es parecido al caso de uso Añadir arrendatario, excepto que, además, el vendedor in-
troduce los datos siguientes: el tipo de local, la zona o zonas deseadas, la superficie
mínima y varios requisitos.
Papel en el trabajo del usuario: lo utilizan ocasionalmente los vendedores para la bús-
queda de locales que puedan convenir al arrendatario eventual .
Actores: vendedor.
Precondición: ninguna.
Busca todos los locales que cumplen unas condiciones especificadas antes de la ejecu-
ción en términos de tipo, zona y superficie y obtiene una lista de la que se pueden
seleccionar locales uno por uno para ver toda la información o bien toda menos la di-
rección y el NIF del propietario.
Otros requisitos
Todos los usuarios conocen a fondo su trabajo. Los agentes y los vendedores están
acostumbrados a utilizar ordenadores, pero los inspectores no mucho. Ningún usua-
rio ha utilizado ninguna aplicación parecida. La rotación del personal es muy baja.
Todas las funciones del software se realizarán muy a menudo.
Añadir un local
El agente teclea la dirección y superficie del local (en m 2) y los textos de características
y restricciones. Respecto al código del local, la zona y el tipo se eligen de las listas res-
pectivas. El sistema lo asigna automáticamente el número correlativo. El agente te-
clea también el NIF del usuario y, si no existe, el agente puede optar entre cambiarlo
y añadir un nuevo propietario con aquel NIF.
Cuando se añade un propietario, el NIF es el que se había dado con los datos del local.
El agente teclea la dirección, el teléfono y el nombre y apellidos o la razón social.
Introducir un informe
Introducir un contrato
El vendedor introduce el código del local y le sale toda la información sobre el mismo;
la comprueba y si había algún error, cancela la tarea, y si no hay ninguno, introduce
el NIF del arrendatario. Si el arrendatario existe, salen todos los datos y el vendedor
puede cancelar la tarea o continuar, y modificar los datos o no hacerlo; si no existe,
salen los datos en blanco y puede introducirlos o cancelar la tarea; si introduce los
datos y los confirma, está en el mismo punto que si hubiera encontrado un arrenda-
tario inicialmente. Si continúa, introduce la fecha de inicio y la fecha de la vigencia
del contrato. Entonces puede confirmar la tarea o cancelarla; si la confirma, se impri-
men los datos del contrato, que son éstos:
Buscar locales
Sólo puede darse uno de estos valores, excepto la zona y la superficie mínima, que pue-
den darse a la vez. Cuando se da el NIF de un arrendatario, salen los locales que tiene
alquilados, y si es un arrendatario eventual, salen los locales que cumplen sus requisitos
en cuanto a superficie y zona. Se puede elegir entre que salgan todos los locales o sólo
los disponibles, y que salgan todos los datos de los locales o todos excepto el NIF de pro-
pietario y la dirección. La lista sale en pantalla y opcionalmente se puede imprimir.
Conclusiones
Capítulo V
Este capítulo trata del análisis del software con técnicas orientadas a obje-
tos, aplicando las notaciones y conceptos del UML y siguiendo el ciclo de vida
del Rational Unified Process. Dentro de este ciclo de vida, el análisis y el diseño
constituyen un solo componente del proceso, pero nosotros los considerare-
mos dos etapas diferentes, por razones que se irán explicando a lo largo del
capítulo.
En los apartados siguientes se verá detalladamente el papel del análisis en
relación con la etapa que lo precede, la recogida y documentación de requisi-
tos, y la que lo sigue, el diseño (siempre con la condición de que consideramos
que el desarrollo de software no es un proceso lineal, sino que el ciclo de vida
es iterativo e incremental, y que, por lo tanto, sus etapas se repiten para dife-
rentes partes del software hasta completarlo). Aquí decimos, no obstante, que
el análisis es la primera etapa del desarrollo del software propiamente dicho, y
que consiste en traducir los requisitos a una forma más adecuada para ser la
base de partida de este desarrollo.
En el análisis distinguiremos los pasos siguientes:
El uso que se lleva a cabo del análisis en las diferentes fases del ciclo de vida
del Rational Unified Process puede ser uno de estos tres:
Por poca envergadura que tenga un proyecto de software, será necesario divi-
dir la documentación en paquetes de UML, cada uno de los cuales contendrá
clases, casos de uso u otros elementos del UML. En una división bien hecha, los
paquetes cumplirán dos condiciones:
1) Serán coherentes, es decir, los elementos del mismo paquete estarán fuer-
temente relacionados.
2) Serán poco dependientes unos de otros, es decir, existirán pocas conexio-
nes entre elementos de paquetes distintos.
Los paquetes de análisis constituyen una división del sistema de software que
tiene sentido desde el punto de vista de los expertos en el dominio. Cada paque-
te de análisis corresponde a uno o varios subsistemas enteros, y puede servir para
repartir el trabajo del análisis entre varias personas o equipos.
La descomposición del software en paquetes se establece cuando uno tiene
una idea que considera suficientemente fiable de la cantidad de trabajo y del nú-
mero y la complejidad de los diagramas, situación a la cual se puede haber llega-
do tanto al principio de la etapa de análisis como un tiempo después. Se pueden
asignar paquetes separados a los grandes procesos del negocio o bien a los actores
primarios, y en cualquier caso, los casos de uso entre los que hay relaciones de
extensión, inclusión o generalización deben asignarse al mismo paquete.
Puede suceder que una clase (generalmente una clase de entidad) se utilice
en más de un paquete; si hay diferentes clases compartidas por los mismos pa-
quetes, se puede hacer un paquete aparte con éstas, mientras que si sólo hay una
clase, se la puede dejar fuera de los paquetes. También se puede desarrollar la clase
dentro de un paquete –en el que se creen los objetos, por ejemplo– mientras que
los otros la utilizarían. En cualquier caso, entre los paquetes que utilizan la misma
clase o clases y la clase o paquete mencionado se establecen las relaciones de de-
pendencia correspondientes.
*. Podríamos decir que los paquetes de servicios son opciones de catálogo comercial.
© Editorial UOC 146 Ingeniería del software
puede emitir una factura para un cliente si antes no se ha creado el pedido co-
rrespondiente); en estas circunstancias, es lógico que ambos casos formen parte
del mismo paquete de servicios. En cambio, un caso de uso relativo a la obten-
ción de estadísticas sobre el tiempo transcurrido entre la creación de un pedido
y la emisión de la factura correspondiente podría formar parte de un paquete de
servicios opcional de estadísticas, que unas empresas clientes del software com-
prarían y otras, no (aunque el actor de los tres casos de uso fuera el mismo).
Los paquetes de servicios presentan las características siguientes:
Una relación de agregación podría ser la que hay entre un formato de pantalla y un
botón de la misma, cuando se pone en marcha un proceso.
estos objetos tendrán que ser persistentes, es decir, deben durar más que el pro-
ceso que los crea, lo cual obliga a guardarlos en algún fichero o base de datos.
El hecho de distinguir estos tres tipos de clases da más estabilidad a las clases
de cada uno de ellos. Así, si se modifica la manera en que se presenta la infor-
mación al usuario sin cambiar el procesamiento de los datos, sólo hay que mo-
dificar clases de frontera. Si se cambian los algoritmos de proceso de los datos
sin cambiar la especificación de los datos ni su presentación a los usuarios, sólo
será necesario modificar clases de control. Para cada uso, se realiza un diagrama
de colaboración donde figuran las clases de los tres tipos y las operaciones que
se piden una a la otra.
La notación para este tipo de clases es la siguiente:
Esta notación, igual que esta tipificación de las clases, no forma parte del UML.
Las clases del entorno pueden ser actores de los casos de uso. En cambio, las clases que
sean el modelo de cosas del entorno tratadas por el software sí que son clases de entidades.
Una de las reglas utilizadas para determinar cuáles deben ser las clases fundamentales
es buscar los sustantivos que haya dentro de la documentación textual de los requi-
sitos y, a continuación, revisar esta lista desde diferentes puntos de vista. Ésta no es
una técnica muy aconsejable porque dentro de la documentación textual hay siem-
pre muchos sustantivos que no corresponden a clases, a menudo hay clases impor-
tantes que no se designan explícitamente por un sustantivo e incluso puede suceder
que los desarrolladores –que no deben tener necesariamente una formación lingüís-
tica sólida– tengan dificultades para identificar los sustantivos, sobre todo cuando
son idénticos a formas verbales o adjetivos.
a) Clases sin atributos. Esto indica que el sistema no tiene información para
tratar.
b) Clases sin operaciones, es decir, que no tienen un papel ni activo ni pasi-
vo en ninguna operación.
c) Clases que tienen sólo un atributo; puede ser que realmente no sea una
clase, sino un atributo de otra.
d) Clases con un sólo objeto. Si se da este caso, es necesario observar si hay
otras con atributos y operaciones similares, e intentar unificarlas. También hay
que ver si no es preferible considerar los atributos y operaciones de este único
objeto como atributos y operaciones de clase.
Un formato compatible con la programación podría ser, por ejemplo, atributos cons-
tituidos sólo por letras, cifras y underscores, sin que éstos puedan figurar ni al principio
ni al final. Esto vale para todos los nombres en general: nombres de operaciones, de
clases, de parámetros, etc.
Llegados a este punto, tenemos una lista en principio completa, aunque pro-
visional, de las clases del software.
© Editorial UOC 152 Ingeniería del software
Las clases de entidades con sus atributos son parecidas a las tablas de una base de da-
tos relacional (ya se ha mencionado antes que muchas de las clases de entidad son
persistentes). Pues bien, es como si la tablas estuvieran sin normalizar. De la misma
manera que la normalización hace cambiar el contenido de las tablas en términos de
atributos y de filas, así como hace definir tablas nuevas, también habrá atributos que
pasarán de una clase a otra y se definirán clases nuevas. No obstante, asimismo, con-
viene tener claros los límites de esta analogía: ni hay correspondencia clara entre los
pasos de la normalización de tablas relacionales y los de la revisión de la lista de cla-
ses, ni ésta se encuentra tan formalizada como aquélla, por ahora.
Es necesario establecer las jerarquías de herencia, tarea que se realiza por me-
dio de dos vías, la generalización y la especificación.
Especificación
En lo que respecta a la especificación, hay que tener en cuenta lo siguiente:
1) Sólo hay que añadir una subclase si sus atributos tendrán atributos, opera-
ciones o asociaciones que no tendrá el resto de los objetos de la superclase. Es pre-
ciso evitar sistemáticamente subclases correspondientes a los diferentes estados
que pueden tener los objetos de la superclase. Sólo debe definirse una subclase
para un estado si se da alguna de las circunstancias mencionadas. Como el join de
dos tablas en una base de datos relacional.
2) Si se puede, hay que evitar la doble especificación, es decir, que de una su-
perclase se distingan dos conjuntos independientes de subclases. A veces, esto
puede ser consecuencia del hecho de que la superclase sea en realidad la combi-
nación de dos clases.
© Editorial UOC 153 Capítulo V. Análisis orientado a objetos
Generalización
En cuanto a la generalización, hay que tener en cuenta estos puntos:
cambio, puede ser normal que suceda lo mismo con una superclase concreta,
por ejemplo, como resultado de la situación del punto anterior.
5) Una superclase abstracta puede heredar tanto operaciones concretas como
operaciones abstractas, y sus operaciones propias pueden ser tanto abstractas
como concretas.
6) ¿Qué se puede hacer si hay tres subclases, y un atributo u operación es
común sólo a dos de éstas? Una solución es añadir un nivel intermedio en la
jerarquía de herencia, de manera que las dos clases en cuestión sean subcla-
ses de una que tenga el atributo u operación mencionado. No obstante, si
también existiera un atributo u operación que fuera común a las subclases
primera y tercera, sería necesaria una nueva subclase intermedia, y entonces
la primera subclase lo sería de las dos subclases intermedias, ya que tiene am-
bas operaciones, y por lo tanto estaríamos en un caso de herencia múltiple.
En el caso de una operación, existe la opción adicional de incluirla dentro de
la superclase de las tres subclases y redefinirla como una operación nula den-
tro de la tercera subclase (esto sólo sería viable si la superclase fuera abstrac-
ta, ya que si fuera instanciable y se crease un objeto de ésta que también
fuera de la tercera subclase, le sería aplicable la operación tal como se habría
definido en la superclase). Hablando de la agregación veremos otra solución
a este problema.
4.3.3. Interfaces
Recordad que las interfaces del UML equivalen a clases abstractas sin atribu-
tos y con todas las operaciones abstractas.
En el lugar de las subclases, definidas estáticamente, están las clases que im-
plementan la interfaz, que se pueden sustituir sin modificarla. Esto hace que las
interfaces sean una alternativa a las clases abstractas que puede ser ventajosa
desde el punto de vista de la flexibilidad.
4.3.4. Asociaciones
Hay una asociación entre clases cuando los objetos de una necesitan la cola-
boración de objetos de otra para llevar a cabo sus operaciones.
Por esta razón, es obvio que hay asociaciones entre las clases de frontera y
al menos algunas clases de control, por un lado, y entre clases de entidades,
por otro. Las clases de control que no estén asociadas a clases de frontera esta-
rán asociadas a otras clases de control.
En relación con las asociaciones conviene tener en cuenta lo siguiente:
1) Tanto las asociaciones como los papeles que hacen las clases en las mis-
mas pueden tener nombres. Muchas veces no es necesario dar a la vez nombres
a la asociación y a todos sus papeles, puesto que uno u otro sería banal, pero si
la asociación no tiene nombre, debe tenerlo al menos uno de sus papeles.
2) Entre dos clases (o más) puede haber más de una asociación, con signifi-
cado diferente (y entonces puede ser que estas asociaciones enlacen todas ellas
los mismos objetos concretos o no). Es necesario que sean diferentes los nom-
bres de estas asociaciones o los nombres de sus papeles.
jor, que evitaría estas repeticiones, sería sustituir la clase por dos: una que tuviera el
número de vuelo, la compañía y los aeropuertos de origen y de destino y otra que tu-
viera la fecha y hora de salida, con una asociación de una a varias entre las dos (esto
es análogo al paso de la segunda a la tercera forma normalizada en bases de datos re-
lacionales).
Todos los empleados de una empresa (menos uno) tienen un jefe que es también em-
pleado. Ahora bien, un empleado no puede ser jefe de sí mismo, y en general un ob-
jeto no puede estar asociado a sí mismo, ya que esta situación podría producir un
bucle sin fin.
4.3.5. Agregaciones
De la descripción textual de los casos de uso salen las operaciones de las clases
de frontera y también, de manera más indirecta, las de las clases de control; las de
las clases de entidades muchas veces están implícitas, pero casi siempre son obvias.
Operaciones
7. Ejemplo
opcional la introducción del informe del inspector, y Alquileres, dentro del cual
se podría considerar que los casos de uso 6 y 7 son opcionales y constituyen un
paquete de servicio Consultas separado de Contratos, que comprende los casos
de uso 4 y 5.
El esquema de las relaciones entre los paquetes sería el siguiente:
Comentarios
Las clases Zona e Instalación se descartan porque no tienen ningún atributo y,
por lo tanto, se pueden considerar atributos de otras clases. Inspector y Vendedor,
que no se mencionan en la descripción de los casos de uso, pero sí en las cuestio-
nes que hay que aclarar y sus propuestas, están en el mismo caso. Particular y Em-
presa se descartan como clases (serían subclases de Propietario y de Arrendatario)
porque no tienen ni atributos ni operaciones propias.
Por lo tanto, la primera lista de clases de entidades es ésta: Local, Propietario,
Arrendatario y Arrendatario eventual.
Clase
El atributo nombre del Propietario, Arrendatario y Arrendatario eventual contiene los ape-
llidos y nombre o bien la razón social según si el propietario es una persona física o
una empresa.*
*. Conviene que los nombres de los atributos respeten el formato soportado por los compiladores;
por lo tanto, es mejor no poner acentos ni caracteres especiales.
© Editorial UOC 163 Capítulo V. Análisis orientado a objetos
7.5. Relaciones
Por claridad, el hecho de que una clase es abstracta se indica de dos maneras: con el
nombre en cursiva y con la propiedad abstract. Recordad, sin embargo, que con una
sola es suficiente.
7.5.2. Asociaciones
La asociación entre Propietario y Local se deduce del caso de uso 1: ‘Añadir local’,
y la clase asociativa Contrato se deduce del caso de uso 4: ‘Introducir contrato’.
Fijaos en que la asociación Contrato se establece con la superclase Local y no
con sus subclases, ya que es común a todas. En cambio, las relaciones se estable-
cen con las subclases Propietario y Arrendatario por la razón contraria.
Observad también que se han podido suprimir los atributos NIF_propietario y
NIF_arrendatario de las clases Contrato y Local, porque son redundantes con las
asociaciones.
7.5.3. Agregaciones
vía un mensaje de error al actor. La clase ImpresionContrato imprime los datos del
contrato.
1) Clase PantallaAñadirLocal.
2) Clase PantallaAñadirPropietario
© Editorial UOC 172 Ingeniería del software
3) Clase PantallaIntroducirInforme.
4) Clase PantallaIntroducirContrato
© Editorial UOC 173 Capítulo V. Análisis orientado a objetos
5) Clase PantallaAñadirArrendatario
6) Clase PantallaBuscarLocales
En la cabecera…
… salen los valores de los argumentos de la búsqueda dados por el usuario y, debajo,
la lista de los códigos de los locales que cumplen las condiciones correspondientes.
“Información completa?” sirve para indicar si el usuario quiere que aparezcan tam-
bién la dirección del local y el NIF del propietario. “Selección” sirve para pedir los da-
tos de un local concreto.
© Editorial UOC 174 Ingeniería del software
7) Clase PantallaListaLocales
8) Clase PantallaDatosLocal
Conclusiones
Hemos visto cómo se lleva a cabo la etapa de análisis según un método basa-
do en el Rational Unified Process. El objetivo de esta etapa es modelar los requi-
sitos de una manera adecuada para servir de base del desarrollo propiamente
dicho del software.
Se empieza por revisar los casos de uso especificados en la etapa anterior con
el objetivo de eliminar redundancias y añadir eventuales casos de uso no pedidos
explícitamente por los usuarios, pero que, sin embargo, son necesarios para satis-
facer los requisitos.
Después se identifican las clases de entidades, sus atributos y las relaciones en-
tre ellas, y a continuación se realiza un diagrama de colaboración simplificado
para cada caso de uso con el objetivo de identificar las clases de frontera, de con-
trol y las operaciones de éstas y de las clases de entidades. De este modo se acaba
de obtener la información necesaria para elaborar el diagrama estático de análisis.
Después se realizan diagramas de interacción más detallados para los casos
de uso que sean necesarios, y eventualmente se hacen también diagramas de ac-
tividades, de estados y transiciones. El análisis de la interfaz de usuario consiste
en describir el contenido de las ventanas asociadas a las clases frontera, partien-
do de la lista de las mismas y de la descripción de las tareas futuras. Así se ha
obtenido lo que hemos denominado modelo de análisis.
© Editorial UOC 177 Capítulo VI. Diseño orientado a objetos
Capítulo VI
Este capítulo trata del diseño del software con técnicas orientadas a obje-
tos, aplicando las notaciones y conceptos del UML y siguiendo el ciclo de
vida del Rational Unified Process. Recordemos que, en este ciclo de vida, el
análisis y el diseño constituyen un único componente de proceso, pero no-
sotros los consideraremos dos etapas diferentes porque tienen una finalidad
distinta y porque los resultados de uno y otro son también claramente dife-
rentes.
Se verá con detalle el papel del diseño en relación con la etapa que le precede,
el análisis, y la que le sigue, la realización. Avanzamos, sin embargo, que así
como el análisis formaliza los requisitos recogidos anteriormente, el diseño es el
primer paso de la elaboración de una respuesta a estos requisitos.
Una de las ventajas esperadas de la tecnología orientada a objetos, y quizá la
más importante, es la posibilidad de reutilizar software. Durante el diseño se de-
cide qué se reutiliza y qué se hace de nuevo y, por tanto, en este módulo tene-
mos que tratar las técnicas de reutilización.
Dentro del diseño, distinguiremos los pasos siguientes:
• El diseño arquitectónico.
• El diseño de los casos de uso.
• La obtención del diagrama estático de diseño.
• La especificación de las clases del diseño.
• El diseño de la persistencia.
• El diseño de la interfaz de usuario.
• El diseño de los subsistemas.
© Editorial UOC 178 Ingeniería del software
Está claro que, al especificar los requisitos, se habrán tenido en cuenta las posibilida-
des generales de la tecnología disponible, con el fin de no pedir requisitos imposibles,
ni tampoco infrautilizar esta tecnología en el caso de que permitiera atender más ne-
cesidades del usuario o atenderlas mejor (por ejemplo, hoy día el análisis considera
implícitamente que la presentación de la información a los usuarios se hará mediante
pantallas con apoyo de gráficos e impresoras modernas). No obstante, seguramente
no se habrá tenido en cuenta, si no es de una manera muy general, en qué lenguaje
de programación se implementarán las clases y qué clases programadas en proyectos
anteriores se reutilizarán, o qué sistema de gestión de bases de datos se usará.
Hemos visto que en proyectos muy sencillos se puede llegar a prescindir del
análisis. En cambio, el diseño es siempre necesario.
Preguntar para qué sirve el diseño es lo mismo que preguntar por qué no se
puede implementar directamente el modelo de análisis. Jacobson, Booch y
Rumbaugh mencionan una relación de 1 a 5 entre el coste del análisis y el del di-
seño. Este hecho ya indica que en el modelo del diseño hay muchas más clases y
operaciones que se deben identificar y especificar antes de programarlas.
2. La reutilización
Los patrones (en inglés, patterns) son una manera organizada de recoger la ex-
periencia de los diseñadores de software para volverla a utilizar en casos parecidos.
Cuando un experto trabaja en un problema, raramente inventa una solución
del todo nueva, partiendo de cero, sino que en general recuerda algún caso que
tiene semejanzas con el suyo y adapta la solución. Esto es lo que acostumbramos
a denominar aplicar la experiencia, y se supone que es lo que hace que los exper-
tos lo sean.
© Editorial UOC 181 Capítulo VI. Diseño orientado a objetos
No es necesario decir que sería mucho mejor tener esta experiencia recogida
y documentada de manera más o menos formal para hacerla accesible a otros
expertos o futuros expertos, por un lado, y para hacer más sistemática y cohe-
rente la aplicación de la experiencia por los mismos expertos, por el otro.
Un patrón no es un programa, aunque puede incluir un programa como
muestra, pero no para utilizarlo directamente.
Un patrón es una idea de diseño e implementación detallada y práctica (una
“receta”) que constituye un esbozo de solución de un problema que se presenta
con una cierta frecuencia. Los detalles de esta solución cambian para cada caso al
que se aplica. Por tanto, el núcleo de un patrón es una pareja problema-solución.
En general, un patrón no está vinculado a un método concreto de diseño. De
hecho, muchos patrones se pueden utilizar tanto en diseño orientado a objetos
como en diseño estructurado, si bien los patrones tienden a estar documentados
en forma orientada a objetos, simplemente porque se han divulgado cuando esta
tecnología ya estaba en boga.
Los patrones representan un nuevo intento de aumentar la reusabilidad del
software (como la tecnología de objetos, por ejemplo) partiendo de la idea de
que en casos determinados en los que no se puede reutilizar código, al menos se
puede reutilizar el diseño, como mínimo las ideas básicas.
De igual manera que los entornos de desarrollo orientados a objetos acos-
tumbran a ofrecer una amplia biblioteca de clases predefinidas, en el diseño
orientado a patrones se puede disponer de “recetarios” de patrones preexistentes,
que hay que esperar a que se vayan enriqueciendo con el paso del tiempo. Además,
también hay que esperar a que vayan apareciendo (ya han comenzado a hacerlo)
específicos por dominios.
Como programación en tiempo real, programación distribuida y muchos otros.
El principal beneficio que se espera obtener de la utilización de patrones es
que no hay que pensar una solución para muchos de los problemas de diseño
más frecuentes y, por tanto, se puede concentrar el esfuerzo de diseño en los
aspectos más innovadores de cada proyecto.
Las características más importantes que presentan los patrones son las que
mencionamos continuación:
La inclusión de las frases hechas permite ver que no todos los autores entienden lo mis-
mo por patrón, ya que algunas definiciones afirman que los patrones no tienen que es-
tar vinculados a un lenguaje de programación.
• Patrones sobre clases. Hacen referencia a las relaciones de herencia, que se es-
tablecen en tiempo de compilación.
• Patrones sobre objetos. Hacen referencia a las relaciones entre objetos, las cua-
les pueden variar dinámicamente en tiempo de ejecución.
Las clases que figuran en esta estructura tienen las funciones siguientes:
High Comportamiento Larman Asigna las operaciones a las clases de manera que
Cohesion la cohesión del diseño sea alta (es decir, que cada
clase implemente un conjunto no demasiado
grande de operaciones muy relacionadas).
Low Coupling Comportamiento Larman Asigna las operaciones a las clases de manera
que el acoplamiento entre las clases sea bajo,
lo cual quiere decir que cada clase haga poco
uso de operaciones de otras clases dentro
de las suyas.
Proxy (2) Estructura BMRSS Hace que los clientes de un componente pidan las
operaciones a un representante de éste y no a él
directamente, por razones de eficiencia, control
de acceso u otras.
Singleton Creación GHJV Garantiza que de una clase sólo haya un objeto.
© Editorial UOC 190 Ingeniería del software
View Handler Comportamiento BMRSS Permite a sus clientes abrir, manipular y cerrar
las presentaciones de los datos, y gestiona sus
dependencias.
Whole-part Estructura BMRSS Hace que una operación sobre los componentes
de una estructura pueda cambiar sin que los
componentes cambien de clase.
Para seleccionar el patrón adecuado en cada caso, hay que suponer que se
dispone de un único sistema de patrones (si inicialmente se tenían varios, con-
viene consolidarlos) con un catálogo adecuado.
El proceso de selección del patrón adecuado consiste en seguir los siguientes
pasos:
1) En primer lugar, hay que especificar por escrito el problema que inten-
tamos resolver con patrones, y si se ve que consta de partes bien diferenciadas,
descomponerlo en subproblemas. De cada subproblema se tienen que descri-
bir las fuerzas que le afectan.
2) En segundo lugar, deberemos establecer una primera delimitación del
conjunto de patrones aplicables mediante el catálogo.
3) A continuación, afinaremos más la selección teniendo en cuenta los objeti-
vos de los patrones seleccionados antes. Interesarán tanto los patrones que contem-
plan todo el (sub)problema como también los que pueden resolver alguna parte.
4) Después, añadiremos a la selección todos los patrones relacionados direc-
tamente con los anteriores.
5) Entonces consideraremos los patrones que tienen como objetivo facilitar
las modificaciones del software futuras, e incluiremos en la selección los que
sean aplicables.
6) Más tarde, consideraremos las ventajas e inconvenientes descritos en la
documentación, y evaluaremos qué importancia tienen en el caso considerado.
7) Finalmente, cuando un patrón seleccionado tenga variantes, selecciona-
remos la más adecuada.
d) Son una buena base para la industria de componentes de software. Los mar-
cos bien diseñados permiten que terceras compañías puedan suministrar compo-
nentes o partes de componentes que los desarrolladores podrán añadir.
1) Los patrones son menores. Un marco puede contener varios patrones, nun-
ca lo contrario.
2) Los patrones son más abstractos. Cada vez que se aplica un mismo patrón,
produce programas diferentes.
3) Los patrones son menos especializados, ya que se pueden utilizar en cual-
quier tipo de aplicación.
3. El diseño arquitectónico
El diseño arquitectónico tiene como objetivo definir las grandes líneas del mo-
delo del diseño.
© Editorial UOC 194 Ingeniería del software
Los subsistemas pueden ser propios del proyecto, reutilizados por otros pro-
yectos o software del mercado, como software de sistemas y software intermedia-
rio o middleware.
Se puede partir de la descomposición del software en paquetes hechos en la
etapa de análisis. Las modificaciones que se harán en el mismo normalmente
consistirán en segregar algún subsistema de un paquete de servicio con vistas
a reutilizarlo en varios lugares del software, o a separar en subsistemas diferen-
tes lo que ya está hecho de lo que se tiene que llevar a cabo en el proyecto, o a
permitir que se reparta un paquete entre varios nodos. También conviene tener
en cuenta la posibilidad de aplicar patrones arquitectónicos.
Por interfaz de un subsistema entendemos las operaciones que se pueden pe-
dir al subsistema desde otros subsistemas. Ahora bien, aparte de estas interfaces,
no necesariamente definidas de manera explícita, para conseguir un diseño más
flexible de cara a modificaciones futuras, puede ser conveniente definir interfa-
ces explícitas implementadas por subsistemas que se pueden ir sustituyendo a
lo largo del tiempo, igual que en el caso de interfaces de clases considerado de
manera estándar en el UML.
© Editorial UOC 195 Capítulo VI. Diseño orientado a objetos
a) Conviene que una de las clases de control dirija todo el proceso del caso
de uso.
b) Hay que aprovechar las oportunidades de reutilizar componentes y apli-
car patrones. En lo que respecta a las otras formas de reutilización, el uso de
© Editorial UOC 196 Ingeniería del software
Como vemos, mientras se diseñan los casos de uso se van incorporando cla-
ses y operaciones nuevas al diagrama estático de análisis, que así llega a ser el
diagrama estático de diseño. Una vez terminado el diseño de los casos de uso,
será necesario revisarlo de la manera que describiremos más adelante, lo cual
puede llevar a realizar retoques también en el diseño de los casos de uso.
quiere decir que el diagrama estático de diseño tenga todas las clases que tendrá el
software una vez implementado. Dejando de lado las clases de la interfaz gráfica, si la
herramienta utilizada está orientada a objetos, durante la programación se definirán
muchas más clases que tendrán un papel puramente instrumental y que generalmen-
te no se reflejan en un diagrama, ya que éste sería muy complejo (sin embargo, no se
descarta hacer diagramas estáticos parciales si se cree conveniente).
La revisión del diagrama estático de diseño tiene en cuenta los aspectos si-
guientes: la normalización de los nombres, la reutilización de clases, la adapta-
ción de la herencia en el ámbito soportado por el lenguaje de programación, la
mejora del rendimiento, el incremento de la velocidad y la reducción del trán-
sito de mensajes mediante la agrupación de clases, la adición de clases tempo-
rales para almacenar resultados intermedios, y la revisión desde el punto de
vista de cohesión y acoplamiento.
Todas estas razones pueden justificar la modificación del modelo creado an-
teriormente, y lo haremos en un nuevo diagrama para respetar lo que hemos
pactado con nuestro cliente.
Durante el diseño de los casos de uso, las clases se hacen “a medida” de acuer-
do con las operaciones que deben contener, y sólo se reutilizan clases cuando la
posibilidad de hacerlo es obvia. Ahora se trata de revisar sistemáticamente las po-
sibilidades de reutilizar clases ya existentes de acuerdo con lo que sabemos.
Se podría pensar que, si sabemos que la aplicación se tiene que desarrollar en un lenguaje
que no soporta la herencia múltiple, lo mejor es evitarla desde el principio, de la misma
manera que se recomienda que los nombres respeten las restricciones más habituales en
los lenguajes de programación. No obstante, utilizar la herencia múltiple cuando proceda
puede hacer que el diagrama estático de análisis sea mucho más comprensible.
Para deshacer la herencia múltiple, habrá que utilizar alguna de las técnicas que
describimos a continuación. En todos los casos nos referiremos al mismo ejemplo:
© Editorial UOC 199 Capítulo VI. Diseño orientado a objetos
Hemos visto que, por flexibilidad, es mejor sustituir los atributos con valores
múltiples por una clase aparte que comparta con la primera una asociación de n
© Editorial UOC 202 Ingeniería del software
En todos los proyectos o en casi todos, hay operaciones que permanecen implí-
citas dentro de las especificaciones del análisis. Dado que se deberán implementar
igual que las otras, también conviene tenerlas en cuenta en la fase de diseño.
Indicamos a continuación algunas reglas que nos pueden servir de ayuda a
la hora de encontrar operaciones implícitas:
1) Para toda clase debe haber una operación que la instancie, otra que des-
truya los objetos y operaciones que lean y que pongan los valores de todos los
atributos (naturalmente, quizá estas acciones queden comprendidas dentro de
operaciones que realizan más acciones). La operación que crea un objeto agre-
gado tiene que inicializar a nulo la lista de sus componentes.
2) Para cada asociación debe haber una operación que cree un enlace entre
objetos y otra que lo recorra.
3) Para cada estado que puedan tener los objetos de una clase tiene que ha-
ber una operación que los haga llegar a este estado.
4) Para cada atributo derivado tiene que haber una operación que calcule su
valor.
Sabemos que las clases de control piden operaciones a las clases de frontera.
Estas clases son provisionales y se sustituyen por elementos gráficos (general-
mente también en forma de clases) durante el diseño de la interfaz de usuario. A
menos que éste se hubiera llevado a cabo antes del diseño de los casos de uso,
dentro de la especificación de las operaciones de las clases de control habrá que
sustituir las llamadas operaciones de las clases de frontera por operaciones en ele-
mentos de la interfaz de usuario.
© Editorial UOC 203 Capítulo VI. Diseño orientado a objetos
5.9.1. Cohesión
A veces, no hay más remedio que agrupar varios procesos independientes, que no son
propios de ninguna clase, en una sola. Por eso, existen las clases de utilidad del UML
y el patrón Pure Fabrication.
© Editorial UOC 204 Ingeniería del software
5.9.2. Acoplamiento
El acoplamiento de las clases y de los objetos expresa el grado en que éstos de-
penden de otras clases y objetos para llevar a cabo su responsabilidad.
Cuanto más acoplamiento tenga una clase, más se verá afectada por cambios
en otras y, por tanto, se deberá modificar más a menudo. Existen varias formas
de acoplamiento:
6. Diseño de la persistencia
Cuando un proceso acaba, libera la memoria que utilizaba y todo lo que ha-
bía, en principio, se pierde. Si un objeto debe tener una vida más larga que el
proceso que lo crea o, dicho de otra manera, el objeto se crea en un proceso y se
utiliza en procesos posteriores, hay que grabarlo en un sistema de almacena-
miento permanente. Entonces se dice que dicho objeto se ha hecho persistente
y se habla de un objeto persistente.
Denominamos clases persistentes a las clases que pueden tener objetos per-
sistentes, y clases temporales a las no persistentes.
En relación con un objeto persistente, tiene que ser posible llevar a cabo al me-
nos dos operaciones: grabarlo y leerlo (la operación ‘leer’ también se conoce como
‘materializar’). En la práctica también será necesario poderlo borrar e identificar
entre los otros objetos persistentes de la misma clase.
De un objeto, se graban los valores de los atributos (es decir, lo que se deno-
mina estado del objeto). Ahora bien, es posible que no todos los atributos de un
objeto persistente sean persistentes. El estado persistente del objeto en cuestión
lo constituyen los valores de los atributos que se hacen persistentes. Los objetos
persistentes de una clase se pueden leer de dos maneras: o bien todos a la vez al
comienzo del proceso, o bien cada uno cuando es necesario (modalidad de ma-
terialización según demanda).
Podemos distinguir tres tipos de sistemas de almacenamiento según la ma-
nera como se implementa la persistencia: bases de datos orientadas a objetos, ba-
ses de datos relacionales y ficheros clásicos, y bases de datos object-relational.
© Editorial UOC 206 Ingeniería del software
1) Hacer que cada clase persistente tenga operaciones para que los objetos se
graben, borren, etc., por sí mismos. Esta opción tiene la ventaja de que es más
© Editorial UOC 207 Capítulo VI. Diseño orientado a objetos
eficiente que las otras, dado que requiere menos llamadas entre objetos, pero
tiene el inconveniente de que la implementación de las clases persistentes de-
penderá de un sistema de gestión de bases de datos concretos por el hecho de
que son clases de entidades que corresponden a entidades del dominio del soft-
ware, lo cual limita la portabilidad de la aplicación.
2) El segundo método define una clase denominada gestor de disco para cada
clase persistente. El gestor de disco accede directamente al fichero o base de da-
tos. Con este método, la clase de entidades se desacopla del sistema de gestión
de base de datos, y tiene la ventaja adicional de que el gestor de disco puede ha-
cer de memoria caché de los objetos de la clase de entidades (si los objetos leídos
se materializan dentro de instancias del gestor antes de crear instancias de la clase
de entidades). Ahora bien, esta solución es menos eficiente que la anterior.
3) El tercer método es una mezcla de los anteriores y consiste en crear los
gestores de disco y además añadir operaciones de grabación, lectura, etc., a las
clases del dominio. La diferencia con el primer método es que las operaciones
de la clase no implementan la persistencia directamente, sino que llaman ope-
raciones del gestor de disco.
Con el fin de aislar las clases de entidades del sistema de gestión de bases de
datos, es muy útil implementar la persistencia por medio de un marco.
Los pasos para llegar a obtener la definición de esta estructura serán los si-
guientes:
1) Definir una tabla para cada clase, que contendría tanto los atributos pro-
pios de la clase como los heredados.
2) Crear una tabla para la superclase y una complementaria para cada subcla-
se de ésta que tenga atributos propios. Cada tabla complementaria contendría
los atributos propios de la subclase respectiva más los atributos que identifican
cada fila (es decir, cada objeto) dentro de la tabla de la superclase para juntar todos
los atributos (heredados y no heredados) de cada objeto de la subclase.
Nota terminológica
3) Crear una sola tabla para toda la jerarquía de clases, que tendría los atri-
butos propios de cada subclase más los de la superclase. En cada fila, todos los
atributos que no fuesen aplicables a la subclase a la que pertenece el objeto de-
berían tener el valor nulo.
Tabla Cliente:
NIF: String, clave principal
Nombre: String
...
Tabla Cliente_Especial:
NIF: String, clave principal
Nombre: String
Descuento: Integer
...
© Editorial UOC 210 Ingeniería del software
Evidentemente, esta solución es muy sencilla, pero tiene los siguientes incon-
venientes:
Supresión de la herencia por creación de una tabla para la superclase y una com-
plementaria para subclase
Para suprimir la herencia, también se puede crear una tabla para la super-
clase en la que se graba a todos los clientes. Al mismo tiempo, crearemos una
tabla complementaria para cada subclase con el identificador del objeto y los
atributos específicos de la subclase. Un gestor de disco único se encargará de
leer y hará un join por identificador entre las diferentes tablas con la finali-
dad de obtener toda la información de cada clase. Según la información que
lea, el gestor creará una instancia de una subclase u otra y la llenará con sus
datos.
Tabla Cliente:
NIF: String, clave principal
Nombre: String
...
Tabla Auxiliar Cliente_Especial:
NIF: String, clave principal
Descuento: Integer
...
Esta solución puede ser la mejor opción si sólo una fracción pequeña de los
objetos de la clase pertenecen a la subclase y, además, los valores de los atributos
© Editorial UOC 211 Capítulo VI. Diseño orientado a objetos
de ésta son de longitud fija, ya que entonces los valores nulos ocuparían mucho
espacio, si hubiera para todos los objetos de la superclase.
Supresión de la herencia por creación de una tabla única para toda la jerarquía
de herencia
Esta tercera solución es más eficiente en tiempo, pero menos en ocupación
de disco.
La supresión de la herencia por creación de una tabla única para toda la je-
rarquía de herencia consiste en crear una sola tabla con todos los campos, tanto
de la superclase como de todas sus subclases, y añadirle un campo que nos diga
qué subclase del objeto corresponde a cada fila.
Tabla Cliente:
NIF: String, clave principal
Tipo: Integer
Nombre: String
...
Descuento: Integer
....
⎧ 0 si es Cliente
Tipo = ⎨
⎩ 1 si es Cliente_Especial, etc.
Esta solución puede ser buena cuando el espacio ocupado por los valores nu-
los de los atributos no aplicables a todas las subclases sea reducido. Es decir, si
hay pocas subclases, éstas tienen pocos atributos propios o bien casi todos los
atributos son aplicables a la mayoría de los objetos.
© Editorial UOC 212 Ingeniería del software
Lectura recomendada
La aplicación del patrón Singleton garantiza que sólo se cree una instancia de
cada clase gestor, y lo consigue haciendo que la instancia creada sea el valor de un
© Editorial UOC 215 Capítulo VI. Diseño orientado a objetos
En el ejemplo de una clase Persona con hijos, si la base de datos que utilizamos per-
mite tener como campo un array de hijos, modelaremos esta relación como un atri-
buto de persona y evitaremos tener que definir un gestor de disco de hijos. Decimos
“si permite” porque de momento no existe ningún estándar y cada fabricante de sis-
temas de gestión de bases de datos ofrece un modelo propio. Por tanto, se tendrá que
ir con cuidado al escoger una base de datos de este tipo para que satisfaga las necesi-
dades de nuestra empresa.
© Editorial UOC 216 Ingeniería del software
Interfaces alfanuméricas
Las interfaces alfanuméricas por pantalla son una reliquia de la época en que la uni-
dad direccionable dentro de las pantallas no era el píxel, sino el carácter, y se pueden
considerar un caso particular, muy simple, de las interfaces gráficas.
Un objeto de la interfaz puede ser tanto una ventana como un botón, un texto, una
palabra o un carácter dentro de un texto.
El escritorio
El escritorio es el fondo de pantalla que ve el usuario cuando se pone en mar-
cha el sistema y también antes de poner en marcha alguna aplicación. Sobre él
aparecen los objetos de la interfaz gráfica.
• Pulsar el botón y dejarlo ir dos veces seguidas o más sobre un icono (doble
clic, etc.).
Marcar en un punto con la pluma equivale a hacer clic con el ratón, marcar dos veces
equivale a hacer doble clic. Por otro lado, con la pluma se puede arrastrar como con
el ratón.
Las pantallas táctiles son útiles cuando el volumen de datos que se tiene que
introducir es muy pequeño y la entrada consiste esencialmente en selecciones.
Las ventanas
Una ventana viene a ser una pantalla virtual asociada a una aplicación acti-
va, y es un marco dentro del cual aparecen los objetos propios de la aplicación.
Si en un momento dado hay varias aplicaciones activas en un ordenador con
una sola pantalla física, y por tanto con un único escritorio, lo tienen que com-
partir, y la manera de hacerlo es que cada aplicación tenga su ventana (de he-
cho, una aplicación puede tener varias ventanas, como veremos).
La ventana de la aplicación con la que trabaja el usuario en cada momento
recibe la entrada del ratón y el teclado (se dice que “tiene el foco”) y a menudo
© Editorial UOC 220 Ingeniería del software
tapa de forma total o parcial las otras. Por el contrario, las ventanas de las otras
aplicaciones activas permanecen en segundo plano, pero a punto para volver a
aparecer cuando el usuario vuelva a trabajar con la aplicación respectiva.
Hay dos maneras de gestionar el foco de las aplicaciones:
En el caso más general, las ventanas tienen un marco y pueden llevar un tí-
tulo y contener elementos gráficos activos (controles) para las siguientes opera-
ciones:
• Variar su tamaño.
• Maximizarla, que quiere decir hacer que ocupe toda la pantalla.
• Minimizarla, convirtiéndola en un icono. Si se hace doble clic sobre la mis-
ma recupera las dimensiones que tenía antes de la minimización.
• Restaurarla, es decir, restituirle las dimensiones que tenía antes de maximi-
zarla.
• Dividirla en dos, verticalmente u horizontalmente, arrastrando la línea de di-
visión.
• Desplazar el contenido arriba y abajo y a la derecha y a la izquierda (scroll)
por medio de las barras que hay a la derecha y debajo respectivamente.
• Arrastrar toda la ventana, normalmente situando el cursor en la barra de
título.
• Esconderla (es decir, hacerla transparente, de manera que deje ver la ventana
de debajo o el escritorio).
• Cerrarla, acabando o no la aplicación respectiva.
En la figura podéis ver una ventana de aplicación y una cascada de menús: el menú
de barra y dos niveles de menús desplegables.
Elementos estáticos
Los elementos estáticos son elementos fijos y pasivos contenidos dentro de
una ventana o un control complejo: títulos y otras etiquetas, líneas, logotipos,
dibujos que no sean iconos, etc.
Controles simples
Los controles son los componentes activos de la interfaz por medio de los
cuales el usuario interactúa con el software. Los hay simples y compuestos.
Los principales tipos de controles simples son los que citamos a continuación:
En la figura podéis ver un ejemplo de ventana modal con una caja de diálogo, carpeta
con separadores y Check boxes.
© Editorial UOC 224 Ingeniería del software
En la figura podéis observar una caja de diálogo con carpeta con separadores, un conjun-
to de botones de radio (Export Control) y un texto de posibles líneas múltiples con barra
de desplazamiento vertical.
e) Value sets. Son como botones de radio, pero con iconos en lugar de eti-
quetas. Por ejemplo, las paletas de colores.
© Editorial UOC 225 Capítulo VI. Diseño orientado a objetos
g) Spin boxes. Permiten dar un valor, o aumentarlo o disminuirlo por saltos ha-
ciendo clic en unos botones con puntas de flecha.
En la figura se pueden ver ejemplos de listas desplegables (una está desplegada) y al-
gunas spin boxes (Sangría izquierda, derecha y otras).
Controles complejos
Los controles complejos son los que están formados por otros controles.
A continuación mencionamos algunos tipos de controles de esta clase:
a) Listas y listas combo. Sus elementos pueden ser etiquetas o, más rara-
mente, iconos. En las listas combo se puede seleccionar un elemento existen-
te o teclearlo; en cambio, en las listas ordinarias sólo es posible seleccionar
un elemento existente. Las listas y listas combo pueden ser permanentes (con
barras de desplazamiento o no) o desplegables (en este caso tienen un con-
trol para desplegarlas, normalmente un botón con una punta de flecha hacia
abajo).
© Editorial UOC 227 Capítulo VI. Diseño orientado a objetos
b) Tablas o matrices. Así como las listas son unidimensionales, las tablas o ma-
trices son bidimensionales y se organizan en celdas.
Los menús
Un menú es una lista de etiquetas (que denominamos opciones del menú) den-
tro de la cual el usuario puede seleccionar una cada vez haciendo clic con el ratón.
Las opciones del menú pueden representar funciones de una aplicación, ficheros de
una carpeta, ordenadores de una red, valores de una variable, etc.
Las opciones del menú pueden ser palabras o frases cortas o iconos y pueden
tener significados muy variados. Es posible que haya opciones las cuales en un
momento dado no sean seleccionables, y entonces aparecen en gris en lugar de
en negro.
Además de las opciones, puede haber líneas de separación de grupos de opcio-
nes. Cada opción puede ir acompañada de un acelerador (combinación de teclas
equivalente a la opción), un mnemotécnico (una letra equivalente a la opción) y
una marca que indica que se ha seleccionado la opción.
a) Menús permanentes. Son aquellos menús que están asociados a una ven-
tana de aplicación y son visibles mientras la ventana permanece activa. Los más
habituales son los menús de barra.
© Editorial UOC 231 Capítulo VI. Diseño orientado a objetos
b) Menús temporales. Estos menús son visibles sólo cuando el usuario los
abre*, y desaparecen cuando el usuario selecciona un elemento, o bien cuando
suelta el botón del ratón (en algunos casos), o hace clic en otro objeto.
*
. Un menú se abre por ejemplo, seleccionando un elemento del menú de barra o de otro menú
temporal, o bien haciendo clic en un icono.
© Editorial UOC 232 Ingeniería del software
e) Menús emergentes. Estos menús (en inglés, pop_up menus) no forman par-
te de una cascada, sino que surgen (a menudo hacia arriba o hacia la dirección
en que hay más espacio disponible) cuando el usuario hace clic con el ratón
dentro de un área determinada de una ventana o del escritorio. Entre estos tipos
de menús están los asociados a un objeto gráfico, que a menudo se despliegan
con el botón derecho.
© Editorial UOC 233 Capítulo VI. Diseño orientado a objetos
7.1.2. La interacción
A veces intervienen dos objetos: aquél con el cual el usuario trabaja y aquél al
cual transfiere información.
La selección de objetos
La selección de objetos consiste en la identificación por el usuario de un ob-
jeto o más de cara a hacer después una acción o más sobre éstos, pero no sobre
el resto de los objetos.
La selección se realiza principalmente haciendo clic en los objetos con el ra-
tón, pero también se puede llevar a cabo con el cursor si se utilizan las teclas que
lo mueven. Los objetos seleccionados cambian de aspecto.
La selección puede ser de dos tipos:
La activación
Para activar una ventana, hay que hacer clic sobre la misma en cualquier lugar. En-
tonces la ventana pasa a primer término, aparecen los controles de redimensiona-
miento y su marco toma color, mientras que la ventana que antes era activa pierde
los controles, su marco se vuelve gris y queda en segundo término.
La activación de menús emergentes se hace a menudo con el botón derecho del ratón.
Transferencia de datos
La transferencia de datos consiste en mover objetos de un objeto contenedor
(objeto fuente) a otro (objeto de destino).
Las modalidades generales de transferencia de datos que podemos encontrar
son:
• Arrastrar y dejar (en inglés, draf and drop), por manipulación directa.
• Cortar / copiar y pegar (en inglés, cut/copy and paste) mediante el portapape-
les, por manipulación indirecta.
La retroalimentación
La finalidad de la retroalimentación (en inglés, feedback) es que el usuario vea
inmediatamente el efecto de sus acciones, incluso cuando todavía no se han com-
pletado.
• Los cambios de la forma del cursor cuando se sitúa en diferentes partes de una ventana.
• Los cambios de color de los objetos seleccionados.
© Editorial UOC 235 Capítulo VI. Diseño orientado a objetos
• La silueta del objeto fuente que sigue el cursor durante una operación de arrastre,
mientras que el objeto de destino cambia de color cuando se entra en él.
• Los indicadores de progreso de operaciones largas, en forma de barras vacías (gra-
duadas o no) que se van llenando, o de porcentajes que se van actualizando, o de
mensajes.
Estilos de interacción
La interacción con la interfaz de usuario se puede llevar a cabo mediante
menús, formularios, pregunta-respuesta, que puede ser lineal (siempre la mis-
ma serie de preguntas) o jerárquica (cada pregunta depende de las respuestas
anteriores); lenguaje de mandatos, teclas de función, que pueden ser dedicadas
(siempre la misma función) o programables; manipulación directa o lenguaje
natural.
La definición de qué es concreto y qué es abstracto depende del usuario, puesto que
para un matemático el hecho de operar con ecuaciones se podría entender como una
manipulación directa.
En primer lugar, veremos algunas características que conviene que tengan las
interfaces, después estudiaremos el proceso del diseño y, finalmente, haremos
algunas recomendaciones sobre el uso de los distintos elementos gráficos.
© Editorial UOC 237 Capítulo VI. Diseño orientado a objetos
Ejemplo de coherencia
Conviene que los botones en pantallas diferentes que sirven para la misma función
sean iguales en cuanto a forma, medidas, color, texto y, si procede, posición.
o) Facilidad de utilización.
p) Facilidad de aprendizaje.
2) Diseño
La etapa de diseño parte del esquema del contenido de las ventanas y de la
especificación formal de los casos de uso obtenidos en la etapa de análisis.
El esquema del contenido sólo indica qué datos deben figurar en cada venta-
na y cuáles de éstos tienen una lista de valores posibles limitada, y aquellos as-
pectos que deban ser comunes a todas las ventanas de un mismo tipo estarán
fijados por la guía de estilo. A partir de esta información se debe determinar la
mejor manera de representar cada dato con la herramienta de interfaces gráficas
disponible y después establecer el formato de cada ventana, ya sea mediante la
herramienta con que se implementará la interfaz de usuario definitivamente, ya
sea haciendo alguna clase de prototipo que después se tendrá que implementar
de manera fiel.
Teniendo en cuenta el diálogo* descrito dentro de la especificación formal de
los casos de uso, se diseñará el instrumento para seleccionar la función (menús,
barras de herramientas, etc.) y también los controles que servirán para pasar de
una ventana a otra. Habrá que buscar unos iconos adecuados; para asegurarse
de que lo son, se comprobará si los usuarios los reconocen fácilmente.
a) Hay que presentar de manera diferente del resto la opción que se selec-
ciona y las que están inhabilitadas. En el caso de opciones binarias, conviene
© Editorial UOC 241 Capítulo VI. Diseño orientado a objetos
confirmación de una acción conflictiva que haya pedido. Tiene que aparecer en
primer término y recibir el foco. No se tiene que recurrir casi nunca a las cajas
de diálogo modales, ya que hacen perder tiempo al usuario.
b) Si la caja de diálogo puede tapar información que el usuario puede nece-
sitar para tomar la decisión que se le pide, es necesario que sea posible despla-
zarla por la pantalla.
c) Las cajas de diálogo no tienen que llenar toda la pantalla. Pueden tener
doble formato: primero se presenta una caja de diálogo con los controles impres-
cindibles, y se da opción al usuario de desplegar el resto.
d) En una caja de diálogo debe haber al menos un botón para cerrarla. A me-
nudo hay dos, uno para confirmar y otro para cancelar, que se recomienda que
estén separados de los eventuales botones de mando. Se aconseja que los bo-
tones estén alineados horizontalmente (en la parte de abajo, hacia el ángulo de-
recho) o bien verticalmente. Conviene que haya un botón por omisión (es decir,
el botón que se selecciona con la tecla de retorno de carro) con el contorno más
grueso que los otros botones y colocado en la parte superior de una columna de
botones o en el extremo de una fila. El botón de ayuda también debe estar en una
posición destacada.
e) Si hay un número significativo de controles, se deben distribuir en gru-
pos. Los controles de un grupo deben estar relacionados lógicamente, pero no
hace falta que sean del mismo tipo. Los grupos tienen que estar rodeados por
alguna línea o bien deben tener un texto de cabecera del grupo y sus campos
tienen que estar alineados entre sí y sangrados respecto al texto de cabecera. Si
hay varios grupos, los textos de cabecera respectivos tienen que estar alineados.
9. Ejemplo
Otro procedimiento
De acuerdo con lo que se ha especificado en la etapa de análisis habría que prever casos
de uso adicionales para que toda la información se pudiera consultar, modificar y borrar.
En las clases del diagrama estático de diseño se han indicado sólo los atribu-
tos que se han añadido a la versión de análisis para implementar las asociacio-
nes; las operaciones se indican todas.
© Editorial UOC 250 Ingeniería del software
© Editorial UOC 251 Capítulo VI. Diseño orientado a objetos
En Local se han incluido el NIF del propietario y el del arrendatario para im-
plementar las asociaciones de esta clase con Propietario y arrendatario respectiva-
mente; sólo se ha implementado uno de los sentidos de estas asociaciones, ya
que no es necesaria la navegabilidad en sentido contrario. En Contrato se han
añadido el NIF del arrendatario y la zona, tipo y número del local para imple-
mentar las asociaciones correspondientes.
La herencia doble de Polivalente se ha convertido en herencia simple de Tienda-
Almacen sin tener que hacer nada más, ya que no hereda ni atributos ni operaciones
de Oficina.
Sólo se especifica la lista de parámetros de las operaciones cuando es corta,
por razones de espacio y porque ya están descritas completamente en la especi-
ficación de los casos de uso. Sin embargo, cuando se documentan las clases con
herramientas CASE, que a menudo permiten visualizar las listas de parámetros
de varias maneras, sí que se especifican completamente.
Sólo se han incluido las operaciones que figuran en el diseño de los casos de
uso. Todas las clases deben tener una operación para borrar los objetos y es con-
veniente que todas las clases de entidades tengan al menos una operación para
modificar los atributos. Naturalmente, tendría que haber también casos de uso
que las utilizasen.
Supresión de la herencia
Existen dos jerarquías de herencia encabezadas por las clases Local y Clien-
te, respectivamente. Entre las opciones mencionadas para la supresión de la
herencia (una tabla diferente para cada subclase, una tabla para la superclase
y otra para cada subclase, y una sola tabla para todo), hacemos la elección si-
guiente:
Diagrama entidad-relación
El diagrama entidad relación que corresponde a este caso es el que vemos a
continuación:
© Editorial UOC 253 Capítulo VI. Diseño orientado a objetos
• tabla_clientes, con las columnas NIF, nombre, direccion y telefono. La clave prima-
ria es NIF.
• tabla_eventuales_arrendatarios, con las columnas NIF, tipo_local, zona1, ...,
zona5, superficie_minima y requisitos_varios. NIF es la clave primaria y a la vez
clave secundaria correspondiente a NIF de tabla_clientes.
• tabla_locales, con las columnas zona, tipo, numero, direccion, superficie, carac-
teristicas, NIF_propietario, accesibilidad, instalaciones, agente, inspector, volumen
y caracteristicas_polivalente. La clave primaria se compone de los atributos zo-
na, tipo y numero y NIF_propietario es clave secundaria correspondiente a NIF
de tabla_clientes.
• tabla_contratos, con las columnas zona, tipo, numero, NIF_arrendatario,
fecha_inicio, fecha_fin y vendedor. La clave primaria se compone de los atri-
butos zona, tipo, numero, NIF_arrendatario y fecha_inicio. Hay dos claves se-
cundarias NIF_arrendatario correspondientes a NIF de tabla_clientes, y otra
compuesta de los atributos zona, tipo y numero que corresponde a la clave
primaria de tabla_locales.
En lo que respecta a los índices, debería haber uno por cada clave primaria.
En principio, no hace falta índice para ninguna de las claves secundarias.
por la clave primaria con los valores de todas las columnas. La operación fi-
laAObjeto crea un objeto de Local y mueve estos valores uno a uno a sus atri-
butos. La operación objetoAFila mueve uno a uno los atributos del objeto de
Local a los valores de las columnas de una fila de tabla_locales. La operación
grabarFila graba esta fila en tabla_locales. La operación consultar hace una con-
sulta en tabla_locales con una condición que dependerá de cuáles de los pará-
metros tengan un valor no nulo y llama filaAObjeto para cada una de las filas
obtenidas.
b) GestorCliente se instancia al poner en marcha el sistema por medio de la
operación crear. La operación leerFila lee una fila de tabla_clientes y otra de
tabla_eventuales_arrendatarios identificadas por la clave primaria, y la opera-
ción filaAObjeto crea un objeto de EventualArrendatario, si alguno de los atribu-
tos específicos de esta subclase tiene un valor no nulo, o un objeto de Cliente
y le mueve los valores de las filas mencionadas. La operación objetoAFila mue-
ve uno a uno los atributos del objeto de Cliente a los valores de las columnas
de una fila de tabla_clientes y otra de tabla_eventuales_arrendatarios. La opera-
ción grabarFila graba la primera de estas filas siempre y la segunda sólo si al-
guno de los atributos específicos de EventualArrendatario tiene un valor no
nulo.
c) GestorContrato se instancia al poner en marcha el sistema por medio de la
operación crear. La operación leerFila lee una fila de tabla_contratos identificada
por la clave primaria con los valores de todas las columnas y la operación fila-
AObjeto crea un objeto de Local y mueve estos valores uno a uno a sus atributos.
La operación objetoAFila mueve uno a uno los atributos del objeto de Contrato a
los valores de las columnas de una fila de tabla_contratos. La operación grabarFila
graba esta fila en tabla_contratos.
• Los datos de tipo textual se presentarán en forma de áreas de texto con barra
de desplazamiento vertical, ya que permiten textos medianamente largos y
son menos incómodas que las que tienen también barra de desplazamiento
horizontal.
• Los campos de longitud fija se presentarán como campo de texto cuando son
sólo de salida. Cuando son también de entrada, si el número de valores po-
sibles es reducido, el valor se escogerá de una lista (una lista combo, si se pue-
den añadir valores y una lista ordinaria, en caso contrario); en lugar de una
lista ordinaria de menos de seis valores fijos se utilizará un conjunto de bo-
tones de radio.
• Para datos booleanos, utilizaremos check boxes.
Los menús
Las opciones del sistema de menús son las que corresponden a los casos de
uso más las opciones de salir del sistema y de llamar la ayuda en línea. Puesto
que son pocas y caben en el menú de barra, no es preciso menús desplegables.
Tampoco es necesaria una barra de herramientas, ya que sería una duplicación
del menú de barra con iconos en lugar de etiquetas.
El menú de barra sale en la parte superior de la pantalla inicial y tiene las
entradas correspondientes a estas etiquetas, de izquierda a derecha: ‘Salir’, ‘Al-
ta local’, ‘Informe’, ‘Contrato’, ‘Eventual arrendatario’, ‘Locales’, ‘Propietario’,
‘Arrendatario’ y ‘Ayuda’. ‘Salir’ se ha puesto como primera opción y ‘Ayuda’
como última porque es la misma colocación que en el resto del software que
utilizan los usuarios. Se ha utilizado la etiqueta ‘Alta local’ en lugar de ‘Local’
porque la última se parece demasiado a otra.
No todas las ventanas modales deben tener los tres botones indicados. Por
ejemplo, una ventana que simplemente presente un mensaje muy fácil de in-
terpretar sólo debe tener un botón ‘Salir’.
Como hemos visto, los subsistemas coinciden con los paquetes establecidos
en la etapa de análisis. Estos paquetes son los que vemos a continuación:
a) BasicoLocales comprende las clases Local con todas sus subclases y Cliente
con su subclase Propietario, y los gestores de disco correspondientes. En lo que
respecta a los casos de uso, incluye el 1 ‘Añadir local’ y el 2 ‘Añadir propietario’.
© Editorial UOC 259 Capítulo VI. Diseño orientado a objetos
Conclusiones
Capítulo VII
Todos sabemos que cada vez son más raros los ordenadores que no forman
parte de una red (más bien, tendríamos que decir de la red mundial). A pesar de
que cada uno de los ordenadores de una red podría tener un software indepen-
diente que se ejecutase sólo de forma local, en muchas aplicaciones es ventajoso
que colaboren distintos ordenadores; las modalidades, conceptos y herramien-
tas básicas para esta colaboración es lo que se ve de forma introductoria, cierta-
mente en este capítulo.
Por un lado, las tarjetas perforadas fueron arrinconadas por los terminales de panta-
lla, y después las sustituyeron los microordenadores, que al principio las emulaban;
© Editorial UOC 262 Ingeniería del software
Los entornos distribuidos fueron creados para alcanzar los siguientes objetivos:
Por ejemplo, en un sistema abierto no hace falta que todos los sistemas operativos
sean de tipo Unix, ni es necesario prescindir de los sistemas operativos propios de
una marca, siempre que todos los utilizados cumplan las normas que posibiliten el
grado necesario de comunicación mediante unas interfaces adecuadas (dicho de otro
modo: que un sistema sea o no abierto no es cosa de los productos en sí, sino de sus
interfaces).
Por lo tanto, con el fin de conseguir un sistema abierto, sería necesario evitar
los siguientes aspectos:
• Traducción de aplicaciones.
Ejemplo
Este modelo se puede expandir horizontalmente a todos los niveles con una
cierta facilidad. El inconveniente principal es la fuerte dependencia de las plata-
formas utilizadas.
3.2. CORBA
1) Interfaz
Sabemos que en el software orientado a objetos, y como consecuencia de su
encapsulación, los objetos se comunican por medio de mensajes en los que se
© Editorial UOC 270 Ingeniería del software
Como diferencias un poco significativas, encontramos que las interfaces de UML no in-
cluyen atributos y las de CORBA sí (pero esta diferencia no tiene ninguna repercusión
efectiva, ya que un atributo puede ser sustituido por dos operaciones, una que le pone
el valor y otra que lo lee), y que en CORBA no hay operaciones ni atributos de clase.
porque no puede haber objetos que las satisfagan directamente, sino sólo median-
te interfaces derivadas de ellas.
Puede darse herencia múltiple –por lo menos, la hay entre las interfaces estándar
mencionadas– pero es estrictamente aditiva (es decir, no hay coincidencia de nom-
bres entre las operaciones o atributos que se heredan de interfaces básicas diferentes).
En las interfaces estándar se dan algunos casos de polimorfismo; en estos casos, ope-
raciones del mismo nombre se comportan en el caso de la interfaz derivada de forma
diferente que en el caso de la interfaz básica.
2) Objeto
Dentro de este modelo, un objeto es una entidad que proporciona servicios
(operaciones) a las entidades que se los pidan (los clientes). Los objetos tienen
identidad, interfaz e implementación.
3) Referencia a un objeto
Una referencia a objeto es algo que identifica el mismo objeto cada vez que
se utiliza; un objeto puede tener varias referencias diferentes. El formato y el va-
lor de las referencias a objetos pueden depender del ORB.
No es obligado que no pueda haber nunca dos objetos con la misma referencia, pero
sí que lo es que no pueda haberlos dentro de un ámbito espacial y temporal suficien-
temente amplio como para que los conflictos sean prácticamente imposibles.
4) Tipo de objeto
Un tipo de objeto es un tipo cuyos miembros son referencias a objetos. Un tipo
de objeto corresponde a una interfaz, en el sentido de que los objetos correspon-
dientes a las referencias de un tipo satisfacen la interfaz correspondiente.
5) Petición (request)
La petición es el mensaje de un objeto cliente a un objeto servidor para soli-
citar la ejecución de un método de este último objeto. Una petición comprende
la identificación del objeto que la debe hacer, una operación, cero o más argu-
© Editorial UOC 272 Ingeniería del software
6) Operación y método
Dentro de una petición se invoca una operación de una interfaz, pero lo que
se ejecuta realmente es un método que forma parte de la implementación del
objeto servidor al que está dirigida la operación.
• Aplicaciones del cliente: por medio de CORBA, los clientes efectúan peti-
ciones con las que solicitan operaciones sobre objetos de los servidores me-
© Editorial UOC 274 Ingeniería del software
máticamente, y los demás lo hacen según la jerarquía por medio del activa-
dor del adaptador.
3.2.5. IDL
• un stub;
© Editorial UOC 277 Capítulo VII. Introducción al software...
• un esqueleto;
• un fichero de cabecera, que contiene definiciones de tipos de datos como es-
tructuras y constantes, y se incluye dentro de las aplicaciones de los clientes
y de los servidores.
... son tipos con posibilidad de herencia, cuyos valores no tienen identidad.
Para que una aplicación pueda entrar en el entorno de CORBA, antes es ne-
cesario hacer lo siguiente:
• Inicializarla dentro del entorno de un ORB o más –primero– y después tal vez
también dentro del respectivo entorno del adaptador de objetos.
© Editorial UOC 278 Ingeniería del software
y los monitores que se interponen dinámicamente entre los objetos, y los len-
guajes de tipificación dinámica, como por ejemplo LISP.
Para todas las peticiones a un mismo objeto se utiliza la misma rutina, deno-
minada rutina de implementación dinámica (DIR); para un mismo lenguaje de
programación, todas las llamadas a la DIR tienen los mismos argumentos.
Características comunes
A pesar de no formar parte del entorno CORBA en sentido estricto, la forma
en que se utilizan los objetos en las especificaciones de los servicios de objetos
respeta muchos de sus principios:
• Son servicios genéricos, en el sentido de que son independientes del tipo del
cliente y también –en general– del tipo de datos pasados en las peticiones.
• Generalmente, están implementados en forma de objetos de CORBA que se
pueden activar local o remotamente.
• Con frecuencia, las interfaces permiten implementaciones con diferentes ca-
lidades de servicio.
• Muchos servicios tienen interfaces diferentes para tipos de clientes diferentes.
• Los servicios utilizan con frecuencia interfaces callback; es decir, hacen pe-
ticiones al cliente mediante interfaces que éste debe soportar. De este mo-
© Editorial UOC 280 Ingeniería del software
El servicio de nombres
El servicio de acontecimientos
Por lo que respecta a CORBA, un acontecimiento es un hecho que guarda re-
lación con un objeto y tiene interés para otros objetos, a los que se hace accesi-
ble mediante un mensaje denominado notificación.
La notificación no la hace el objeto –que no tiene por qué saber que hay obje-
tos interesados en saber que se ha producido el acontecimiento–, sino el servicio
de acontecimientos.
Este servicio distingue dos tipos de objetos: suministradores (en inglés, su-
ppliers), que generan acontecimientos, y consumidores, que los procesan. Ade-
más, puede haber un tercer tipo de objetos: los canales de acontecimientos, que
© Editorial UOC 281 Capítulo VII. Introducción al software...
El servicio de notificaciones
Es una extensión del servicio de acontecimientos con las funciones adicio-
nales siguientes:
• La posibilidad de añadir filtros a los proxies para que los clientes puedan es-
pecificar qué acontecimientos quieren recibir.
• La posibilidad que los suministradores de un canal sepan qué tipo de acon-
tecimiento quieren recibir los consumidores de este canal.
• La posibilidad que los consumidores de un canal sepan qué tipos de aconte-
cimiento ofrecen los suministradores de este canal para que los puedan pe-
dir.
• La posibilidad que haya diferentes calidades de servicio a nivel de canal,
proxy y acontecimiento.
• Un depósito opcional de tipos de acontecimientos que permita que los usua-
rios creen filtros de acontecimientos en un lenguaje que se especifica.
El servicio de relaciones
El servicio de relaciones permite crear relaciones, permanentes y temporales,
entre dos objetos o más, sin modificarlos y sin que éstos lo sepan. El concepto de
relación en este servicio es similar al de asociación en UML.
El servicio de propiedades
El servicio de propiedades sirve para definir atributos de los objetos dinámi-
camente, en contraste con las interfaces de IDL, que lo hacen estáticamente.
Los atributos dinámicos o propiedades tienen un nombre, un tipo y un valor
que se puede leer y modificar, así como un modo de propiedad, que puede tomar
estos valores:
El servicio de tiempo
El servicio de tiempo se utiliza para obtener la hora, confirmar el orden en que
se han producido diferentes acontecimientos, generar acontecimientos relativos
al tiempo y calcular el tiempo transcurrido entre dos acontecimientos.
• El servicio básico de la hora (en inglés, Basic Time Service): comprende operacio-
nes para obtener y manipular la hora.
• El servicio de acontecimientos de temporización (en inglés, Timer Event Service):
proporciona operaciones para implementar gestores de acontecimientos dispa-
rados por tiempo y gestionar los acontecimientos que generan.
El servicio de externalización
Externalizar un objeto quiere decir convertirlo en un objeto stream, e inter-
nalizarlo quiere decir hacer lo contrario; el servicio de externalización sirve para
las dos cosas.
Un objeto stream es un área de datos con un cursor, que está en memoria o en
disco o se envía a la red.
La externalización sirve para facilitar la exportación/importación de un objeto
de un proceso, ordenador u ORB a otro (o al mismo proceso), en el que se hará una
internalización para crear un nuevo objeto.
– session pools,
– sesiones, que son conexiones lógicas entre un proceso y un almacén de datos
o más; se puede controlar por programa la asignación de las sesiones y su aso-
ciación a transacciones.
Las sesiones pueden ser transaccionales o no; las transaccionales están aso-
ciadas a recursos, que son transacciones de almacén de datos.
• Los conectores son objetos locales que crean los catálogos. Están registrados
en un registro de conectores único por ORB que soporta la interfaz Conector-
Registry.
ciona interfaces para que los clientes puedan reservar y liberar recursos para co-
ordinarse en su uso compartido.
Este servicio puede funcionar en dos modos:
Un solo hilo por transacción no impide el paralelismo, ya que hay soporte para tran-
sacciones encajadas (consultad el servicio de transacciones más adelante).
antes de acceder a él; dado que existen reservas de distintos modos, el cliente
debe pedir la reserva de una forma que le permita llevar a cabo las actividades
previstas sobre el recurso.
El arbitraje mencionado en la definición del servicio consiste en evitar que va-
rios clientes tengan al mismo tiempo reservas del mismo recurso si las actividades
de estos clientes pudieran entrar en conflicto. El servicio concederá una reserva a
un cliente sólo si ningún otro tiene un reserva de un modo incompatible con el
de la reserva que se pide ahora.
Otro aspecto es el de la liberación de recursos reservados (en inglés, unlocking).
Si se piden reservas en una transacción, el servicio de transacciones libera los re-
cursos cuando ésta acaba; si se piden reservas fuera de transacciones, el cliente
debe liberar explícitamente los recursos reservados. Con frecuencia, las reservas
se mantienen hasta el final de la transacción, pero en el caso de que una transac-
ción no modifique el recurso, lo puede liberar cuando ya sabe que no lo necesi-
tará más.
Locksets
Cada lockset es un conjunto de reservas sobre un mismo recurso; los clientes
deben asignar un lockset a cada recurso.
También encontramos unos coordinadores de reservas, cada uno de los cuales
puede gestionar locksets sobre recursos de un mismo tipo que deban ser liberados
cuando se acaba una misma transacción. La creación de locksets y la liberación de
recursos cuando una transacción se confirma o se aborta es responsabilidad del
cliente.
El servicio de transacciones
Las transacciones son unidades de proceso que o bien llegan a acabar normal-
mente, o bien, en el caso de que se vean abortadas, las actualizaciones en bases de
datos que hubiesen hecho se anulan, como si no hubiesen empezado.
El servicio de transacciones tiene las siguientes funciones:
El servicio de seguridad
El servicio de seguridad tiene estos aspectos:
El servicio de colecciones
Las colecciones son tipos diferentes de agrupaciones de objetos (elementos).
Típicamente, los elementos de una colección o bien son del mismo tipo o bien
tienen una misma interfaz. Los diferentes tipos de colecciones difieren en lo que
respecta a la existencia de una ordenación de los objetos, la existencia de acceso
a los objetos por clave, la existencia de un criterio de igualdad de los objetos y so-
bre si puede haber o no varios objetos con el mismo valor de la clave; diferentes
combinaciones de estas restricciones dan lugar a tipos distintos de colecciones; a
cada tipo de colección le corresponde una interfaz, y todas ellas constituyen una
jerarquía de derivación en la que los niveles, a excepción del más bajo, son inter-
faces abstractas.
Para recorrer los objetos de las colecciones, existen unos cursores denomina-
dos iteradores; hay un tipo diferente de ellos para cada interfaz abstracta de co-
lecciones.
El servicio de consultas
Las consultas no se limitan sólo a accesos de lectura como podría parecer,
sino que son instrucciones declarativas con predicados, que pueden compren-
der valores de atributos e invocaciones y otros servicios de objetos.
© Editorial UOC 290 Ingeniería del software
El resultado de una consulta puede ser una colección obtenida por medio de
la selección de aquellos objetos de una colección fuente (que también podría ser
el resultado de una consulta anterior) que cumplen un predicado dado o bien
puede provenir de un evaluador de consultas a partir de un predicado que se
evaluaría por encima de una colección virtual.
El servicio de consultas puede coordinar varios evaluadores encajados y fede-
rados.
Los objetos pueden participar en el servicio de dos formas:
El servicio de licencias
En el mundo de los objetos distribuidos podemos encontrar objetos de pago;
entonces conviene que sea posible medir el uso de los objetos con vistas a una
posterior facturación. El servicio de licencias da apoyo a esta función.
Se consideran los siguientes tipos de licencias: con periodo de gracia, con listas
de usuarios, con licencias reservadas siempre disponibles y con licencias multiu-
so. Desde otro punto de vista, licencias para una máquina, licencias en el ámbito
de instalación y licencias flotantes para un número máximo de usuarios concu-
rrentes.
El servicio de licencias debe cumplir unas características necesarias para op-
timizar su rendimiento:
• Posibilidad de crecimiento.
• Medidas para evitar que queden licencias asignadas indefinidamente a una
aplicación.
• Garantía de que sólo se utilicen las licencias compradas.
• Prevención de clientes y servidores impostores.
Un productor (en inglés, producer) es una empresa o persona que tiene la pro-
piedad intelectual cuyo uso se quiere controlar.
Un cliente del productor (en inglés, producer client) es cualquier objeto cuyo uso
de una licencia debe ser controlado.
Una política del productor (en inglés, producer policy) es un conjunto de datos
que describe los términos y las condiciones detalladas que rigen el control del uso
de una licencia.
Un documento de licencia proporciona un medio para especificar las limita-
ciones en el uso de la licencia: número de ejemplares de la propiedad intelec-
tual, limitaciones temporales, etc.
tiene el número del tipo de servicio, una referencia a la interfaz que proporciona
el servicio y los valores de las propiedades del servicio.
La información sobre cada tipo de servicio con el que trata un objeto interme-
diario determinado comprende un tipo de interfaz y, opcionalmente, un tipo de
propiedad o más. Un tipo de servicio puede ser subtipo de otro.
Se retorna un identificador de la oferta al exportador, que le permite modifi-
carla o retirarla posteriormente.
Los clientes (importadores) pueden obtener una lista de servicios disponi-
bles (importarlos), en general, o bien del tipo de las páginas amarillas. Por ello se
debe indicar el tipo de servicio deseado, y una restricción especificada en el len-
guaje de restricciones (en inglés, standard constraid language), cuyos elementos
principales son: tipos de valores de propiedades, operadores y literales.
El intermediario busca el servicio que mejor se ajusta a lo que pide el cliente,
pero es éste quien interactúa directamente con el proveedor que elige: utiliza el
tipo de servicio, la restricción especificada y las preferencias que deben servir para
establecer un orden de presentación al importador de las ofertas seleccionadas.
Unas políticas permiten identificar el conjunto de ofertas de servicios dentro
del cual se debe efectuar la búsqueda. Las políticas tienen un nombre y un valor.
Se pueden crear federaciones de objetos intermediarios y, por lo tanto, de los
dominios de tipos de servicio o particiones, en cuyo ámbito se propagan las con-
sultas entre intemediarios.
Los servicios comunes son servicios que pueden ser compartidos por las apli-
caciones y que son de una naturaleza menos básica que los servicios de objetos.
Se dividen en servicios horizontales, que son utilizables en la mayoría de las apli-
caciones, y servicios verticales, que son específicos de un dominio o sector empre-
sarial. Los servicios comunes horizontales son los siguientes:
• de agentes móviles
• mientras que los servicios verticales que se han especificado hasta ahora son
éstos:
• Healthcare (Person Identification Service, Lexicon Query Service)
• Telecoms (Audio/Video Streams, CORBA TC Interworking and SCCP Inter-ORB
Protocol, CORBA/TMN Interworking, Notification Service, Telecoms Log Service)
• Finance (Currency, General Ledger)
• Manufacturing (Distributed Simulation Systems, Product Data Management)
• Transportation (Air Traffic Control).
• La transferencia de agentes, que permite que dos agentes que se tendrán que
comunicar durante la ejecución (por ejemplo, para la monitorización de da-
tos) se coloquen en sistemas de agentes próximos físicamente.
• Los nombres de agentes y de sistemas de agentes, a más de la estandarización
de las operaciones y de las ubicaciones, para permitir identificar el agente del
cual se pide una operación y determinar rápidamente si un sistema de agen-
tes determinado puede soportar un agente que llega a él.
• Las ubicaciones y los tipos de sistemas de agentes, para que un agente pueda
acceder a información sobre un sistema de agentes y los sistemas de agentes
se puedan identificar entre sí.
tre ORB extiende esta transparencia al caso en que los objetos mencionados es-
tán gestionados por ORB diferentes.
La interoperabilidad se basa en los siguientes elementos: la arquitectura de la
interoperabilidad, el soporte de puentes entre ORB y dos tipos de protocolos in-
terORB: los generales (GIOP) y los de Internet (IIOP), además de protocolos espe-
cíficos para determinados entornos, como por ejemplo el DCE (ESIOP).
La arquitectura de la interoperabilidad
La arquitectura de la interoperabilidad proporciona un marco conceptual
para identificar los elementos de la interoperabilidad y definir los aspectos que
deben cumplir. También establece mecanismos y convenciones para conseguir
la interoperabilidad entre ORB producidos de forma independiente; en particu-
lar, introduce el concepto de puentes interORB.
En este contexto, un dominio es un conjunto de objetos (los miembros del do-
minio) que tienen una característica en común.
Un objeto puede pertenecer a varios dominios.
Un dominio es también un objeto. Hay dos tipos de dominios:
Los puentes permiten que los ORB colaboren sin que deban tener en cuenta
los detalles de la implementación del otro; también puede haber puentes que
permitan la interoperabilidad con sistemas no basados en CORBA, como ocurre
en el caso de COM de Microsoft. Además, los puentes pueden servir para deter-
minadas situaciones transitorias, generación automática de implementaciones
para un ORB a partir de implementaciones hechas para otro, etc.
Transitoriamente, se puede empezar a utilizar un nuevo ORB que coexista con el an-
tiguo.
1) No es necesario que los clientes sepan si las referencias de los objetos a los
que dirigen peticiones son locales o remotas, ni si son del mismo ORB o de otro.
2) No es necesario que un ORB pueda tratar las referencias a objetos asigna-
das por otro ORB.
© Editorial UOC 297 Capítulo VII. Introducción al software...
4. RMI
Es preciso definir las referencias para cada servidor que hay que exportar.
Cuando un cliente recibe una referencia en un servidor RMI, obtiene un stub
que da formato a los argumentos, utiliza la serialización y envía la invocación
al servidor. Por la parte del servidor, RMI recibe la invocación y la conecta a un
esqueleto que restituye el formato a los argumentos e invoca la implementación
del método al servidor; una vez ejecutado el método, el esqueleto da formato al
© Editorial UOC 299 Capítulo VII. Introducción al software...
resultado –ya sea un valor o una excepción– y envía el valor al cliente o provoca la
excepción. Tanto los stubs como los esqueletos se generan a partir de la imple-
mentación del servidor.
Por ejemplo, cut and paste, drag and drop, enlace mediante punteros, etc.
La sigla OLE viene de Object Linking and Embedding. En 1990, Microsoft introdujo la tec-
nología OLE 1 como herramienta básica para integrar documentos creados por diferen-
tes aplicaciones y datos multimedia en un documento marco; funcionaba sobre la base
de que cuando una aplicación necesitaba un documento creado por otra, esta última
aplicación se ponía en marcha en una ventana aparte.
nuevo, el OCX, que fue un componente genérico que se incluye dentro del documen-
to marco. Sin embargo, ya no hubo un OLE 3: desde entonces las versiones nuevas de
OLE simplemente forman parte de las versiones nuevas de Windows.
5.3.1. Arquitectura
El Component Object Model (COM) es algo parecido a un ORB para un único or-
denador; DCOM soporta la distribución.
Dentro de la arquitectura podemos encontrar el grupo de los siguientes ele-
mentos: objetos, clases, interfaces y servidores.
Atención
Aquí, el significado del término servidor no es el mismo que cuando se habla de cliente/
servidor; sin embargo, los contenedores se pueden considerar clientes de los servidores
© Editorial UOC 303 Capítulo VII. Introducción al software...
Para definir estas interfaces, Microsoft tiene dos lenguajes: Interface Definition
Language (IDL) y Object Description Language (ODL), que lo contiene. El lenguaje
ODL para la definición de interfaces es un lenguaje textual que se puede codifi-
car manualmente o bien se puede generar mediante Visual C++ de Microsoft.
Las interfaces de COM no generan código en lenguajes de programación, como
las de CORBA, sino únicamente una API en binario para acceder a las interfaces
mediante punteros. Se depositan en una biblioteca de tipo (type library), que tie-
ne un papel similar al del depósito de interfaces de CORBA.
Las interfaces tienen nombres que deben empezar por I, pero en tiempo de
ejecución se identifican por un identificador de interfaz (IID), que es generado
por COM y no repetido, y que también identifica al objeto. Todas las interfaces
de COM derivan de la interfaz IUnknown.
Las interfaces del usuario constan de métodos con sus parámetros, se crean
en IDL y se les aplica el compilador de MDL; de esta compilación se obtienen
servidores intermediarios (proxies) del cliente, stubs del servidor y el código que
hace corresponder los parámetros de unos y otros. Todo esto tiene lugar en C.
Los proxies (servidores intermediarios) y los stubs se utilizan cuando el cliente y el ob-
jeto llamado están en diferentes procesos.
4) Un servidor es un fichero .dll o .exe que contiene una clase o más; cuando
un cliente pide un objeto de un determinado CLSID, COM pide al servidor crear
un objeto de aquella clase, y por este motivo el servidor debe proporcionar la
© Editorial UOC 304 Ingeniería del software
La herencia
No hay referencia múltiple, pero se suple sobre la base de que los objetos pue-
den soportar varias interfaces. Esto permite crear objetos que presenten a los clien-
tes los servicios de los objetos que agrupan (es decir, que los encapsulen), efecto
que se puede conseguir mediante dos métodos:
Acontecimientos
En COM, el soporte de los acontecimientos se hace por medio de los objetos o
las fuentes conectables, que soportan interfaces de salida (además de las de entra-
da); cada función de una de estas interfaces corresponde a un tipo de aconteci-
miento COM que proporciona interfaces, denominadas sumideros, para que otros
objetos se puedan suscribir a los acontecimientos que las fuentes envían codifica-
dos en ODL; no hay nada parecido en los canales de acontecimientos de CORBA.
de moniker del servidor o los servidores del objeto). Para cada servidor, el conte-
nedor crea un lugar donde actuará el servidor y presentará su contenido.
• full servers, que soportan tanto embedding como linking y son aplicaciones au-
tónomas, como Excel y Word;
• miniservers, que sólo soportan embedding y sólo pueden funcionar en la aplica-
ción del contenedor, como ocurre en el caso de Graph de Microsoft.
c) Remotos, que se comunican por medio de RPC ordinarias con los conte-
nedores.
Los OCX
Un OCX es una combinación de un servidor in-process y un servidor de auto-
matización, y soporta embedding, edición in-place, automatización, notificaciones
y, además, objetos conectables, licencias y edición de propiedades.
Los contenedores para los OCX son contenedores para objetos embedded y
edición in-place que, además, tienen unas propiedades de entorno accesibles al
© Editorial UOC 306 Ingeniería del software
OCX y unas propiedades extendidas que gestionan para éste (aparte de las pro-
piedades que gestiona el mismo OCX, que son las propiedades de control).
Propiedades como por ejemplo el color del fondo, el tamaño del tipo de letra, etc.
Los programas clientes pueden invocar métodos que manipulan objetos con
scripts. Para ello hay tres clases de componentes:
1) Servidores de automatización, que son los objetos a los que da acceso una
aplicación con scripts. Puede haber más de uno por aplicación. Tienen métodos,
que son funciones de miembros, y propiedades, cada una de las cuales es un par
de funciones de miembros: una que pone un valor y otra que lo lee.
© Editorial UOC 308 Ingeniería del software
ses y los objetos que tenga el software, independientemente de que deba estar dis-
tribuido o no, son los mismos porque están determinados por la funcionalidad.
En el caso de que el diseño se haga orientado a objetos y con UML, está claro
que el diagrama de despliegue se presta muy bien a describir la distribución de
objetos entre los nodos. De hecho, sin embargo, lo que se distribuirá no serán ob-
jetos y clases individuales, sino componentes más complejos.
Una forma sencilla de distribuir los objetos consiste en partir de la distinción en-
tre clases de frontera, de entidades y de control; podemos establecer estas reglas
orientativas:
a) Las clases de frontera se deben ubicar en las máquinas en que trabajan los
usuarios directamente.
b) Las clases de entidades y los respectivos gestores de disco estarán normal-
mente en las máquinas servidoras que tienen las bases de datos.
c) Las clases de control se colocarán justo con las de frontera o bien con las
de entidades, según tengan más interacción con unas u otras.
• Clases de proceso, que implementan procesos que afectan a varias clases del
dominio.
• Clases de persistencia, que pueden ser gestores de disco o frameworks.
• Clases del sistema, como por ejemplo las de comunicación entre procesos.
1) Distribución de las demás clases antes que las del negocio/dominio. Las
clases de la interfaz con el usuario se asignarían sistemáticamente a los clientes,
y las de persistencia, a los nodos donde debe estar la base de datos, si es única, y
en caso de que no lo sea, en un nodo aparte. Las clases del sistema que corres-
ponden a servicios de uso general se replicarían en todos los nodos, mientras
que las de servicios más específicos se pondrían en un nodo aparte.
Bibliografía
Bibliografía básica
Booch, G.; Rumbaugh, J.; Jacobson, I. (1999). El lenguaje unificado de modelado. Ma-
drid: Addison-Wesley.
Booch, G.; Rumbaugh, J.; Jacobson, I. (1999). UML. El lenguaje de modelado unifica-
do. Guía del usuario. Addison Wesley.
Buschmann, F.; Meunier, R.; Rohnert, H.; Sommerlad, P.; Stal, M. (1996). A Sys-
tem of Patterns. Pattern-Oriented Software Architecture. Addison-Wesley.
Coplien, J.O.; Schmidt, D.C.; Vlissides, J.M.; Kerth, N. (1996). Pattern Languages of
Program Design 2. Addison-Wesley.
Eriksson, H.E.; Penker, M. (1997). UML Toolkit. John Wiley & Sons.
Fowler, M.; Scott, K. (1997). UML Distilled. Reading: Addison-Wesley Longman.
Fowler, M.; Scott, K. (1999). UML gota a gota. Amsterdam: Prentice Hall.
Gamma, E.; Helm, R.; Johnson, R.; Vlissides, J. (1995). Design Patterns: Elements of
Reusable Object Oriented Software. Reading: Addison-Wesley.
Gerarthy, R. y otros (1999). DCOM-CORBA Interoperability. Prentice Hall.
Harrison, N.; Foote, B.; Rohnert, H. (1999). Pattern Languages of Program Design 4.
Addison-Wesley.
Jacobson, I. (1994). Object-Oriented Software Engineering: A Use Case Driven Approach.
Addison- Wesley.
Jacobson, I.; Booch, G.; Rumbaugh, J. (2000). El proceso unificado de desarrollo de
software. Addison-Wesley.
Kruchten, P. (2000). The Rational Unified Process. An Introduction (2.ª ed.). Addison-Wesley.
Larman, C. (1998). Applying UML and Patterns. An Introduction to Object-Oriented Analysis
and Design. Upper Saddle River: Prentice-Hall.
Martin, R.C.; Riehle, D.; Buschmann, F.; Vlissides, J.M. (1997). Pattern Languages
of Program Design 3 (Software Patterns Series). Addison-Wesley.
Meyer, B. (1997). Object-Oriented Software Construction (2.ª ed.). Upper Saddle River:
Prentice-Hall.
Meyer, B. (1999). Construcción de software orientado a objetos (2.ª ed.). Madrid: Prentice-Hall.
Orfali, R.; Harkey, D.; Edwards, J. (1999). Client/Server Survival Guide (3.ª ed.). Nueva
York: John Wiley & Sons.
Pressman, R.S. (1997). Ingeniería del software. Un enfoque práctico (4.ª ed.). Madrid:
McGraw-Hill.
Richter, Ch. (1999). Designing Flexible Object-Oriented Systems with UML. Indianápolis:
MacMillan.
© Editorial UOC 313 Bibliografía
Glosario
actor m Conjunto de papeles de una entidad exterior en relación con el sistema del software
considerado.
atributo de clase m Atributo que tiene un único valor para toda la clase.
atributo derivado m Atributo cuyo valor se puede obtener a partir del de otros atributos.
caso de uso m Interacción entre el software y un actor o más que comporta una o más
acciones.
ciclo de vida clásico m Ciclo de vida en el que se supone que cada etapa se basa en los
productos de la anterior y no se vuelve nunca a etapas anteriores. sin: ciclo de vida en cascada.
© Editorial UOC 315 Glosario
ciclo de vida iterativo e incremental m Todo ciclo de vida en el que se pasa de ma-
nera repetida por las mismas fases desarrollando cada vez un fragmento más de software.
ciclo de vida m Conjunto de etapas del desarrollo de software por las cuales se pasa en
el orden previamente establecido.
clase abstracta f Superclase de la cual no se pueden instanciar objetos porque cada uno
de sus objetos debe pertenecer a alguna de sus subclases.
clase asociativa f Asociación que, por el mero hecho de tener atributos y/o operaciones
propias, llega a ser una clase.
clase de control f Clase no persistente que implementa todos los algoritmos principa-
les de un caso de uso o parte de ellos.
clase de frontera f Clase que implementa una parte de la interfaz de usuario en el ám-
bito de análisis.
clase de utilidad f Recurso para agrupar procesos y/o datos en forma de una clase que
no puede tener objetos.
clase diferida f Clase abstracta que tiene alguna operación abstracta. sin.: clase virtual.
clase persistente f Clase que puede tener objetos que se deban hacer persistentes.
clase temporal f Clase que no es persistente, es decir, cuyos objetos no se pueden hacer
persistentes.
clasificador: Concepto que comprende las clases, las interfaces y los tipos de datos.
© Editorial UOC 316 Ingeniería del software
componente m Conjunto de clases que colaboran para llevar a cabo una función con-
creta. Exteriormente se ve como una clase que implementa una interfaz determinada.
contexto (del software) m Entorno en el cual se utilizará el software que hay que desa-
rrollar; nos interesa especialmente la organización y la terminología.
esqueleto m Correspondencia entre las operaciones de una interfaz y los métodos de los
sirvientes que la implementan. Depende del ORB (es decir, su formato no es estándar) y
del lenguaje de programación. Se obtiene al compilar la interfaz.
© Editorial UOC 317 Glosario
estado de acción m Estado que corresponde al hecho de que se encuentre en curso una
acción determinada.
estado persistente de un objeto m Estado del objeto que está grabado en un sistema
de almacenamiento permanente. Puede ser sólo una parte del estado del objeto, y en un
momento dado puede ser diferente del estado del objeto en memoria.
estímulo m Petición de una operación o comunicación de una señal que llega a un objeto.
general InterORB Protocol Protocolo general para la comunicación directa entre ORB.
sigla: GIOP
herencia f Característica por la cual todas las subclases tienen al menos todos los atri-
butos y operaciones de cada una de sus superclases.
instancia f Un objeto es una instancia de su clase. Este concepto se extiende a los cla-
sificadores.
© Editorial UOC 318 Ingeniería del software
interfaz de usuario f Lo que ven los usuarios del funcionamiento del software.
Internet InterORB Protocol: Forma concreta que toma el GIOP en el caso de que la
conexión entre ORB se haga mediante el protocolo de Internet, TCP/IP.
marco: Conjunto de clases que constituye una aplicación genérica e incompleta que
hay que complementar con clases del usuario.
Sin.: framework.
modelo estático m Modelo que describe las propiedades permanentes del software en
términos de clases y objetos.
object Request Broker Pseudoobjeto que constituye aquella parte de CORBA que se
encarga de transmitir las peticiones de los objetos clientes a los objetos servidores.
sigla: ORB
© Editorial UOC 319 Glosario
objeto persistente m Objeto que no se debe destruir cuando acaba el proceso que lo
ha creado porque lo tiene que utilizar algún proceso posterior. Hay que grabar su estado
en un fichero permanente o base de datos.
paquete m Elemento del modelo que puede contener elementos de cualquier tipo, in-
cluso paquetes. Sirve para fraccionar el modelo según algún criterio.
petición f Mensaje dentro de CORBA de un objeto cliente a un objeto servidor, para pe-
dir la ejecución de una operación contenida en una superficie soportada por este objeto
servidor.
Portable Object Adapter Componente de CORBA, en el lado del servidor, que se en-
carga de transmitir las demandas recibidas del ORB a los sirvientes que implementan los
objetos servidores a los que están dirigidas.
sigla: POA
señal f Estímulo entre dos instancias de clasificadores que puede provocar un aconteci-
miento.
UML: Modelo estándar para la construcción de software orientado a objetos. sigla: Unified
Modeling Language.
visibilidad f Propiedad de diferentes elementos del modelo que representa que son re-
conocidos en un ámbito más o menos grande externo a aquél en el cual se han definido.