Autor Tema: Practica java grado ingeniería mecánica (el Cine), lo prometido es deuda  (Leído 10795 veces)

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 382
    • Ver Perfil
Buenos días, cogí hace 8 días la practica del cine del hilo http://www.aprenderaprogramar.com/foros/index.php?topic=2400.0

Añadido: el enunciado puede descargarse desde https://www.dropbox.com/s/roinm5lxnok7r90/enunciado%20problema%20practica.pdf?dl=0 (Nota: no hace falta registrarse en dropbox para poder descargárselo)

Dije la subiría ayer pero acabe tarde y quería comprobar algunas cosas. Creo que todo lo que pide el ejercicio está. Incluido lo de ordenar peliculas y listar las entradas optativo.

Comento, cuando se introduce algo erroneo para añadir, en algunas opciones, lo que hace es no decir nada pero no lo añade, si se añade sale un añadido ok tal opción.

Y ahora mis supuestos, he imaginado que es una empresa que puede tener multiples cines, el primer objeto que hace añadir es un cine, sin él no pude haber salas, ni peliculas en cartelera del cine, esto me pareció logico.

Una vez hay Cine, Sala y pelicula, se pueden añadir sesiones, una cosa que ya no he controlado, es que puede haber sesiones en la misma sala a la misma hora y dia. (Para hacerlo bien tendria que impedir que se añadieran dos horas despues de una sesion)

El resto mostrar objetos, cines salas peliculas sesiones... eliminarlas. Compra de Entradas para una sesión (aquí estad atentos a lo que pide y que la fecha corresponda exacto hasta minutos sino no compra, ni eliminaria sesion)

Y mostrar recaudación, tanto para una peli concreta como para todas las del cine ordenadas alfabeticamente.

Creo que nada más, espero criticas que me ayudan muchisimo a mejorar, no os sepan mal pues es de donde se aprende, he ido documentando con // será un poco lio imagino aunque lo ordené mucho, para el proximo proyecto aprendo a documentar muchisimo mas conforme lo haga. Y quizá haya mas metodos de los que uso en algún lado, el motivo es que para plantear el ejercicio me tome un día, y luego fui moldeandolo segun lo que pedía... creo los que no uso son pocos no obstante.

Sin mas, espero sirva para otras personas, el codigo o partes del mismo ;)
por cierto, hasta ahora no he mirado ningun otro ejercicio hecho, así que no se si será muy malo pero es el que he sido capaz de hacer sin ponerme más días y alargarlo mucho.

AÑADIDO: completado el desarrollo de práctica del cine con interfaz gráfica por Lorenzo31. Puedes descargarla desde este enlace: http://www.aprenderaprogramar.com/foros/index.php?topic=2622.msg13425#msg13425 (hay que estar logeado en los foros para poder descargar)
« última modificación: 24 de Julio 2015, 17:35 de Ogramar »

jcampina2

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 12
    • Ver Perfil
Re:Practica del Cine, lo prometido es deuda, aquí está.
« Respuesta #1 : 24 de Mayo 2015, 23:16 »
Simplemente felicitarte por el trabajo que te has currado Lorenzo31, llevo varios días corrigiendo mis fallos en mi programa a través del tuyo y sigo alucinado. Enhorabuena
y muchas gracias.
Una duda que me surje: Es necesario la creación de las clases de listasSalas y listadoSesiones?.
En resumen : Gracias por tu Genial trabajo ;)

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 382
    • Ver Perfil
Re:Practica del Cine, lo prometido es deuda, aquí está.
« Respuesta #2 : 25 de Mayo 2015, 15:35 »
Buenas jcampina2, gracias por las felicitaciones pero ya te digo que aunque me ha costado bastante tiempo, es muy mejorable jeje

No, necesario no es, piensa que incluso podriamos ponerlo todo en una sola clase, pero conceptualmente, a mi juicio, una cosa es una Sala o Sesion, y otra el conjunto de Salas o Sesiones de un cine concreto, por eso puse clases diferentes. Pero la organización es una idea personal, habrá mejores soluciones seguro ;)

Me alegra te ayude mi código, lo subí principalmente para eso y para apender yo más con los comentarios de los expertos del foro :)

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 382
    • Ver Perfil
