Consulta sobre un ejercicio de clases

Iniciado por zonahurbana, 23 Noviembre 2013, 22:40 PM

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

zonahurbana

En síntesis, lo que el enunciado me pide es crear clases o interfaces para estas entidades: personas, empleados, médicos y pacientes.

Los empleados pueden contratarse de 2 formas (por Planilla o de forma Eventual), entonces haré que 2 clases hereden de Empleado. Pero además me indica que un Médico es un tipo especial de Empleado.
¿Debería crear una clase Médico que herede también de Empleado, al mismo nivel que las clases que catalogan a los empleados según la forma en que fueron contratados? Podría considerarlo así para simplificar, porque no menciona de que un Médico pueda contratarse por esas modalidades. Además dice que los empleados son personal administrativo y los médicos son los que atienden a los pacientes. Visto de ese modo, no serían un tipo de empleado, porque están considerando Empleado como PersonalAdministrativo.

Pero esa no es mi duda central. Mi duda central es respecto a este inciso:
Citarb) Registrar los datos de una cita médica.

En el 1er examen tuve que crear una clase Cliente, y una clase Libro, para relacionarlas (era un sistema como de biblioteca). Pero cuando me pedían ver una "lista de libros solicitados", a pesar que logré implementarlo, siempre tuve la duda de si eso debería ir en un atributo boolean de Libro como "prestado" o en un vector de librosPrestados dentro de la clase Cliente. Además, luego pensé que una biblioteca podría tener también varios libros iguales y prestarlos a distintas personas. Estuve pensando en crear una clase SolicitudLibro.

Y para este ejercicio tal vez una clase CitaMédica. Pero, ¿cómo es la mejor forma de relacionar esto?
Nuestra docente no es nada práctica... es pura teoría, pero no nos enseña a cómo deberíamos pensar los ejercicios. Tal vez CitaMédica podría ser una clase interna de Médico, o de Paciente, o tal vez ir aparte... o tal vez no debería existir y haya otra manera de manejar esto.

¡ ¿Qué es lo más adecuado? !

Por favor, si alguien conoce como tratar estos casos, ayúdeme que le estaré muy agradecido.
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...

Zoik

#1
Bueno no se si te aconsejare correctamente, pero yo lo haria de la siguiente forma:

Como clase padre persona, aqui incluiriamos datos generales como dni,fecha de nacimiento,etc.

Medico, empleado y paciente heredan de persona, cada una de estas clases deberan tener datos que las otras no tienen, en el caso de medico por ejemplo especialidad medica, por decir algo.

Y a la clase paciente le haces una estructura de datos como una arraylist por ejemplo, de tipo citaMedica, que sería otra clase con sus respectivas variables(fecha de la cita, hora), así en todo momento podrás acceder al historial de citas de cada paciente.

Un saludo y espero haberte ayudado aunque sea un poco.

zonahurbana

Gracias por responder.

Pero, por ejemplo, ¿si luego quisiera obtener la lista de pacientes que serán atendidos por un médico determinado?
Tendría que buscar en el arraylist de cada paciente las coincidencias con dicho médico, ¿verdad?
A lo que me refiero es que, si son muchos pacientes, esto no sería muy eficiente, pero tampoco quisiera guardar los datos por duplicado, es decir, que cada médico tenga un arraylist para sus pacientes y los pacientes también respecto a sus médicos. ¿O es esto normal y estoy complicándome en vano?
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...

Zoik

Bien, en ese caso tendrías que poner en la clase citaMedica una variable que identifique a el médico que le atiende en esa visita y cotejarlo con el médico que le introduce el usuario.

Es decir en la clase citaMedica:

Código (java) [Seleccionar]
String nombreMedico;

public String getMedico () {
     return nombreMedico;
}


Y con una iteración recorrer toda la arrayList de citas en busca del médico que quieres.

Un saludo.

zonahurbana

#4
Pero para usar eso, tendría que hacer todo esto, ¿verdad?
Código (java) [Seleccionar]
// Luego de haber leído el nombre del Médico,
// se buscaría de este modo las citas en que aparece:
for(int i=0; i<ListaPacientes.length; ++i)
for(int j=0; j<ListaPacientes.getCitas().length; ++j)
if(ListaPacientes.getCitas()[j].getMedico().equals( medicoBuscado))
System.out.println( ListaPacientes.getCitas()[j].getInfo() );

Porque voy a tener un arreglo de objetos Paciente y debo buscar en todas las CitaMedica que éste posea. Y a eso me refería, a si hay otro probablemente más eficiente.
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...

Zoik

#5
Bueno si quieres hacerlo de otra forma, en vez de asignar a cada paciente una arrayList con sus citas, crea la arrayList de citas en tu main y guardalas todas allí, eso si necesitaras en la clase cita asignar algún tipo de variable para poder identificar el paciente al que hace referencia cada cita.

