Professional Documents
Culture Documents
Todo objeto es instancia de cierta clase que define el conjunto común de características (atributos
y operaciones) que se comparten por todas las instancias de esa clase.
Identidad: Es lo que le hace diferente de los otros objetos. Cada objeto tiene una identidad
única que se gestiona por la tecnología de implementación.
Estado: Valores de atributo de un objeto y las relaciones que tiene el objeto con otros
objetos en un punto en el tiempo.
Comportamiento: Una operación es la especificación de una pieza del comportamiento. Una
implementación de ese comportamiento se denomina método. Invocar una operación
sobre un objeto causará un posible cambio de estado sobre el mismo. El conjunto de todas
las operaciones definidas en el objeto especifica el comportamiento del mismo.
Los objetos forman vínculos a otros objetos y envían mensajes a lo largo de esos vínculos para
realizar funciones del sistema. Cuando un objeto recibe un mensaje, mira en su conjunto de
operaciones para ver si existe una operación cuya firma coincida con la figura del mensaje. Si existe,
invoca la operación.
Los objetos se nombran en una combinación de mayúsculas y minúsculas, comenzando con una
letra minúscula.
Todo valor de atributo objeto tiene la sig. forma: nombre: tipo = valor
Clases
Clase: Descriptor para un conjunto de objetos que comparten los mismos atributos, operaciones,
métodos, relaciones y comportamiento.
El elegir el esquema de clasificación de objetos más apropiado es uno de los aspectos más
importantes del análisis y diseño orientado a objetos, ya que existen una gran cantidad de formas
de clasificar objetos.
La relación entre una clase y objetos de esa clase es una relación <<instantiate>>. Dicho estereotipo
convierte una dependencia ordinaria en una relación de instanciación entre una clase y los objetos
de la misma. Tiene un ámbito de clase. Un estereotipo es una forma de personalizar elementos del
modelado con el fin de obtener una nueva semántica.
Los comportamientos que incluya en una clase dependen por completo de la finalidad del diagrama.
En modelos de análisis solo se necesita mostrar: nombre de la clase, atributos claves, operaciones
claves y estereotipos (si tienen algún tipo de relevancia).
EL nombre de clase empieza con una letra mayúscula y luego la combinación mayúscula-minúscula,
con cada palabra empezando en mayúscula. Hay que tratar de evitar abreviaciones y si existen
palabras específicas del dominio que se utilizan de forma común y entenderán todos los lectores del
modelo, pueden incluirlas, de lo contrario no hay que incluirlas.
Sintaxis atributo:
El nombre del atributo es obligatorio, lo demás es opcional. Los atributos se nombran poniendo en
mayúscula la primera letra de cada palabra con la primera letra de todas en minúsculas.
El tipo de atributo puede ser otra clase o un tipo primitivo: Integer, NaturalIlimitado, Boolean o
String.
La multiplicidad puede proporcionar una forma concisa de expresar ciertas restricciones de negocio
relacionadas con el número de elementos que participan en una relación. Permite modelar dos
elementos totalmente diferentes al utilizar una expresión de multiplicidad sobre un atributo.
Si la expresión de multiplicidad resulta ser un entero mayor que 1, entonces está especificando una
colección.
Existe una diferencia entre un objeto vacío que contiene la cadena vacía y un atributo que apunta
a ninguna parte (null). Cuando se referencia a null significa que el objeto al que apunta todavía no
se ha creado.
El valor inicial le permite especificar el valor que tomará el atributo cuando se instancia un objeto
desde la clase.
Comportamiento de operación
visibilidad nombre(dirección nombreParámetro : tipoParámetro = valorPred,…) : tipoRetorno
Las operaciones son funciones que están unidas a una clase en particular. Tienen: nombre, lista de
parámetros y tipo de retorno. La combinación del nombre de operación, tipos de todos los
parámetros y el tipo de retorno es la firma de la operación. Toda operación de una clase debe tener
una firma única, ya que esta firma es la que asigna a la operación su identidad. Se nombran poniendo
en mayúscula la primera letra de cada palabra con la primera letra de todas en minúscula. Si la
dirección de los parámetros no se especifica, por defecto es in.
Toda operación de consulta tiene una propiedad denominada isQuery. Si se establece esta
propiedad en verdadero, la operación es una operación de consulta, lo que significa que no tiene
efectos secundarios y no cambia el estado del objeto que se invoca. El valor por defecto de isQuery
es false.
Ámbito de aplicación
Los objetos tienen sus propias copias de los atributos definidos en su clase, por lo que diferentes
objetos pueden tener diferentes valores de atributo. De forma similar ocurre con las operaciones.
Éste es el caso normal y decimos que estos atributos y operaciones tienen ámbito de instancia.
Sin embargo, algunas veces se necesita definir atributos que tienen un solo valor compartido para
cada objeto de la clase y, también, se puede necesitar operaciones que no operen sobre una
instancia de clase específica. Decimos que dichos atributos y operaciones tienen ámbito de clase.
Por defecto los atributos y operaciones tienen ámbito de instancia.
Siempre que una operación pueda acceder a otra característica de la clase, está determinado por el
ámbito de aplicación de la operación y el ámbito de la característica a la que quiere acceder.
Los constructores son operaciones especiales que crean nuevas instancias de clase; éstas
operaciones deben tener ámbito de aplicación de clase. Si tuvieran ámbito de aplicación de
instancia, no habría forma de crear la primera instancia de una clase. Los constructores son una
consideración de diseño y por lo general no se muestran en los modelos de análisis.
Una clase puede tener muchos constructores, todos con el mismo nombre, pero cada uno
distinguido por una lista de parámetros diferente. El constructor sin parámetros se conoce como el
constructor predeterminado.
Los objetos de una clase no se destruyen explícitamente por el programa, sino que se dejan a un
recolector de basura automático.
Clases de análisis
La actividad principal del análisis orientado a objetos es encontrar las clases de análisis.
Las clases de análisis son clases que representan una abstracción en el dominio del problema y
deberían mapearse de forma clara y nada ambigua con conceptos de negocio del mundo real
(aspecto más importante).
El trabajo del analista es tratar de clarificar los conceptos de negocio inapropiados o confusos en
algo que pueda formar la base de una clase de análisis.
Por lo tanto, el primer paso para crear software orientado a objetos es aclarar el dominio del
problema.
Es importante que todas las clases en el modelo de análisis sean clases de análisis en lugar de clases
que surgen de consideraciones de diseño. Cuando se llega a un diseño detallado, puede que las
clases de análisis se conviertan en una o más clases de diseño. Podríamos decir que las clases de
análisis capturan atributos candidatos para las clases de diseño.
Encontrar las clases correctas de análisis es la clave del análisis y diseño orientado a objetos. Si las
clases no son correctas en análisis, todo se irá al carajo después (por lo que es muy importante
dedicarle tiempo).
Las clases de análisis deberían presentar un conjunto de atributos de muy alto nivel. Las operaciones
de dichas clases especifican, en un alto nivel, los servicios clave que debe ofrecer la clase. Una
operación en nivel de análisis se desglosará en más de una operación a nivel de diseño.
El analista es libre de añadir cosas siempre que haga que el modelo sea más claro.
La visibilidad, estereotipos y valores etiquetados son opcionales y se pueden mostrar solo si mejoran
el modelo.
La idea de una clase de análisis es que trata de capturar la esencia de la abstracción y deja los
detalles de la implementación hasta que llega al diseño.
Una clase de análisis es una buena clase de análisis si: su nombre refleja su intención, es una
abstracción que modela un elemento específico del dominio del problema, mapea en una
característica claramente identificable del dominio del problema, tiene un pequeño conjunto de
responsabilidades bien definidas, tiene una alta cohesión y tiene un bajo acoplamiento1.
En análisis, trata de modelar un aspecto del dominio del problema de forma precisa y concisa desde
la perspectiva del sistema que trata de construir. Tiene que centrarse en aquellos aspectos del
mundo que son importantes desde la perspectiva del sistema que está creando.
Es crucial que las clases de análisis tengan un conjunto cohesivo2 de responsabilidades que
directamente estén en concordancia con el propósito de la clase y con el elemento del mundo real
que se está modelando.
Una responsabilidad es un contrato u obligación que una clase tiene con sus clientes, traducido en
operaciones.
Análisis nombre/verbo:
Los nombres y frases nominales en el texto indican clases o atributos de clases, y los verbos
y frases verbales indican responsabilidades u operaciones de una clase.
1
Se mide en base al número de clases con las que una clase dada tiene relaciones.
2
Significa que todas las responsabilidades trabajen hacia el mismo objetivo.
Procedimiento:
1. Recopilar tanta información como sea posible de algunas fuentes como: el modelo
de requisitos, el modelo de casos de uso, el glosario del proyecto, etc.
2. Analizar la información destacando: nombres, frases nominales y verbales, verbos.
3. Detectar clases, atributos y operaciones específicas.
Análisis CRC (Clase, Responsabilidades y Colaboradores):
Utiliza la herramienta de análisis más potente del mundo, el post-it.
La nota se divide en tres comportamientos: en el comportamiento superior se graba el
nombre de la clase candidata; en el comportamiento izquierdo las responsabilidades; y en
el derecho los colaboradores.
Los colaboradores son otras clases que pueden colaborar con esta clase para realizar una
parte de la funcionalidad del sistema. Proporciona una forma de grabar relaciones entre
clases.
Siempre se debería utilizar en conjunto con el análisis nombre/verbo.
Procedimiento:
La clave está en separar la información que se recopila del análisis de la información, por lo
que se realiza en dos fases:
1. Fase 1: Tormenta de ideas (recopilar info.)
Todas las ideas son aceptadas, ninguna se debate. Se nombran elementos que
funcionan en su dominio de negocio y sus respectivas responsabilidades. Luego se
trata de identificar las clases en conjunto.
2. Fase 2: Analizar la información
Como se dijo anteriormente, solo serán clases de análisis aquellas clases que
representan una abstracción concisa y clara del dominio del problema.
Estereotipos RUP (solo se nombra, ya que no los hemos visto).
También existen fuentes potenciales para encontrar clases que se deberían considerar: objetos
físicos, el papeleo, interfaces conocidas del mundo exterior y entidades conceptuales que son
cruciales para alguna operación de negocio y que no representan un elemento en concreto.
Además de estas fuentes mencionadas, existen los llamados patrones arquetipos. Éstos son
conceptos de negocio que son tan penetrantes en sistemas de negocios que creemos que son
arquetipos por naturaleza. Existen diversos patrones de arquetipos: CRM, inventario, dinero,
pedido, tercero, relación con terceros, producto, cantidad, regla, etc.
Relaciones
Conexiones semánticas (significativas) entre elementos de modelado; son la forma de UML de
conectar elementos juntos.
Tipos de relaciones:
La navegabilidad nos muestra que es posible pasar desde un objeto de la clase fuente a uno o más
objetos de la clase destino, dependiendo de la multiplicidad. Uno de los objetivos de un buen análisis
de diseño orientado a objetos es reducir el acoplamiento entre clases, y utilizando la navegabilidad,
ésta es una buena forma de hacerlo.
El más recomendado es el modelo 3, ya que no satura los diagramas con demasiadas flechas y
cruces.
Los vínculos entre objetos son instancias de las asociaciones entre sus clases. Es una conexión
semántica, dinámica, entre dos objetos que permite enviar mensajes de un objeto a otro.
Para que exista un vínculo entre dos objetos, debe haber una asociación entre las clases de dichos
objetos.
Que una clase tenga una asociación reflexiva, significa que los objetos de esa clase tienen vínculos
a otros objetos de la misma clase (la clase tiene una asociación consigo misma).
La clase de asociación es la línea de asociación (incluidos todos los nombres de rol y multiplicidades),
la línea de puntos que desciende y el cuadro de clase en el extremo de dicha línea. Define un
conjunto de características que pertenecen a la propia asociación. Pueden tener atributos,
operaciones y otras asociaciones como cualquier clase. Es de utilidad cuando cada vínculo tiene una
identidad única.
Las asociaciones cualificadas sirven para reducir una asociación n-a-muchas a una asociación n-a-1
al especificar un objeto único (o grupo de objetos) desde el destino establecido. Los calificadores
normalmente hacen referencia a un atributo de la clase destino. Ejemplo:
Una dependencia indica una relación entre dos o más elementos, donde un cambio en un elemento
(el proveedor) puede afectar o proporcionar la información necesaria por el otro elemento (el
cliente). Las dependencias pueden ocurrir entre clases, entre paquetes y entre objetos y clases.
Uso: El cliente utiliza alguno de los servicios puestos a disposición por el proveedor para
implementar su propio comportamiento.
Abstracción: Indica una relación entre el cliente y el proveedor, donde el proveedor es más
abstracto que el cliente.
Permiso: El proveedor facilita cierto tipo de permiso para que el cliente pueda acceder a sus
contenidos.
Herencia y polimorfismo
La generalización es una relación entre un elemento más general y un elemento más específico,
donde el elemento más específico es totalmente coherente con el elemento más general, pero
contiene más información. Implica el nivel más alto de dependencia (y, por lo tanto, acoplamiento)
entre dos elementos. Se aplica a todos los clasificadores.
Cuando organizamos clases en una jerarquía de generalización, implícitamente tiene herencia entre
las clases, donde las subclases heredan todas las características de las superclases (atributos,
operaciones, relaciones y restricciones), pudiendo añadir nuevas características y anular
operaciones de la superclase. Para anular una operación de la superclase, una subclase debe
proporcionar una operación con exactamente la misma firma que la operación de la superclase que
desea anular.
Una clase es abstracta si no se puede instanciar, solo sirve para hacer uso de la generalización, osea,
heredar características a sus subclases (está incompleta).
Una clase concreta es una clase que puede proporcionar implementaciones y se puede intanciar
(está completa).
Si una clase tiene más de una superclase directa, estamos en presencia de la herencia múltiple.
El polimorfismo significa “muchas formas”. Por lo que concluimos que, cualquier operación que
pueda implementarse de muchas formas se llamará operación polimórfica.
La encapsulación, la herencia y los polimorfismos son los tres pilares de la orientación a objetos. El
polimorfismo permite diseñar sistemas más sencillos que se pueden acomodar más fácilmente al
cambio, porque permite tratar objetos diferentes de la misma forma.
Diseñar relaciones
Cuando se pasa al diseño, hay que mejorar las relaciones entre las clases de análisis en relaciones
hacia clases de diseños. Para crear un modelo de diseño, se tiene que especificar cómo se van a
realizar estas asociaciones.
Además, todas las asociaciones de diseño deben tener navegabilidad y multiplicidad en ambos
extremos y deberían tener un nombre de asociación, o un nombre de rol en al menos un extremo
destino.
Permite que herramientas de modelado compatibles razonen sobre los modelos UML.
Permite que herramientas de modelado bien equipadas generen código basándose en
expresiones OCL.
Permite ser más preciso en su modelado.
Sintaxis en OCL
El contexto de expresión indica el elemento del modelo UML al que se una la expresión OCL. Define
una instancia contextual que tiene un nombre opcional y un tipo obligatorio.
Existen ocho tipos diferentes de expresiones OCL. Dichas expresiones se dividen en dos categorías,
las que especifican restricciones (inv:, pre: y post:) y las que especifican atributos, cuerpos de
operación y variables locales (init:, body:, def:, let y derive:).
Se puede asignar un nombreExpresión a las operaciones que restringen. Esto permite hacerles
referencia por nombre.
No se les puede asignar un nombre de expresión a las operaciones que definen (init:, body:, def:, let
y derive:).
En cualquier expresión OCL, las operaciones con mayor precedencia se ejecutan primero.
Las demás operaciones no se agregan en el resumen (USAR ESTE RESUMEN Y EL RESUMEN OCL DEL
CAMPUS).
La navegación en OCL es el proceso por el que sigue vínculos de un objeto origen a uno o más
objetos destino.
Además, se puede navegar a una clase de asociación utilizando el nombre de dicha clase con el
operador punto.
Una invariante es una restricción que debe ser cierta para un objeto durante todo el ciclo de vida.
Debe ser cierta para toda instancia del contexto en todo momento. Debe ser cierta en todo estado
consistente del sistema. Todas las expresiones invariantes de OCL son del tipo Boolean.
Sintaxis general: context <TypeName> inv <InvName>: -- expresión booleana que debe verificarse
Cada caso de uso tiene exactamente una realización de caso de uso, por lo tanto, no existe
información adicional a capturar al crear un diagrama de realización de caso de uso.
Recordemos que el modelado orientado a objetos es un proceso iterativo, por lo que podemos
descubrir nuevos requisitos o modificar casos de uso existentes una vez que se empieza a modelar
más en profundidad.
Existen cuatro tipos de diagramas de interacción: diagrama de comunicación, diagrama de
secuencia, diagramas de visión de interacción y diagramas de tiempo. Nosotros solo vamos a ver el
diagrama de secuencia.
A medida que se trabaja en los diagramas de interacción, se empiezan a descubrir cada vez más
operaciones y atributos de las clases de análisis. Los diagramas de clases de análisis se deberían
actualizar con esta información. Los elementos clave en diagramas de interacción son las líneas de
vida y mensajes.
Una línea de vida representa un solo participante en una participación; representa cómo una
instancia de un clasificador específico participa en la interacción.
Un selector es una condición booleana que se puede utilizar para seleccionar una sola instancia que
satisface la condición.
Un mensaje representa un tipo específico de comunicación entre dos líneas de vida en una
interacción. Esta comunicación puede implicar:
Cuando una línea de vida recibe un mensaje de llamada, éste es una petición para la invocación de
una operación que tiene la misma firma que el mensaje; por lo tanto, para cada mensaje de llamada
recibido por una línea de vida, debe hacer una operación correspondiente en el clasificado de esa
línea de vida.
Cuando una línea de vida ejecuta un mensaje, tiene foco de control o activación.
En una llamada de mensaje síncrono, el emisor espera a que el receptor acabe de ejecutar la
operación solicitada.
En una llamada de mensaje asíncrono, el emisor no espera, sino que continúa con el siguiente paso.
En análisis por suerte no hay que preocuparse por esto. Es preferible mostrar todos los mensajes
como síncronos, ya que añade más restricción.
Los rectángulos largos y estrechos en la línea discontinua debajo de la línea de vida indican cuando
una determinada línea de vida tiene foco de control.
Cuando una instancia recibe un mensaje, puede hacer que cambie de estado. Un estado se define
como una condición o situación durante la vida de un objeto durante la que satisface alguna
condición, realiza alguna actividad o espera algún evento.
Todo clasificador puede tener una máquina de estado que describe el ciclo de vida de sus instancias
en términos de los estados en los que pueden estar y los eventos que hacen que pasen a esos
estados.
Se puede mostrar el estado de las instancias en las líneas de vida al utilizar invariantes de estado.
Añadir invariantes de estado a un diagrama de secuencia puede ser una técnica de análisis de mucha
utilidad, porque permite capturar los estados clave en el ciclo de vida de una línea de vida. Estos
estados indican estados importantes del sistema y pueden ser la base de las máquinas de estado.
Los diagramas de secuencia pueden dividirse en áreas denominadas fragmentos combinados. Todo
fragmento combinado tiene un operador, uno o más operandos y cero o más condiciones de
protección. El operando se ejecuta si y solo si la condición de protección se evalúa como verdadero.
Los operadores más importantes son opt, alt, loop, break, ref, par y critical. (VER EN APUNTE)
Las ocurrencias de interacción (ref) son referencias a una interacción. Cuando una ocurrencia de
interacción se sitúa en una interacción, el flujo de interacción a la que hace referencia se incluye en
ese punto.
Máquinas de estado
Todos los diagramas de actividad como los diagramas de máquina de estado, modelan aspectos del
comportamiento dinámico de un sistema, pero tienen semántica y propósitos muy diferentes en el
modelado.
Las Maquinas de estado están basadas en el trabajo de Harel y tienden a utilizarse para modelar la
historia del ciclo de vida de un solo objeto reactivo como una máquina de estado finita, una máquina
que puede existir en un número finito de estados. La máquina realiza transiciones entre estos
estados en respuesta a eventos. Puede modelar con dicha máquina el comportamiento dinámico de
clases, casos de uso, subsistemas o sistemas enteros.
Un objeto reactivo es un objeto que proporciona el contexto para una máquina de estado.
Dichos objetos:
Existen dos tipos de máquinas de estado que comparten una sintaxis común:
Las máquinas de estado se utilizan más comúnmente para modelar el comportamiento dinámico de
clases. Toda clase puede tener una sola máquina de estado de comportamiento que modela todos
los posibles estados, eventos y transiciones para todas las instancias de esa clase.
Toda clase puede también tener una o más máquinas de estado de protocolo. Una clase hereda las
máquinas de estado de protocolo de sus padres. Si una clase tiene más de una máquina de estado,
deben ser coherentes entre sí.
Las máquinas de estado de comportamiento y protocolo para una clase deberían especificar el
comportamiento y protocolo requerido por todos los casos de uso en el que participan las instancias
de la clase.
Tiene utilidad realizar una máquina de estado solo cuando realmente ayuda a entender un ciclo de
vida complejo o comportamiento (deben añadir valor al modelo).
Un diagrama de máquina de estado contiene exactamente una máquina de estado para un solo
objeto reactivo.
Sintaxis:
Los estados son rectángulos redondeados aparte del estado inicial de partida (círculo
relleno) y estado de parada (diana).
Las transiciones indican posibles rutas entre estados y se modelan con una flecha.
Los eventos se escriben sobre las transiciones que activan.
Toda máquina de estado debería tener un estado inicial de partida, que indica el primer estado de
secuencia y, a menos que los estados pasen en un ciclo interminable, también deberían tener un
estado final.
Sintaxis de estado
Todo estado en una máquina de estado de comportamiento puede contener cero o más acciones y
actividades. Las acciones se consideran instantáneas y sin interrupción, mientras que las actividades
adoptan una cantidad de tiempo finito y se pueden interrumpir. Toda acción en un estado está
asociada con una transición interna que está activada por un evento. Puede haber cualquier número
de acciones y transiciones internas dentro de un estado.
Sintaxis transiciones
Toda transición para una máquina de estado de comportamiento tiene tres elementos opcionales:
1. Cero o más eventos: Especifican ocurrencias externas o internas que pueden activar la
transición.
2. Cero o una condición de protección: Ésta es una expresión booleana que debe evaluar en
verdadero antes de que pueda ocurrir la transición.
3. Cero o más acciones: Esto es parte de un trabajo asociado con la transición y ocurre cuando
se activa la transición.
Se lee: “En (evento1 OR evento2), si (condiciónProtección es verdadera) entonces realizar unaAcción
e inmediatamente entrar en estado B”.
Las transiciones en las máquinas de estado de protocolo tienen una sintaxis diferente:
Estados compuestos
Un estado compuesto es un estado que contiene estados anidados, organizados en una o más
máquinas de estado denominadas submáquinas. Cada submáquina existe en su propia región
dentro del ícono estado compuesto. Los estados anidados heredan todas las transiciones de los
estados que contienen.
Los estados anidados pueden ser estados compuestos, pero se debería mantener el anidamiento de
los estados compuestos hasta un máximo de dos o tres niveles si se puede.
1. Estado compuesto sencillo: Estado compuesto que contiene una sola región. Aquellos
eventos que “salgan” del estado compuesto son heredados por cada uno de los subestados
de la submáquina, por lo cual, cualquier subestado puede activar dichos eventos.
2. Estado compuesto ortogonal: Estado compuesto que contiene dos o más submáquinas que
se ejecutan concurrentemente. Cuando entran en el estado compuesto, todas sus
submáquinas empiezan a ejecutarse al mismo tiempo, esto es un fork implícito.
Existen dos formas de salir del estado compuesto:
Ambas submáquinas terminan (unión implícita).
Una de las submáquinas pasa a un estado fuera del superestado, normalmente por
un pseudo estado de salida. Esto no causa una unión; no existe sincronización de
submáquinas y las máquinas restantes simplemente abortan.