Documente Academic
Documente Profesional
Documente Cultură
Ejemplo de aplicación
Introducción.
Este documento explica cómo aplicar el proceso basado en UML, explicado en la asignatura
Arquitectura del Software, para desarrollar sistemas de información. Excepto las fases relativas
a la obtención y descripción de los procesos de negocio, el resto del documento es aplicable al
modelado orientado objetos de cualquier aplicación.
Modelado de Negocio.
Una vez identificados los procesos de negocio en este documento, elegimos uno de ellos,
pedidos a proveedor, para explicar las siguientes etapas. La descripción de este proceso de
negocio se encuentra localizada en la página 4, párrafo 3, de la especificación de la práctica.
...
El sistema deberá realizar la solicitud automática de productos, según el nivel
mínimo establecido para cada tipo de producto para conseguir un aprovisionamiento a nivel
normal (similar a como se hace en los comercios), y sujetos a las restricciones temporales
establecidas por los proveedores y comerciantes. [...] Un operario también puede decidir
realizar un pedido a proveedor. El sistema deberá evitar la duplicidad de pedidos. Todos los
pedidos han de ser aprobados, y pueden ser modificados, por el responsable de
abastecimiento. Éste es el encargado de solucionar los conflictos que puedan aparecer, como
por ejemplo, que un comerciante necesite un pedido lo antes posible y el proveedor no lo
entregue hasta dentro de una semana. En este caso deberá decidir si tramitar un pedido
especial, consultado, si es necesario, al comerciante.
...
1
Paso 2. Identificar los usuarios, departamentos o elementos de la organización implicados
en el proceso de negocio.
El proceso de negocio arranca cuando el sistema decide de forma automática realizar un pedido
a proveedor o cuando un operario lo indica de forma explícita en el sistema de información.
Tanto el sistema, como el operario, estarían jugando el rol de solicitante de pedido a proveedor.
Podemos abordar este apartado tratando de describir de forma informal la interacción entre roles
necesaria para que se cumpla el proceso de negocio con éxito.
En la secuencia de acciones anterior podemos identificar las acciones que realiza cada agente. A
continuación mostraremos una lista de los agentes y las acciones que realiza cada uno de ellos:
Solicitante pedido a proveedor:
- Realizar pedido a proveedor.
Responsable de abastecimiento.
- Evaluar pedido.
- Modificar pedido.
- Aprobar pedido.
- Rechazar pedido.
Proveedor:
- Tramitar pedido.
Operador:
- Registrar la llegada de un pedido.
2
Paso 4. Construir un diagrama de actividades que represente el proceso de negocio.
Haciendo uso de los elementos de los diagramas de actividades de UML trataremos de mostrar
de forma más rigurosa y ordenada el flujo de actividades del proceso de negocio.
Pedido
[sin aprobar]
¿Modificar?
Modificar
Aprobar
Pedido
Pedido
Rechazar
[aprobado]
Pedido
En el diagrama anterior hemos mostrado sólo algunos flujos de datos. La herramienta Rational
Rose no permite definir flujos de datos. Así que los hemos definido como notas de diagrama.
Las acciones del proceso de negocio intercambian una única información: un pedido. En este
caso, el pedido fluiría entre las acciones cambiando de estado. También debemos destacar que el
proveedor queda fuera de la organización. Aunque para tramitar un pedido necesite conocer el
pedido, este conocimiento lo obtendrá a través de una orden de pedido o cualquier otro
documento. Este documento será el que entregue al operario cuando haya que registrar la
llegada del pedido.
3
Paso 5. Listar las actividades.
Ha sido omitida la acción Tramitar pedido, ya que queda fuera de nuestro sistema de
información. Aunque esto estaba claro desde el principio, hemos decidido mostrarla en el
diagrama de actividades para dar continuidad a todas las actividades del sistema relacionadas en
el proceso de negocio.
Es interesante dar una lista de actividades porque, en general, cada una de esas actividades
estará asociada a un caso de uso. También deberemos dar una especificación de las actividades.
La especificación de las actividades nos ayudará a comprenderlas y a detectar ambigüedades en
los requerimientos en una fase temprana del desarrollo.
En este apartado debemos listar aquellas informaciones que fluyen a través del diagrama de
actividades. En nuestro ejemplo sólo hay un tipo de información: Pedido.
Estas informaciones nos serán de ayuda para construir el modelo conceptual. Es evidente que
existen más informaciones de las que aparecen en el diagrama de actividades. Toda la
información necesaria para realizar una acción no aparece en dicho diagrama. Sólo se muestran
las informaciones que intercambian las acciones.
Conviene documentar cada una de las informaciones encontradas. El objetivo es identificar los
atributos de la información. En este caso, un pedido tendrá como atributo un producto, una
cantidad y un proveedor. Como veremos más adelante, algunos de estos atributos se modelarán
en el diagrama conceptual como asociaciones.
Podemos considerar las reglas de negocio como una serie de restricciones de la organización a
la hora de realizar una determinada actividad. También pueden aparecer asociadas a una
información, como restricciones de integridad.
En nuestro proceso de negocio podemos identificar tres. Dos que afectan a la forma de realizar
los pedidos y una que establece el modo de resolver los conflictos en los pedidos. Por lo tanto,
las tres reglas de negocio para este proceso son:
- Cuando se realice un pedido a proveedor debe especificarse la cantidad necesaria para llegar
al nivel normal de stock a partir de la cantidad actual.
- Deberá evitarse la duplicidad de pedidos. No deben existir dos pedidos a proveedor para un
mismo producto.
- Cuando aparezca un conflicto con algún pedido de un asociado, el responsable de
abastecimiento deberá consultar con el asociado la forma de resolver el conflicto: esperar a
que lleguen los productos, según su frecuencia de distribución, o realizar un pedido
especial.
4
Modelado de Requisitos.
Una vez realizado el modelo de negocio, construimos un diagrama de casos de uso a partir de
los diagramas de actividades. Podemos considerar cada actividad como un caso de uso y el
agente que la realiza como el actor del caso de uso. Un diagrama inicial de casos de uso para el
proceso de negocio quedaría de la siguiente manera:
Realizar pedido
Solicitante de
Pedido
Evaluar pedido
Modificar pedido
Responsable de
Abastecimiento
Aprobar pedido
Rechazar pedido
Como podemos apreciar, el diagrama que resulta es bastante sencillo. En general, no conviene
buscar relaciones extend o include entre los casos de usos, a no ser que resulten muy evidentes.
Por ejemplo, si Aprobar pedido permitiera modificar los datos del pedido antes de su
aprobación, incluiríamos una relación include entre Aprobar pedido y Modificar pedido. Estas
relaciones irán apareciendo conforme desarrollemos las plantillas de los casos de uso.
5
En general, hay que evitar una descomposición funcional del diagrama de casos de uso, es decir,
si un caso de uso consta de varios pasos o etapas, no hay que definir un caso de uso para cada
uno de esos pasos y una relación include entre el caso de uso original y los nuevos. En
situaciones en las que dos o más casos de uso posean una etapa en común, podríamos considerar
su factorización.
Para la descripción de los casos de uso podemos utilizar plantillas. UML no propone ningún
modelo de plantilla. Cada cual puede definirse sus propias plantillas, siempre y cuando utilice
las mismas durante todo el proyecto y todos los miembros del equipo de desarrollo sepan
interpretarlas.
Utilizando la plantilla anterior, pasamos a documentar cada uno de los casos de uso.
Realizar pedido.
En este punto habría que consultar al cliente la decisión. Supongamos que el cliente decide que
el operador puede modificar la cantidad a pedir, pero siempre por debajo de la cantidad máxima.
Esta variación se expresará como un porcentaje respecto a la cantidad máxima.
El apartado referente a las extensiones nos dice que existen dos modos distintos de realizar un
pedido, automático o manual. En el modo automático no se podrá modificar la cantidad a pedir,
6
mientras que en el modo manual sí. En el modo manual, el actor deberá confirmar el pedido,
para indicar así que no va a realizar más modificaciones.
Debemos destacar la declaración “[Repetir de 0..n]”, que indica simplemente que el actor puede
repetir la acción cero o más veces.
7
Modificar pedido.
Volvemos a consultar con el cliente la respuesta a las cuestiones que han surgido. Nos dice que
el sistema deberá evitar que el responsable de abastecimiento solicite una cantidad que no pueda
almacenarse en el centro de distribución, es decir, que no sobrepase la cantidad máxima y que
podemos suponer que la cantidad máxima en stock de un producto es lo que en la especificación
se llama “nivel normal”. El caso de uso quedaría del siguiente modo:
Aprobar pedido.
Consultamos de nuevo al cliente para aclarar la cuestión. El cliente nos dice que la
comunicación con el proveedor debe realizarse preferentemente por fax. En el fax aparecerá
toda la información relativa al pedido: número de pedido, fecha y hora de emisión (aprobación),
fecha y hora de recepción, el producto, la cantidad y si es o no especial. Si no es posible enviar
la orden de pedido por fax, se le enviará por correo electrónico. Lo que se pretende es que el
proveedor disponga de algún documento que identifique al pedido durante la entrega.
8
Después de la aclaración del cliente podríamos pensar en crear dos nuevos casos de uso que
extendieran al caso de uso base, Aprobar pedido. Este planteamiento además permitiría incluir
nuevos modos de comunicar un pedido a un proveedor, como por ejemplo, entregar la nueva
orden de pedido en mano durante alguna entrega. El problema que surge con estos dos nuevos
casos de uso es que tendrían nombres como Aprobar pedido y comunicarlo por fax. Resulta más
claro separar el caso de uso base en dos: Aprobar pedido, propiamente dicho, y Comunicar
pedido, existiendo una relación include entre ellos.
9
Registrar llegada de pedido.
Ante las cuestiones anteriormente planteadas, el cliente nos da las siguientes respuestas. Si llega
un pedido no esperado, habrá que notificarlo al responsable de abastecimiento. Este decidirá si
aceptarlo o no. Si lo acepta, deberá registrarse como una variación extraordinaria del stock. Por
otro lado, si la cantidad es inferior a la esperada, el operario aceptará el pedido y notificará la
situación al responsable de abastecimiento. Por último, si el momento de recepción es posterior
al esperado, el operario aceptará el pedido y, de nuevo, lo notificará al responsable de
abastecimiento.
A su vez, la acción Evaluar pedido inesperado llevaría a dos nuevas acciones, dependiendo de
la decisión que tome el responsable de abastecimiento después de la evaluación del pedido.
Estas acciones serían Aceptar pedido inesperado y Rechazar pedido inesperado.
Finalmente, todos estos cambios nos conducirían a la creación de tres nuevos casos de uso,
Evaluar pedido inesperado, Aceptar pedido inesperado y Rechazar pedido inesperado. El caso
de uso Evaluar pedido inesperado es simplemente la recepción de la notificación y la decisión.
A continuación mostramos las plantillas de los otros dos casos de uso:
10
Caso de uso: Aceptar pedido inesperado
Objetivo: aceptar la llegada de un pedido inesperado y registrarlo como variación
extraordinaria del stock
Actores: Responsable de abastecimiento
Precondiciones:
Pasos:
1. A: Acepta el pedido inesperado.
2. S: cdu Registrar variación extraordinaria de stock
Variaciones:
Extensiones:
Cuestiones:
En la plantilla anterior hemos introducido una relación include con el caso de uso Registrar
variación extraordinaria de stock. Este caso de uso aparece en otro proceso de negocio de la
organización.
Cuestión.
Surge la cuestión acerca de quién debe realizar los pedidos conflictivos. El cliente responde a
esta pregunta diciendo que es demasiada responsabilidad para un operario el detectar los
conflictos. El sistema deberá informar a los operarios sobre la existencia de conflictos, pero ha
de ser él mismo el que realice un pedido especial para completar el pedido del asociado,
manteniendo la asociación entre ámbos.
11
Precondiciones:
1. El pedido del asociado debe estar en conflicto
Pasos:
1. A: Identifica el pedido de asociado en conflicto
Variaciones:
Extensiones:
Cuestiones:
Debemos destacar que la detección del pedido conflictivo queda fuera del caso de uso, incluso
del proceso de negocio, ya que estaría relacionado con el proceso de negocio Servir pedidos
comerciantes.
Dentro del anterior caso de uso podemos ver la acción del sistema tramitar pedido especial a
proveedor. Esta acción aparecería como caso de uso en otro proceso de negocio. Es más
adecuado introducirlo como un caso de uso que esté relacionado con Resolver conflicto
mediante la relación include. Por lo tanto, modificaríamos el punto 2.1 de la sección Pasos de la
plantilla con “cdu Pedido especial a proveedor”, que indica una relación include.
También debemos destacar el paso 3.1 introducido para eliminar el conflicto, ya que éste se
origina por la restricción temporal que establece el asociado.
12
Podemos ver que el anterior caso de uso está relacionado con Comunicar pedido mediante la
relación include. El caso de uso Comunicar pedido se definió para los pedidos normales.
Podemos utilizar el mismo caso de uso ya que un pedido especial es una especialización de
pedido.
El proceso que hemos seguido hasta este momento ha sido partir de las actividades del diagrama
de actividades del proceso de negocio para construir un diagrama inicial de casos de uso.
Después hemos rellenado las plantillas para cada uno de ellos y hemos visto cómo van
surgiendo nuevos casos de uso y nuevas relaciones entre ellos. También hemos identificado una
ambigüedad de la especificación relacionada con los pedidos conflictivos.
13
Realizar pedido conflictivo
Centro de
Distribución
(f rom Logical View)
<<extend>>
Realizar pedido manual
<<extend>>
Solicitante de Realizar pedido
Pedido
(f rom Logical View)
Realizar pedido automático
Modificar pedido
Rechazar pedido inesperado
Responsable de
Abastecimiento
(f rom Logical View)
Rechazar pedido
Resolver conflicto
14
Una vez identificados todos los casos de uso, hay que priorizarlos. El cliente decidirá la
funcionalidad que necesita ser desarrollada primero. Los casos de uso en los que nos
centraremos en el primer ciclo de desarrollo son los siguientes:
Realizar pedido manual.
Modificar pedido.
Aprobar pedido.
Rechazar pedido.
Comunicar pedido por fax.
Registrar llegada de pedido.
Podemos revisar la lista de categorías de Larman para ver si nos aparecen nuevos conceptos.
Aparecen Catálogo de productos (categoría catálogos) y Registro de pedidos (categoría registros
de negocio, trabajos, etc.)
Veamos ahora las asociaciones. No es tan importante a este nivel del análisis el encontrar todas
las asociaciones. Identificaremos sólo las “necesita conocer”. El resto irán surgiendo cuando
realicemos los diagramas de interacción.
15
Registro de pedidos - Contiene - Pedidos
Pedido - Asociado - Producto
Pedido especial - Está asociado - Pedido Asociado
Pedido Asociado - Realizado por - Asociado
Centro de Distribución - Posee - Registro de pedidos
Centro de Distribución - Posee - Catálogo
Catálogo - Contiene - Producto
Centro de Distribución - Posee - Stock
Centro de Distribución - Tiene contrato - Proveedor
Proveedor - Suministra - Producto
También hemos identificado una relación de generalización entre Pedido y Pedido Especial.
Cuando estamos construyendo el modelo conceptual no nos debe preocupar encontrar relaciones
de generalización, multiplicidades, etc., pero en este caso como Pedido Especial está asociado a
los mismos conceptos que Pedido y tiene los mismos atributos, hemos decidido mostrar la
generalización.
Después debemos identificar los atributos de los conceptos. En la especificación sólo se hace
referencia a los siguientes atributos:
El resto de atributos irán apareciendo durante las siguientes fases del desarrollo.
Por último, debemos construir un glosario de términos. Los casos de uso ya están
documentados con sus plantillas. Ahora es necesario documentar todos los conceptos y atributos
del modelo conceptual.
16
Solicitante de
Pedido Operario
Responsable de Registra llegada
Abastecimiento Solicita
Sirve Proveedor
Aprueb a/Rechaza/Modifica
Asociado Pedido
Producto Pedido especial
cantidad
1 0..*
0..1
+pedidos 0..*
Contiene Está asociado
1
Registro de pedidos 1
Pedido de asociado Realiza
Asociado
1 cantidad
Posee 0..* 1
1 Posee
Centro de Distribución Catalogo
1 1 1 1
1
Posee
Contiene
1..*
Stock
1..*
cantidad
Producto
nivelMinimo
nivelNormal 1 1
1..*
Suministra
Tiene contrato
1
1..*
Proveedor
17
Modelado de Análisis y Diseño.
En este punto trataremos de determinar las operaciones que demandan los actores del sistema.
Para ello construiremos los llamados Diagramas de Secuencia de Sistema, que consisten en
diagramas de secuencia, en los que sólo intervienen los actores del caso de uso y un objeto que
representa al sistema, donde se muestran los eventos (operaciones) que envían los actores al
sistema. Creamos un diagrama de secuencia de sistema para cada caso de uso.
: Sistema
: Solicitante de
Pedido
nuevoPedidoProveedor(Producto)
modificarPedidoProveedor(Pedido, Cantidad)
confirmarSolicitudPedido(Pedido)
Modificar pedido.
: Sistema
: Responsable de
Abastecimiento
modificarPedido(Pedido, Cantidad)
18
Aprobar pedido.
: Sistema
: Responsable de
Abastecimiento
aprobarPedido(Pedido)
Rechazar pedido.
: Sistema
: Responsable de
Abastecimiento
rechazarPedido(Pedido)
Comunicar pedido.
: Sistema
: Responsable de
Abastecimiento
comunicarPedido(Pedido)
19
Registrar llegada de pedido.
: Sistema
: Responsable de
Abastecimiento
pedidosPendientesProveedor(Proveedor)
confirmarPedido(Pedido)
Este es el apartado más importante dentro del modelado orientado a objetos. El diseño de los
diagramas de colaboración influirá en las propiedades del software que desarrollemos:
reutilización, mantenimiento, etc.
Debemos crear un diagrama de secuencia para cada operación que nos ha aparecido en los
diagramas de secuencia de sistema. El modo de proceder es el siguiente. Primero crearemos un
contrato para cada una de las operaciones. El contrato nos ayudará a precisar la funcionalidad de
la operación. Como ya ocurriera con las plantillas de los casos de uso, podemos definir
cualquier tipo de plantilla para definir las operaciones. Es conveniente que en la plantilla que
utilicemos aparezcan dos apartados: responsabilidades y postcondiciones. El primero de ellos
trate de determinar el ámbito de la operación, es decir, determinar la responsabilidad de la
operación. El segundo nos informa de las modificaciones del estado del sistema (objetos y
relaciones entre los objetos) después de que la operación se ejecute correctamente. Con las
postcondiciones estamos indicando qué es lo que esperamos, pero no cómo conseguirlo.
Para describir el modo en el que la operación lleva a cabo sus responsabilidades y modifica el
estado del sistema utilizamos los diagramas de interacción. En el libro de Larman se recomienda
utilizar diagramas de colaboración. En general, son más compactos y ofrecen más información
(en la herramienta Rational Rose). Los diagramas de colaboración y secuencia son
semánticamente equivalentes. Así que podemos optar por mostrar las interacciones entre objetos
como diagramas de secuencia o de colaboración. En este documento hemos decidido definir las
interacciones utilizando diagramas de secuencia.
20
La plantilla que proponemos para definir los contratos es la siguiente:
nuevoPedidoProveedor
21
Una aspecto importante en la colaboración es determinar cuál será la clase controlador. Hemos
decidido que sea la clase Centro de Distribución, que representa al sistema. Otra elección podría
haber sido la clase ManejadorRealizarPedido, pero sería una clase ficticia con el único
propósito de manejar los eventos del caso de uso Realizar Pedido. Deberíamos optar por esta
segunda opción cuando el caso de uso requiera controlar un estado (no se pueden realizar unas
operaciones antes que otras), cuando la inclusión de las operaciones en la clase que representa al
sistema haga que ésta pierda cohesión (relación entre sus operaciones) o que contenga
demasiadas operaciones.
Establece el
estado "no setProducto(Producto)
confirmado
solicitante" calcularCantidad( )
cantidad := getCantidadMaximaPedido( )
getStockVacante( )
setCantidad(cantidad)
addPedido(nuevoPedido)
En el anterior diagrama de secuencia mostramos los mensajes que hay que enviar para
conseguir la funcionalidad de la operación. Cada uno de esos mensajes supone la ejecución de
un método en alguno de los objetos implicados en la colaboración. Sería conveniente definir un
contrato para las operaciones más complejas, e incluso, definir su propio diagrama de secuencia.
Todo ello con el propósito de no complicar los diagramas de secuencia.
Para distribuir la funcionalidad hemos aplicado los patrones GRASP. El patrón Creador nos
dice que el objeto encargado de crear una instancia de otra clase debe ser aquél que posea la
información necesaria para su inicialización. En este caso, la información para la inicialización
del objeto pedido es Producto, es decir, el producto al que está asociado. El que conoce esta
información es el Centro de Distribución. Por lo tanto, centro de distribución tiene la
responsabilidad de crear e inicializar el nuevo pedido.
22
Por otro lado, una de las responsabilidades de la operación que estamos definiendo es calcular la
cantidad apropiada del pedido. Según el patrón Experto, la responsabilidad debe estar asociada
a los objetos que conozcan esa información. El objeto que conoce la cantidad a pedir es Stock,
mientras que el objeto que conoce al objeto stock es Producto. Finalmente, quien conoce a
producto es Pedido. Esto último es discutible, ya que Centro de Distribución también conoce el
producto. Pero, aplicando el patrón de Bajo acoplamiento decidimos que centro de distribución
no conozca al objeto producto, ya que es pasado como un argumento de uno de sus métodos y lo
pasa como argumento de un mensaje a pedido, para crear la asociación, pero en ningún
momento depende de las operaciones de producto, es decir, un cambio en producto no afectaría
a centro de distribución. El mismo razonamiento podríamos aplicar a la relación entre pedido y
stock. Una opción podría haber sido que pedido pidiera el stock a producto y, él mismo, enviara
el mensaje para el cálculo de la cantidad máxima. Pero esto implicaría introducir una
acoplamiento innecesario entre clases (un pedido no tiene necesidad de saber que existe un
stock). Finalmente, el encargado de registrar el pedido es centro de distribución, ya que
representa al sistema y está asociado a Registro de Pedidos.
modificarPedidoProveedor
23
: Centro de : Pedido : Producto : Stock
: Solicitante de
Distribución
Pedido
aceptable := nuevaCantidad(Cantidad,%Variacion)
cantidadMaxima := getCantidadMaximaStock( )
getNivelNormal( )
cantidadActual := getCantidadActual( )
Devuelve getCantidad( )
"aceptable"
[aceptable] setCantidad(Cantidad)
"aceptable" si:
cantidadActual + cantidad
<= cantidadMaxima - cantidadMaxima * %variación
24
El valor “%variación” es un atributo de la clase Centro de Distribución. Indica el porcentaje de
variación respecto al nivel normal en stock que permitimos cuando un operario modifica la
cantidad a pedir de un producto. Es una política del Centro de Distribución, así que lo adecuado
es que esté en esta clase. Entonces, la información necesaria para determinar si la modificación
es válida la posee la clase Centro de Distribución y la clase Stock, ya que la variación se expresa
en función del nivel normal. Aplicando el patrón Experto lo ideal es que la clase Pedido se
encargue del cálculo, ya que puede acceder al porcentaje de variación (lo toma como argumento
de un método) y a la cantidad máxima en stock (nivel normal) a través de Producto.
confirmarSolicitudPedido
: Centro de : Pedido
: Solicitante de Distribución
Pedido
confirmarSolicitudPedido(Pedido)
confirmado( )
25
Caso de uso: Modificar pedido proveedor.
modificarPedidoProveedor
modificarPedidoProveedorRA(Pedido, Cantidad)
nuevaCantidad(Cantidad)
cantidadMaxima := getCantidadMaximaStock( )
getNivelNormal( )
cantidadActual := getCantidadActual( )
getCantidad( )
[aceptable] setCantidad(Cantidad)
"aceptable" si:
cantidadActual + cantidad <=
CantidadMaxima
Esta operación es muy parecida a modificarPedidoProveedor del caso de uso Realizar pedido
manual. La única diferencia está en la forma de determinar si la modificación es aceptable.
Hemos modificado el nombre de la operación, modificarPedidoProveedorRA, para que no se
confundiera con la anterior, ya que hemos decidido utilizar la misma clase controlador.
26
Caso de uso: Aprobar pedido.
aprobarPedidoProveedor
: Centro de : Pedido
: Responsable de
Distribución
Abastecimiento
aprobarPedido(Pedido)
aprobado( )
comunicarPedidoPorFax
27
: Centro de : Pedido : Producto
: Responsable de : Proveedor
Distribución
Abastecimiento
comunicarPedidoPorFax(Pedido)
comunicarPorFax( )
getProveedor( )
comunicarPorFax(Pedido)
comunicado( )
Para llevar a cabo esta colaboración necesitamos una colaboración que informe al proveedor del
nuevo pedido. El problema está en determinar qué clase debe enviar la orden del envío al
proveedor. Según el patrón Experto, Producto es quien conoce a Proveedor y por tanto
deberíamos añadirle un nuevo método que fuera comunicarPorFax. Aunque esta solución
tendría bajo acoplamiento, comunicarPorFax es una operación que no está relacionada con el
resto de funcionalidad de la clase Producto, es decir, se pierde cohesión. Otra solución sería que
Pedido solicitara el Proveedor a Producto y se encargará de enviar el mensaje de
comunicarPorFax. Esta alternativa permite no romper la cohesión de la clase Producto, pero
introduce un nuevo acoplamiento Proveedor - Pedido. Nos quedamos con esta última solución
debido a que es natural que un pedido conozca a su proveedor.
rechazarPedido
28
: Centro de : Pedido
: Responsable de
Distribución
Abastecimiento
rechazarPedido( )
rechazado( )
pedidosPendientesProveedor
29
: Centro de : Registro de p : Pedido : Producto
: Operario
Distribución pedidos
pedidosPendientesProveedor(Proveedor)
pedidosPendientesProveedor(Proveedor)
prov := getProveedor( )
getProveedor( )
comunicado := estaComunicado( )
Devuelve "p" si
"Proveedor = prov" y "comunicado"
confirmarRecepcion
30
: Centro de : Pedido : Producto : Stock
Distribución
: Operario
confirmarRecepcion(Pedido)
finalizado( )
incrementarStock(cantidad)
incrementar(cantidad)
En este apartado lo que haremos es construir el diagrama de clases a partir del modelo
conceptual y los diagramas de colaboración. En el diagrama de clases sólo mostramos aquellas
clases que han aparecido en los diagramas de colaboración. Mantendremos las asociaciones y
atributos que existen en el modelo conceptual. Incluiremos todos los métodos de los diagramas
de colaboración y refinaremos las asociaciones: multiplicidad, navegabilidad, agregación, etc.
31
Pedido
cantidad
setProducto()
calcularCantidad()
setCantidad()
Registro de pedidos nuevaCantidad()
Contiene +pedidos confirmado()
addPedido() nuevaCantidad()
pedidosPendientesProveedor() 1 0..* aprobado()
comunicarPorFax()
1 comunicado()
getProveedor()
estaComunicado()
Posee
finalizado()
rechazado()
0..*
1
Centro de Distribución
%Variacion : Integer
nuevoPedidoProveedor()
modificarPedidoProveedor()
confirmarSolicitudPedido()
modificarPedidoProveedorRA() Asociado
aprobarPedido()
comunicarPedidoPorFax()
pedidosPendientesProveedor()
confirmarRecepcion()
rechazarPedido()
1
Posee
1..*
1
Stock
cantidad Producto
nivelMinimo
nivelNormal getCantidadMaximaPedido()
getCantidadMaximaStock()
getStockVacante() 1 1 getProveedor()
getNivelNormal() incrementarStock()
incrementar() getCantidadActual()
getCantidad() 1..*
Suministra
Proveedor
numero fax
e-mail
comunicarPorFax()
32