MODELACION DE UN PROBLEMA DE RESERVACIONES

Iniciado por SDCC, 31 Agosto 2018, 05:31 AM

0 Miembros y 1 Visitante están viendo este tema.

SDCC

Buenos dias,tardes o noches, pasaba por el foro para preguntar sobre algo que aparamente suele verse muy sencillo pero que aveces me genera incertidumbre sobre si estoy haciendo las cosas de la mejor manera posible.Durante un ejercicio de programacion me he afrontado con un problema de reservaciones dentro de un restaurante...Para no hacer mas extensa la descripcion , les presento aquellas clases que he creado para intentar dar solucion a la modelacion del problema desde el punto de vista orientado a objetos.

Clases:
-Mes
-Dia
-Horas
-Reservacion
-Datos de cliente
-Mesa

A partir de las anteriores clases he empezado a comprender el problema de la siguiente manera:
-Partiendo de la idea de que me debe ubicar en algo similar a un calendario, empiezo mis clases por la clase mes, esta clase mes a su vez debe estar compuesta por varios dias, y cada dia por varias horas , a su vez las horas deben tener reservaciones , estas reservaciones estan compuestas por una mesa en especifico y los datos del cliente.

Planteado el problema de esta forma , me parece que se puede seguir una logica entre la relacion de las clases sin embargo me surge una pregunta...¿Deberia agregar una clase o interfaz  "Mostrador" o "recepcionista" ?, a caso esta clase deberia manejar metodos tales como buscar Reservacion,Eliminar reservacion,Ver reservacion,etc... O todas estas acciones se las deberia dejar al metodo main.

Cabe recalcar que por el momento no me interesa  entrar en detalles sobre algun lenguaje, si no empezar a comprender los problemas desde un punto de vista modelado a objetos.De antemano les agradeceria si alguien me pudiera ayudar a resolver esta duda o corrigiendome sobre la forma en que plantie el problema, o simplemente aportandome alguna fuente donde pudiera consultar una manera correcta de hacerlo.

Serapis

Bien, suponiendo un restaurante que admite reservas....
Un punto a señalar es que solo admite reservas, es deic rsi alguien se presenta sin reservas y hay mesa libre se le ofrece una mesa o se le invita  a irse a otro restaurante...

También queda la duda de dónde desea almacenar los datos... para las reservas de un día, se pueden guardar en memnoria y como copia en un ficherito para prevenir eventualidades fatales, pero teneiendo reservas con meses de antelación, lo razonable es usar una base de datos... así que algunos comentarios y tal harán referencia a una base de datos... PK= Primary Key

La clase/registro Reserva, debe ser simple y debe apuntar a mesa, cliente y fecha (mes + día + hora), etc... es decir solo contiene datos, no métodos.
clase Reserva
    PK codReserva tipo String  // un código único para esta reserva, usando una BD esto s
    FK codCliente tipo  string
    FK codMesa tipo entero
    FK codFecha tipo Fecha
fin clase


Como se ve, solo el campo 'codigoReserva' de una reserva son primary Key (PK), porque puede consultarse las reservas para obtener la reserva específica. El resto de campos en cambio son foreign Key, porque puede pedirse datos ampliados respecto de ellos a otras tablas/colecciones, por ejemplo, para el cliente... podría pedirse todas sus reservas, para mesa, todas las reservas de una mesa para un día concreto incluso la reserva para una fecha concreta de esa mesa, etc...

Cada reserva es una clase, un ítem para una colección ó, un registro de una tabla en una base de datos...

Objeto que guarda todas las reservas, aunque lo razonable es que sea una tabla en una base de datos.
Clase coleccion reservas
     PK codReserva tipo string

     // Se intenta añadir una reserva si fue bien devuelve el código de la reserva, en otro caso un string vacío.
     // Puede indicarse aparte por referencia un valor numérico, que devuelve 0 y cuando haya error
     //    Un valor distinto de 0, que refleja un problema específico por ejemplo:
     //    1: no hay mesas libres para esa hora. 2: Ese día el restaurante no abre. etc...
     string = Add(r tipo Reserva, error tipo entero)

     entero = Borrar(cod tipo string) // pasando el código de una reserva puede borrarse la reserva... debería pedirse confirmación.

     // siendo una base de datos, debería poderse modificar un registro, cambiar por ejemplo, la hora, el día ó el mes... el cambio de mesa no sería elegible por el cliente, si no en función de la que hubiere libre para la nueva fecha...
     reserva = Modificar(cod tipo string, nuevaFecha tipo fecha)
     
     reserva = ConsultarPorCodigo(cod tipo string) // devuelve la reserva por cuyo código se pregunta. si no existe devuelve un objeto vacío.
     reserva = ConsultarPorClienteYFecha(nombreCli tipo string, f tipo fecha)
     // dado el nombre completo dle cliente, busca en la tabla clientes, si hay registros de reservas para el cliente, si los hay busca entre ellos aquel que tenga la fecha reclamada (mes y día),
    //Para buscar reservas en un rango dado (desde mes y dia hasta mes y dia) deberá usarse otra función pués podría devolver más de un registro...

    ... muchos más métodos.