Re:Practica del Cine, lo prometido es deuda, aquí está.
« Respuesta #3 : 15 de Junio 2015, 14:15 »
Escribo de nuevo para comentar, que después de terminar el avanzado de java, como práctica final y para adelantar un poco con el temario, me he propuesto pasar todo el entorno de consola a grafico en el programa del cine, introduccion de datos.. mostrar etc... Por supuesto lo subiré documentado en cuanto lo tenga, espero meterle caña una semana y tenerlo.

;) saludos.

valna

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 1
    • Ver Perfil
Re:Practica del Cine, lo prometido es deuda, aquí está.
« Respuesta #4 : 22 de Junio 2015, 02:16 »
Hola
Yo soy novata en esto y estoy haciendo esta misma práctica, agradezco muchisimo toda la ayuda prestada, ya que me esta resultando muy complicada.

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 382
    • Ver Perfil
Buenas, me alegro que sea util valna, para eso lo voy adjuntando, para poder ayudar y que me ayuden con los comentarios.

Está alargandose un poco más de la cuenta, porque pretendo ponerlo todo en modo grafico.

Voy a dejar lo que llevo hasta ahora, que es la inserción de datos en formato grafico. Tanto añadir cine, pelicula, sala y sesión, es en modo grafico. Ventanas etc...

Ahí va. Espero como siempre comentarios y ideas ;)

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2491
    • Ver Perfil
Hola Lorenzo felicitarte por el gran trabajo.

Dado que el trabajo es muy extenso no voy a tratar de criticar o corregir, sino de plantear preguntas en base a cosas que he visto que me han llamado la atención. Quizás algún detalle permita mejorar el diseño, aunque otras cosas se entenderán cuando se expliquen. De momento solo sobre las siguientes clases (todavía para la versión sin interfaz gráfica):

Sesion: una sesión tiene como atributos una fecha, una película, una sala y un número de butacas disponibles. Inicialmente el número de butacas disponibles será el de la sala. A medida que se hagan reservas, el número de butacas disponibles irá disminuyendo (hasta el límite de 0 entradas disponibles). Si se trataran de retirar más entradas de las que hay disponibles saldrá un mensaje de advertencia. Esta clase implementa la interface Comparable basándose en que dos sesiones serán la misma si coinciden en el tiempo (mismo Date fecha)

Pelicula: una película tiene como atributos de texto un título, director, sinopsis y género. Además dispone de un entero que representa el año en que se produjo la película. La ordenación e igualdad de películas se basan en el título.

Sala: una sala tiene como atributos el número de sala y la capacidad como número de butacas de la sala. Además tiene un listado de sesiones programadas para esa sala.

ListadoSesiones: representa una lista de sesiones

ListaSalas: representa una lista de Salas.


Las dudas que me han surgido son las siguientes.

Dudas 1: en la clase ListadoSesiones usas Collections.sort en varios puntos

Código: [Seleccionar]
    public void imprimirSesion(int numeroSala){ Collections.sort(listaSesiones);
                                                for(Sesion temp : listaSesiones){ if(temp.getNumeroDeSala() == numeroSala){ temp.mostrarInfoSesion();} } }

¿Qué finalidad tiene el Collections.sort? o ¿qué ocurriría si prescindes de él?

Dudas 2: en la clase ListadoSesiones creas una clase interna IteratorSesion

Dado que tienes el atributo listaSesiones = new ArrayList<Sesion>();, ¿no podías haber usado el iterator de ArrayList?

Esto mismo se plantea en la clase ListaSalas

Dudas 3: en la clase ListaSalas defines  public Iterator <Sala> iterator() mientras que en la clase ListadoSesiones usas protected class IteratorSesion implements Iterator <Sesion>

¿Por qué en un sitio usas protected y en otro public?

Dudas 4: en la clase ListaSalas se permite eliminar una sesión de una sala con el método eliminarSesionSala(Date fecha, int numeroSala)

¿No existe el método equivalente para añadir la sesión en esta clase?


Salu2

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 382
    • Ver Perfil