Te lo e puesto así porque lo considero mas ordenado, si quieres ver realmente que es mas eficiente prueba las dos maneras y mira el tiempo de ejecución, aunque al fin y al cabo vas a acabar leyendo la misma cantidad de citas en las dos fomas.

De todas formas tira un poco de código y cuando tengas algo postealo, así sera mucho mas fácil ayudarte.

Un saludo.

zonahurbana

Muchas gracias nuevamente.
Creo que seguiré la idea suya porque crear un ArrayList de citas aparte, como que no está muy vinculado y me da la sensación que no hace uso de POO, ¿verdad?

Preguntaba porque me pareció haber visto en algún lugar una sugerencia, de usar una clase intermedia cuando existían datos vinculados entre 2 clases, para que no se guarde en ninguna de ellas.

Cuando tenga el código lo subiré a ver qué me dice. Gracias.
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...

Mitsu

#7
Para que puedas usar herencia, debes preguntarte si hay una relación es un. Si es así, este es un caso en donde podrás usar herencia.

Ahora bien, como Médico no es un empleado, entonces no debe heredar de Empleado, en mi opinión no debe heredar de ninguna clase. Lo mejor sería hacer a ese médico una especie de pojo, así como a Paciente.

Cuando creamos la clase CitaMédica, puedes crear una Lista de citas y usar a Medico para registrar sus datos en la consulta.

Cuando se registra la cita:



Cuando se consulta una cita:



NOTA: YA TÚ CÁMBIALE EL TÍTULO A LOS DIÁLOGOS PARA DIFERENCIARLOS, XD.



Paciente:
Código (=java) [Seleccionar]

package javase.poo.empleados.pojo;

import javase.poo.empleados.medico.Medico;


public class Paciente {
   
   private String nombre;
private long codigoCita;
private int edad;
private String causaCita;
private String telefono;
private Medico medico;

public Paciente() {
this.nombre = "";
this.codigoCita = 0;
this.edad = 0;
this.causaCita = "";
this.telefono = "";
this.medico = null;
}

   public String getNombre() {
       return nombre;
   }

   public void setNombre(String nombre) {
       this.nombre = nombre;
   }

   public long getCodigoCita() {
       return codigoCita;
   }

   public void setCodigoCita(long codigoCita) {
       this.codigoCita = codigoCita;
   }

   public int getEdad() {
       return edad;
   }

   public void setEdad(int edad) {
       this.edad = edad;
   }

   public String getCausaCita() {
       return causaCita;
   }

   public void setCausaCita(String causaCita) {
       this.causaCita = causaCita;
   }

   public String getTelefono() {
       return telefono;
   }

   public void setTelefono(String telefono) {
       this.telefono = telefono;
   }

   public Medico getMedico() {
       return medico;
   }

   public void setMedico(Medico medico) {
       this.medico = medico;
   }
       
   @Override
   public String toString() {
       String data = "";
       data = "Nombre del paciente:\t" + this.getNombre();
data += "\nCausa de la cita:\t" + this.getCausaCita();
data += "\nEdad del paciente:\t" + this.getEdad();
data += "\nTelefono:\t" + this.getTelefono();
data += "\n\nMedico a cargo:\t" + this.getMedico().toString();

return data;
   }
       
}


Medico:
Código (=java) [Seleccionar]

package javase.poo.empleados.medico;


public class Medico {
   
   private String nombre;
   private String especialidad;
   
   public Medico() {
       this.nombre = "";
       this.especialidad = "";
   }
   
   public Medico (String nombre, String especialidad) {
       this.nombre = nombre;
       this.especialidad = especialidad;
   }

   public String getNombre() {
       return nombre;
   }

   public void setNombre(String nombre) {
       this.nombre = nombre;
   }

   public String getEspecialidad() {
       return especialidad;
   }

   public void setEspecialidad(String especialidad) {
       this.especialidad = especialidad;
   }
   
   @Override
   public String toString() {
       String data = "";
       data += "\nNombre:\t" + this.getNombre();
       data += "\nEspecialidad:\t" + this.getEspecialidad();
       
       return data;
   }
}


CitaMedica:
Código (=java) [Seleccionar]

package javase.poo.empleados.citas;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javase.poo.empleados.medico.Medico;
import javase.poo.empleados.pojo.Paciente;
import javax.swing.JOptionPane;


public class CitaMedica {
   
   List<Paciente> listaCitas;
   
   public CitaMedica() {
listaCitas = new ArrayList<>();
   }

