• Nathaly González• Andrés Ramos• Fernando Bernate• Néstor Bohórquez • Kerlyn Hans Mariño Bello
Análisis y Diseño de Software
Sistema de Parqueaderos
Agenda
Requerimientos Funcionales Requerimientos No Funcionales Modelo del Mundo Diseño Detallado
El Proyecto “Sistema de Parqueaderos - PARQ” se realiza con el fin de proveer el diseño de una capa que permita la administración de la operación de un edificio de parqueaderos, considerando las especificaciones dadas en la descripción del problema.
El resultado planteado abarcará el análisis y diseño de una solución que de soporte a los requerimientos para el proceso de negocio del parqueadero.
A continuación se definirán los requerimientos de software necesarios para desarrollar una propuesta que soporte las necesidades globales que se han identificado al interior del proceso.
Descripción del Proyecto
Requerimientos Funcionales (1)
RF -01 Registrar Vehículo en parqueadero estándar
Se requiere registrar el ingreso de un vehículo al parqueadero a un sitio estándar, según su tipo. Debe haber un sitio disponible para estacionar. El sistema debe indicar cuál es el sitio disponible asignado para el vehículo.
RF -02 Revisar el estado de ocupación de un piso
Se requiere que el sistema pueda entregar un listado, que permita notificar si cada espacio está libre u ocupado, de estar ocupado debe indicar el tiempo que lleva el vehículo correspondiente.
RF -03 Autorizar salida de un vehículo
Se requiere que el sistema permita autorizar la salida de un vehículo, para lo cual debe notificar el sitio, tiempo de parqueo dado su placa y registrar el valor a cobrar.
Requerimientos Funcionales (2)
RF -04 Registrar el parqueo en sitios dobles
Se requiere registrar el ingreso de 2 vehículos en un sitio de parqueo doble cuando hay alta demanda de sitios de parqueo en horas pico y se agotaron los sitios estándar. En esos casos el primer vehículo queda bloqueado.
Reglas de Negocio:• El vehículo bloqueado se identifica con el número del sitio y la letra “B”.• El vehículo libre se identifica con el número del sitio y la letra “N”.• El sitio de parqueo doble se puede asignar si no está previamente reservado.• Solo se autoriza el parqueo del segundo vehículo si éste planea salir antes que el primer vehículo.
Requerimientos Funcionales (3)
RF -05 Autorizar salida de un vehículo
Se requiere que el sistema permita autorizar la salida de un vehículo, para lo cual debe notificar el sitio, tiempo de parqueo dado su placa y registrar el valor a cobrar.
Reglas de Negocio:• Si es un sitio de parqueo doble y el vehículo bloqueado desea salir (bien sea por que sale antes o porque el segundo vehículo no salió a la hora pactada) el sistema debe notificar al dueño del segundo vehículo, éste tendrá 5 minutos para mover su vehículo de no hacerlo el sistema cobra una multa de $20.000.oo.• Cuando se ha liberado por lo menos el 30% de los sitios estándar y si hay cupos dobles asignados el sistema debe notificar éste hecho.• La tarifa de parqueo se cobra en unidades de 15 minutos. Se cobran las primeras 20 unidades y posteriormente la tarifa es plana.
RF -06 Obtener el sitio de parqueo de un vehículo dada su placa
Se requiere poder consultar el sitio de parqueo de un vehículo dada su placa.
Requerimientos Funcionales (3)
RF -05 Autorizar salida de un vehículo
Se requiere que el sistema permita autorizar la salida de un vehículo, para lo cual debe notificar el sitio, tiempo de parqueo dado su placa y registrar el valor a cobrar.
Reglas de Negocio:• Si es un sitio de parqueo doble y el vehículo bloqueado desea salir (bien sea por que sale antes o porque el segundo vehículo no salió a la hora pactada) el sistema debe notificar al dueño del segundo vehículo, éste tendrá 5 minutos para mover su vehículo de no hacerlo el sistema cobra una multa de $20.000.oo.• Cuando se ha liberado por lo menos el 30% de los sitios estándar y si hay cupos dobles asignados el sistema debe notificar éste hecho.• La tarifa de parqueo se cobra en unidades de 15 minutos. Se cobran las primeras 20 unidades y posteriormente la tarifa es plana.
RF -06 Obtener el sitio de parqueo de un vehículo dada su placa
Se requiere poder consultar el sitio de parqueo de un vehículo dada su placa.
Requerimientos NO Funcionales (1)
• RNF -01 Distribución
El sistema debe enviar notificaciones a diferentes sistemas que pueden estar distribuidos en diferentes ambientes.El sistema debe notificar al dueño del segundo vehículo de un sitio de parqueo doble en caso de que éste esté bloqueando a un primer vehículo.Cuando se ha liberado por lo menos el 30% de los sitios estándar y si hay cupos dobles asignados el sistema debe notificar éste hecho.
RNF -02 Desempeño
Todas las operaciones deben ser realizadas en el menor tiempo posible. La complejidad de las operaciones deben ser O(1).
Requerimientos NO Funcionales (2)
RNF -03 Concurrencia
Diferentes sistemas de monitoreo pueden acceder a la capa que se está diseñando de manera concurrente. Se debe asegurar consistencia en la información.
RNF -04 Persistencia
La información del sistema debe ser persistente. La configuración del parqueadero se hace dependiendo del edificio y se configura atreves de un archivo XML
RNF -04 Modificabilidad
El formato de carga de la configuración del parqueadero puede cambiar.
Modelo del Mundo
Diseño Detallado
Diseño Detallado
class System
EdificioParquederos
- tarifa: double
+ RegistrarParqueoEstandar(String, int) : String+ RegistrarParqueoDoble(Date, double, String, int) : String+ ObtenerOcupacionPiso(int) : List<int,Date>+ RegistrarSalida(String) : double+ ObtenerSitioParqueo(String) : String- CalcularTarifa(Date, Date) : void
«interface»IConfigurador
+ CrearEdificioParqueadero() : EdificioParquederos
FachadaSistema
+ RegistrarParqueoEstandar(String, int) : String+ RegistrarParqueoDoble(Date, double, String, int) : String+ ObtenerOcupacionPiso(int) : List<int,Date>+ RegistrarSalida(String) : double+ ObtenerSitioParqueo(String) : String+ AgregarObservador(IObservador) : void+ RemoverObservador(IObservador) : void
«interface»IServiciosClientes
+ RegistrarParqueoEstandar(String, int) : String+ RegistrarParqueoDoble(Date, double, String, int) : String+ ObtenerOcupacionPiso(int) : List<int,Date>+ RegistrarSalida(String) : double+ ObtenerSitioParqueo(String) : String+ AgregarObservador(IObservador) : void+ RemoverObservador(IObservador) : void
«Abstract»NotificacionObservable
+ AgregarObservador(IObservador) : void+ RemoverObservador(IObservador) : void+ Notificar() : void
+Configurador
1
+edificio 1
+notificadorObservable
1
Patrones de Diseño Utilizados
FachadaProvee una interfaz unificada para tener acceso a unsistema con ella Podemos controlar el punto de acceso a nuestro sistema
Diseño DetalladoPatrones de Diseño Utilizados
Forwarder - Receiver
El sistema puede ofrecer o consumir servicios de sistemas remotos. Necesitamos notificar variedad de sistemas independiente de su tecnología.
class System
NotificadorBloqueos
+ Notificar(Noti ficacion) : void
EdificioParquederos
- tarifa: double
+ RegistrarParqueoEstandar(String, int) : String+ RegistrarParqueoDoble(Date, double, String, int) : String+ ObtenerOcupacionPiso(int) : List<int,Date>+ RegistrarSalida(String) : double+ ObtenerSitioParqueo(String) : String- CalcularTarifa(Date, Date) : void
AgenteTransporte
+ EnviarMensaje(Notificacion) : void
«interface»INotificador
+ Notificar(Notificacion) : void
Notificacion
- medio: String- para: String- mensaje: String
1
+notificadorClientes
1
Diseño DetalladoPatrones de Diseño Utilizados
Observer
Permite a un objeto registrarse dinámicamente como dependiente de otro, de manera que, este otro, lo notifique cada vez que su estado interno cambie.Al no saber quien debe ser notificado lo dejamos las notificaciones en un medio de acceso "publico" para que quien se suscriba sea notificado
class System
EdificioParquederos
- tari fa: double
+ RegistrarParqueoEstandar(String, int) : String+ RegistrarParqueoDoble(Date, double, String, int) : String+ ObtenerOcupacionPiso(int) : List<int,Date>+ RegistrarSalida(String) : double+ ObtenerSitioParqueo(String) : String- CalcularTarifa(Date, Date) : void
FachadaSistema
+ RegistrarParqueoEstandar(String, int) : String+ RegistrarParqueoDoble(Date, double, String, int) : String+ ObtenerOcupacionPiso(int) : List<int,Date>+ RegistrarSalida(String) : double+ ObtenerSitioParqueo(String) : String+ AgregarObservador(IObservador) : void+ RemoverObservador(IObservador) : void
«interface»IObservador
+ Actualizar(object) : void
Lis t«Abstract»
NotificacionObservable
+ AgregarObservador(IObservador) : void+ RemoverObservador(IObservador) : void+ Notificar() : void
NotificacionEstadoOcupacion
- estadoOcupacion: double
+ ObtenerEstado() : double+ AsignarEstado(double) : void
foreach(IObservador o in observadores){ o.Actualizar(estado) }
+edificio 1
+notificadorObservable
1
+notificadorOcupacion
1
+observadores
1
Diseño DetalladoPatrones de Diseño Utilizados
DAO (Data Access Object)
El DAO fue utilizado para separar la complejidad de acceso a los datos. El medio en el cual se persista la información es independiente, y puede cambiar segun sea la necesidad
class System
«interface»IDaoGenerico<IEntidad>
+ Guardar(IEntidad) : void+ ObtenerPorId(IEnt idad) : IEnt idad+ ObtenerTodos() : IEnt idad[]+ Modificar(IEntidad) : IEntidad
«interface»IManejadorDatos
+ PersistirParqueadero(EdificioParquederos) : void+ GuardarParqueo(Vehiculo, int) : String+ ObtenerOcupacion(int) : Piso[]+ RegistrarSalida(String) : void+ ObtenerSitioPorPlaca(String) : String
«interface»IEntidad
+ Id: Object
ManejadorDatos
+ PersistirParqueadero(EdificioParquederos) : void+ GuardarParqueo(Vehiculo, int) : String+ ObtenerOcupacion(int) : Piso[]+ RegistrarSalida(String) : void+ ObtenerSitioPorPlaca(String) : String
1
+manejadorDatos
1
Diseño Detalladoclass System
Pis o
+ ObtenerSitioParqueo(String) : SitioParquedero+ ObtenerOcupacion() : Sitio[]+ RegistrarParqueo(Vehiculo, int) : String
SitioParquedero
- numero: int
+ IsVehiculo(String) : boolean+ RegistrarVehiculo(Vehiculo) : String
SitioParqueoDoble
- letra: String
+ IsVehiculo(String) : boolean+ RegistrarVehiculo(Vehiculo) : String
Vehiculo
- placa: String- telefonoDueño: String- horaLlegada: Date- posibleHoraSalida: Date
«interface»IEntidad
+ Id: Object
+vehiculo 0..1
+sitiosEstandar
1.. *
+vehiculoB 1
+sitiosDobles
*
Diseño DetalladoPatrones de Diseño Utilizados
Factory
Mantiene la independencia entre la clase quepide la creación y la forma en cómo se crea.
Pueden haber diferentes fabricas concretas cada una se encarga de fabricar el parqueadero pero usando como materia prima diferentes fuentes (xml, BD,....)
class System
EdificioParquederos
- tarifa: double
+ RegistrarParqueoEstandar(String, int) : String+ RegistrarParqueoDoble(Date, double, String, int) : String+ ObtenerOcupacionPiso(int) : List<int,Date>+ RegistrarSalida(String) : double+ ObtenerSitioParqueo(String) : String- CalcularTarifa(Date, Date) : void
«interface»IConfigurador
+ CrearEdificioParqueadero() : EdificioParquederos
XmlConfigurador
+ CrearEdificioParqueadero() : EdificioParquederos
FachadaSistema
+ RegistrarParqueoEstandar(String, int) : String+ RegistrarParqueoDoble(Date, double, String, int) : String+ ObtenerOcupacionPiso(int) : List<int,Date>+ RegistrarSalida(String) : double+ ObtenerSitioParqueo(String) : String+ AgregarObservador(IObservador) : void+ RemoverObservador(IObservador) : void
+Configurador
1
+edificio 1
GRACIAS…• Nathaly González• Andrés Ramos• Fernando Bernate• Néstor Bohórquez• Kerlyn Mariño