Buenas Ogramar,ante todo gracias por tomarte el tiempo siquiera de mirarlo, que a veces cuesta más que programarlo. Sí muy extenso y además como dices con cantidad de opciones para mejorar un diseño que de inicio no tomé suficiente tiempo para realizar. Y lo hice sobre la marcha me faltó documentar bien para luego ver el codigo mas facil.

Pregunta 1. Collections.sort, efectivamente sin collections.sort segun se define la clase se podria realizar. Pero en el trabajo optativo, creo era, pedia ordenar sesiones por peliculas, de forma que lo que hice, es ordenarlas directamente siempre para cumplir la petición opcional del ultimo punto. (podria haberlo hecho a parte )

Pregunta 2 Si por supuesto se podia usar simplemente el iterator de ArrayList, la respuesta a esa pregunta es que justo estaba en el capitulo de implements Iterable y Iterator del curso avanzado y quise ponerlo en practica  ;D :P aunque obviamente no hacia falta usando una clase ArrayList.

Pregunta 3 Misma respuesta que la 2, y puse protected y public, deberian ser protected los dos.

Pregunta 4 Lo que ocurre con este método, es que es una petición expresa del ejercicio, entonces agregar sesiones, ocurre en la clase lista sesiones, y eliminar sesiones lo metí con calzador directo en la clase de ListaSalas, quiza debi haber recorrido la lista de Salas y una vez encontrada la sesion que pretendia eliminar, invocar al metodo eliminarSesion pero codificado en ListaSesiones, para ser consecuente con las clases.

Código: [Seleccionar]
//Eliminar la sesiones Sesion a partir de una fecha y una sala
    public void eliminarSesionSala(Date fecha, int numeroSala){  String searchFecha = new SimpleDateFormat("dd-MM-yyyy HH:mm").format(fecha);
        for (Iterator<Sala> iterSala = listadoSalas.iterator(); iterSala.hasNext();){ Sala tmpSala = iterSala.next();
            if(tmpSala.getNumeroSala() == numeroSala){
                  listaSesiones.eliminarSesion();
                }
        }
    }
EliminarSesion()
Código: [Seleccionar]
for(Iterator<Sesion> iterSesion = tmpSala.getListadoSesiones().iterator(); iterSesion.hasNext();){
                    Sesion tmpSesion = iterSesion.next();
                    if(tmpSesion.getFecha().equals(searchFecha) ){ iterSesion.remove(); System.out.println("Sesion Eliminada...OK"); }
                } 

Algo así, pero bien hecho jeje. Si habria tenido mas sentido que eliminara listaSesiones ya que es quien añade. Esto lo modificaré estos dias, pues es una cosa interesantisima.
« última modificación: 29 de Junio 2015, 14:24 de Lorenzo31 »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2491
    • Ver Perfil
Buenas, creo que con tus aclaraciones ha quedado todo (o casi todo) de mis dudas resuelto. El Collections.sort habría que ver si realmente es necesario en los distintos puntos en que lo usas. No es buena idea introducir la ordenación en múltiples puntos porque puede crear redundancias innecesarias y luego hacer la depuración más difícil. Sería preferible quizás introducirlo en un método aparte y quizás invocarlo sólo en uno o dos puntos claves, pero creo que esto lo tenemos claro y no merezca la pena seguir hablando de ello.

Sobre la pregunta 4 creo que has dado una solución que sería la más razonable como tú dices para ser consecuente con las clases. A veces los enunciados de los ejercicios (o las peticiones de un jefe) conllevan cierta incoherencia pero lo lógico es tratar de mantener la consistencia de nuestro código y al mismo tiempo cumplir con lo que nos piden (lo cual a veces es realmente difícil).

A ver si saco tiempo y sigo mirando para comentar más cosas.

Salu2

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 382
    • Ver Perfil
Interesante esa idea de invocar la ordenación desde un metodo a parte y llamarlo, así encuentras rápido donde modificar al depurar, tomo nota tb.

Pronto tendré terminada la version "grafica" y dejaré ya las dos versiones puestas para que cualquiera pueda consultar el código y utilizarlo.

Gracias como siempre por tu tiempo Ogramar, que es un coñazo mirar código de otro y además que lo organiza bien.

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 382
    • Ver Perfil
