10
11
12
13
Del
14
Ejemplo: El Hospital
En un hospital se debe permitir a un mdico solicitar una enfermera para atender un paciente. Como no es muy usual esto, las enfermeras estn organizadas de manera que solo haya una disponible en todo momento. Cada enfermera tiene un identificador y la duracin de su turno (en minutos). La enfermera que est de turno, tiene adems el tiempo que le falta para terminar su turno y si est ocupada con un mdico. Los turnos de las enfermeras estn organizados de manera circular. Las operaciones para manejar la estructura de enfermeras son:
ISIS1206 Estructuras de Datos http://cupi2.uniandes.edu.co
Avanzar un minuto (la enfermera que est de turno disminuye lo que le falta en 1. Si llega a 0, se inicia el turno de la segunda enfermera, pasando la anterior a ocupar la ltima posicin) Dar enfermera (retorna la enfermera de turno si no est ocupada, o null en caso contrario) Calcular cuntas enfermeras hay en el hospital Calcular cunto le falta a una enfermera (dado su id) para comenzar su turno.
15
Anlisis
Restricciones:
class modeloAnalisis
Hospital
Slo existe una enfermera disponible en todo momento (en turno). Los turnos se asignan de forma circular.
16
Anlisis al Diseo
Formalismo
Hospital = < E1, E2, , Et, , En > (Et est de turno) Ei = [ id, estado, tiempoTurno]
Invariante
n > 0 Ei.tiempoTurno > 0 Ei.estado = FUERA_TURNO, si i t Ei.estado = LIBRE o Ei.estado = OCUPADA, si i = t // Hay por lo menos una enfermera en el hospital // Todas las enfermeras tienen un tiempo de turno // Las enfermeras que NO estn de turno se // consideran fuera de turno // La enfermera que est de turno puede estar libre // u ocupada
17
Anlisis al Diseo
Interfaces
Estamos declarando la interfaz del sistema o de la estructura de datos?
class Domain Model interface IHospital + + + + avanzarMinuto() : void darEnfermera() : IEnfermera contarEnfermeras() : int faltaParaTurno(String) : int
class Domain Model interface IListaCircularEnfermeras + + + + darEnfermeraEnTurno() : IEnfermera darTamanho() : int faltaParaTurno(String) : int avanzarMinuto() : void
18
Diseo
class Domain Model interface IHospital + + + + avanzarMinuto() : void darEnfermera() : IEnfermera contarEnfermeras() : int faltaParaTurno(String) : int Hospital inv: Por lo menos hay una enfermera en el hospital.
-enfermeras
interface IListaCircularEnfermeras darEnfermeraEnTurno() : IEnfermera darTamanho() : int faltaParaTurno(String) : int avanzarMinuto() : void
-enfermeraActual
1 inv: El estado de la enfermera puede ser libre : 1, u ocupada:2. La enfermera tiene un tiempo de turno. El tiempo que le queda de turno a una enfermera que no est de turno es de 0. La enfermera siempre tiene una siguiente enfermera.
interface IEnfermera + + + + + + + + + darId() : String darTiempoTurno() : int darTiempoQueda() : int estaOcupada() : boolean iniciarTurno() : void avanzarMinuto() : void cambiarEstado(int) : void darSiguienteEnfermera() : IEnfermera darEstado() : int Enfermera estado: int id: String tiempoTurno: int -siguiente 1
19
Bibliografa