fin clase


En fin, como puedes darte cuenta, la más compleja de todas será la coleccion reservas (o tabla si usas una BD, que es lo acertado)...

Los datos de un cliente se recogerían en una clase específica.... igualmente sol contiene datos, no métodos.
clase Cliente
   PK cod tipo String  // código del Cliente
   nombre tipo String
   apellidos tipo string
   telefono tipo string
   ...etc... más datos cliente
fin clase


Clientes sería una colección de la clase cliente, o una tabla con los registros de los clientes.
Como colección debería tener métodos, para poder manejarla... lo típico:
Añadircliente, Borrarcliente, ModificarDatoscliente, Buscarcliente
coleccion clientes
    PK cod tipo string  // un array, etc... pero mejor una tabla en una bd

    cliente = Buscar(cod tipo string)  // dado su código  decliente, se localiza y se devuelve el registro (datos) del cliente
    buleano = Add(cli tipo Cliente) // Añade un cliente (siempre que no exista).
    buleano = Delete(cod tipo string)  // borra un cliente, si existe y anula sus reservas (si las tiene, pero en tal caso pidiendo confirmación).
    cliente = BuscarPorCodigo(cod tipo string) // localiza y devuelve un registor decliente si existe, un objeto vacío si no, dado el código de cliente.
   cliente = BuscarPorNombre(nombre tipo string, apellidos tipo String) // ídem pero dado su nombre y apellidos...
    // La búsqueda es para obtener el registro/clase del cliente, sea para modificar sus datos o para tomar su código de cliente y con él buscar reservas...
fin colección


La clase mesa es la más sencilla, solo tiene un código asociado a ella.
Clase Mesa
   PK codMesa tipo string
fin clase

En cambio la colección/tabla mesas, almacena objetos/registros de mesa y debe disponer de métodos
coleccion Mesas
    PK codMesa Tipo String  //

    string = Add  // añade una nueva mesa al restaruante se le asocia un nueco código de mesa.
    buleano = Delete(cod tipo string) // intenta eliminar una mesa.
    // si no tiene reservas se elimina, sin problemas, pero...
    //   si tiene reservas, cada reserva se intenta asociar a otra mesa,
    //   si no resulta posible cambiar todas las reservas a otra mesa,
    //   podría verse de cambiar además d ela mesa el horario, pero avisando al cliente consensuado
    //   o se cancelan las reservas o no se puede eliminar la mesa...
    //   devuelve un bucleano, para indicar si se logró eliminar o no.
    //   Eliminar mesas puede implicar cambios de horarios/fecha en las o su anulación,
    //   y llevaría aparejado el añadir eventos en cola, para llamar a los clientes y avisarles/ponerse de acuerdo...

    // podrían añadirse más métodos como consultar mesa libre para una fecha concreta.
    // Aunque ese método, debería ir a la coleccion/tabla reservas...
fin coleccion


En cambio para fechas... no veo la necesidad ni de crear una clse ni una colección... en todo caso simplemente la reserva debe tener claro el horario (de cada día de la semana, si varía según el día), o si algún día el restaurante está cerrado... pero eso puede estar imbuido al hacer la reserva, al eelgir fecha, se restringe el horario y los días a los que estén prefijados...
clase horario
     abre tipo fecha
     cierre tipo fecha
     // nombre dia string  esto es ...opcional....
fin clase

coleccion HorarioPorDias
     Lunes tipo horario
     martes tipo horario
     ...
     domingo tipo horario

     buleano = EstaAbierto(hora tipo numero, dia tipo numero por defecto hoy, mes tipo numero por defecto actual)
     // Señala si para el mes, día y hora indicado está abierto elrestaurante...

     // Devuelve una clase horario, para el mes y día señalado
     horario = HorarioPara(dia tipo numero por defecto hoy, mes tipo numero por defecto actual)

     // no parece necesario que deba tener más métodos.
fin coleccion


Así a grosso modo....