   public void registrarConsulta() {

Paciente paciente = new Paciente();
Medico medico = new Medico();
Random generador = new Random(System.currentTimeMillis());

String nombrePaciente = txtNombrePaciente.getText();
int edad = Integer.valueOf(txtEdadPaciente.getText());
String causa = txtCausaCita.getText();
String telefono = txtTelefono.getText();
String nombreMedico = txtNombreMedico.getText();
       String especialidad = txtEspecialidadMedico.getText();
       
int codigoCita = generador.nextInt(10000);

       medico.setNombre(nombreMedico);
       medico.setEspecialidad(especialidad);
       
paciente.setNombre(nombrePaciente);
paciente.setCodigoCita(codigoCita);
paciente.setEdad(edad);
paciente.setCausaCita(causa);
paciente.setTelefono(telefono);
paciente.setMedico(medico);

listaCitas.add(paciente);
       JOptionPane.showMessageDialog(null,paciente.toString(),"Info de cita",0);
       codigo = (long) codigoCita;
   }

   public void buscarConsulta(long codigoCita) {

boolean existeCita = false;
int indicePaciente = 0;

for (Paciente paciente : listaCitas) {
if(paciente.getCodigoCita() == codigoCita) {
existeCita = true;
indicePaciente = listaCitas.indexOf(paciente);
                          break;
}
}

if(existeCita) {
String data;

data = "Nombre del paciente:\t" + listaCitas.get(indicePaciente).getNombre();
data += "\nCausa de la cita:\t" + listaCitas.get(indicePaciente).getCausaCita();
data += "\nEdad del paciente:\t" + listaCitas.get(indicePaciente).getEdad();
data += "\nTelefono:\t" + listaCitas.get(indicePaciente).getTelefono();
data += "\n\nMedico a cargo:\t" + listaCitas.get(indicePaciente).getMedico().toString();

JOptionPane.showMessageDialog(null,data,"Informacion de la cita",JOptionPane.INFORMATION_MESSAGE);
}
else {
JOptionPane.showMessageDialog(null,"No se ha registrado la cita","No encontrada",1);
}

   } // fin buscarCita
   
}



En la clase CitaMedica, lo que hago es crear una lista que hace uso de Generics, en este caso es una lista de Pacientes. A este paciente le asigno los datos que se han ingresado, además del nombre y la especialidad del médico, pero éstos datos se los asigno al objeto Medico, luego le asigno al objeto Paciente para asociar un paciente a su médico. Además, genera un número aleatorio que simulará un código de consulta.

La clase Medico sobreescribe el método toString(), para obtener en forma de Texto los datos del mismo.

En la clase CitaMedica también programo el método buscarConsulta, que recibe un código long (código de cita) y en caso haya coincidencias, muestra la información de la cita en un diálogo, de lo contrario, informará que no se ha registrado esa cita.

La clase Paciente es una pojo, vamos a crear objetos de esta clase para asignarle los datos y posteriormente agregarlos a lista.


Espero te haya sido de ayuda.

zonahurbana

Gracias por responder M1t$u.

La verdad es que ayer realicé el código e hice incluso un video para mis compañeros de clase explicándolo. Es porque tenemos un examen hoy, justamente a esta hora (aunque muy extrañamente lo han postergado para unas horas más adelante): https://www.youtube.com/watch?v=hQ-X0Eop9us

Por eso estaba buscando la mejor manera de hacerlo jeje.

Gracias por su ayuda y tengo algunas dudas respecto a su código:

- ¿Pojo es una clase que no hereda de ninguna otra y que a su vez tampoco implementa interface alguna?

- Yo tampoco consideré a Médico como una clase hija de Empleado. De hecho, un médico es un empleado, pero el enunciado dice que el empleado es personal administrativo, por lo que lo excluye completamente. Hay una parte en que dice "un médico podría considerarse un tipo especial de empleado contratado por planilla". Pero aún así, no seguí esta idea ya que sólo dice "podría".

- Usted ha considerado un atributo Médico para cada Paciente. Pero podría darse el caso que cada paciente tenga distintas citas con diversos médicos. Además, de esa manera, no podrían existir médicos si no tienen citas con pacientes, y pues, no se está considerando a los médicos que no tienen citas reservadas.

Gracias nuevamente.
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...

Mitsu

#9
Hola.

1) Lo que te he dado es un simple Demo para 'plantear' la idea que se me ocurrió. Puntos como el que acabas de dar son los que hacen que la idea general se pueda mejorar y posteriormente plasmar en el código.

Puedes hacer listas de médicos y de ćodigos de citas, para simular diversas citas (con diversos médicos o con el mismo) en la pojo Paciente. También puedes especificar una lista estática de médicos disponibles, cada uno con su especialidad, turno, etc. Y así al hacer la consulta, revisar qué medicos están disponibles y si su especialidad concuerda con el problema del paciente.

Deja fluir tu imaginación.

2) El enunciado es una cagada, está mal redactado (siempre veo esto en la universidad xD).

3) Puedes crear una interfaz con nombre, dirección, teléfono, edad, etc, que puedes implementar en los pacientes y también en los empleados.

4) Trastea todo lo que se te ocurra!


Saludos.


PD: Un POJO es una instancia de una clase que no extiende ni implementa nada en especial. Una pojo debe tener atributos private y setters y getters para éstos. Se usa para crear instancias en donde éstas interactúan con otros objetos a través de setters y getters.