Buenas tardes, por fin termine la parte visual, de la aplicación del cine, comentar que , he dejado el menú inicial por pantalla porque así tiene algo del primer proyecto :)

No he hecho retoques, los dejo pendientes, los comentados por ogramar, en la semanas proximas lo haré ya para tenerlo yo.

Pido a algun moderador, suba el zip que añado ahora al primer post, junto al PracticaDelCine original, para que haya las dos versiones a mano para su descarga ;)

Espero comentarios como siempre y doy por finalizada la práctica del cine.  Gracias a todos por el apoyo en este proyecto ejeje aprendi mucho con él.

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2491
    • Ver Perfil
Hola Lorenzo, una vez más felicitarte por lo que se ve es un gran trabajo al que sin duda habrás dedicado muchas horas y del que habrás obtenido una buena experiencia que además compartes y puede servir de referencia para otras personas.

El archivo iba a adjuntarlo al primer post pero no cabía debido a las limitaciones de tamaño de archivo, por ello lo que he hecho es editar el primer post añadiéndole lo siguiente:

Citar
AÑADIDO: completado el desarrollo de práctica del cine con interfaz gráfica por Lorenzo31. Puedes descargarla desde este enlace: http://www.aprenderaprogramar.com/foros/index.php?topic=2622.msg13425#msg13425 (hay que estar logeado en los foros para poder descargar)

El proyecto es tan grande que es difícil tratar de abarcarlo todo (excepto para quien lo haya creado o esté trabajando intensivamente en él claro).

Sólo te voy a hacer algunas preguntas que creo son interesantes:

- Las clases cuyo nombre empiezan por Form corresponden a clases que incorporan la interfaz gráfica, por ejemplo FormNuevaSala correspondería al formulario que se abre cuando el usuario del sistema elige crear una nueva sala ¿Es así?

- En estas clases como FormNuevaPelicula tenemos tanto la interfaz gráfica como la lógica o algoritmia de los procesos que tienen lugar vinculados  a dicho formulario. ¿Es así o de alguna manera has tratado de separar la lógica y la interfaz gráfica? Te lo pregunto porque hay un criterio de diseño que se denomina desacoplamiento de la interfaz gráfica de la lógica de negocio, que de hecho es utilizado en diferentes frameworks de programación y a distintos niveles.

Hay otra cuestión de diseño que no acabo de tener clara, me refiero a las variables de tipo 

private String cine[]; //variable que guardara los datos introducidos en los JTextField y los pasará al Main con getters

En otra clase tenemos private String [] pelicula; y así sucesivamente.

¿Por qué has usado estas variables? ¿No hubiera sido posible hacer el trabajo de esas variables usando objetos, por ejemplo en el caso de la pelicula un objeto Pelicula (aunque fuera un objeto temporal)?

Salu2!

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 382
    • Ver Perfil
Muy buenas Ogramar, me parece genial la solucion que le diste para tener un acceso mas rapido.

A la primera pregunta, sí Form son las nuevas clases que cree, despues de empezar (o casi terminar) me di cuenta que podria haberlo dividido en,

FormPelicula (con todo lo que se hace sobre una pelicula, crear eliminar mostrar). FormSala, etc... pero como era para practicar las interfaces graficas un poco lo deje como estaba.

Sobre tu segunda pregunta, efectivamente, separé de la forma en la que se explicaba en el curso de java avanzado. Viene siendo;

Declarar objetos
Constructor  Y dentro creación de formulario y eventos sobre objetos.

Lo que hice en el ultimo formulario el de las entradas es organizarlo un poco mejor añadiendo funciones, por ejemplo: ActualizarFormulario() InicializarObjetos() o así, para leerlo de una forma más organizada.

La ultima pregunta, revisaré la razón exacta, pero es posible que cuando cree los metodos adaptados a lo que pedía el ejercicio inicial, lo hice de esa forma, enviando Strings con parametros concretos a los metodos en lugar de objetos completos.
Lo que me obligó (si no modificando) a respetarlo en los Formularios Graficos.

Miraré de ampliar la información útil para otros usuarios sobre tus preguntas Ogramar.

deissy

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 1
    • Ver Perfil
Excelente

 

Esto es un laboratorio de ideas...
Aprender a programar

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".