Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - luu02

Páginas: [1]
1
Hola chicos, no sé si podríais ayudarme con un ejercicio que me está resultando algo difícil. Tengo algunas dudas con los patrones de diseño y me cuesta diferenciarlos. Y en el ejercicio que os dejo a continuación me han pedido implementar el código en java para todo el proyecto además de diseñar el diagrama de clases, incluyendo los distintos patrones que se implementen.
Os indico los patrones que hemos llegado a ver:
  • Singleton
  • Factory Method
  • Abstract Factory
  • Adapter
  • Composite
  • Facade
  • Decorator
  • Template Method
  • Observer
  • Strategy

Simplemente con que me ayudéis a distinguir las distintas clases que habría (con sus respectivos atributos) y los patrones que serían necesarios me ayudaríais un montón :)

Os dejo el enunciado del ejercicio a continuación y gracias de antemano:
Citar
Un Centro de Convenciones necesita un sistema informático que de manera automática gestione la reserva y ocupación de sus espacios. Los espacios representan los salones de que dispone. El sistema deberá ser capaz de registrar nuevos espacios. De un espacio se debe registrar su código, su nombre, su capacidad y un listado (histórico) con el coste por día para cada año desde que se habilitó el espacio. De ese listado es de donde se debe tomar el coste para poder calcular los ingresos. A un espacio dado se le puede añadir equipamiento extra (opcional) en función del evento que se celebre. Este equipamiento puede ser una ornamentación especial, un equipo de música con sus altavoces o un escenario si el evento lo requiere. De estos equipamientos se debe registrar, un código numérico identificativo, su descripción y el coste de ese equipamiento que será una cantidad que dependerá de cada caso (un mismo equipamiento podrá tener precios distintos para espacios y momentos distintos) y deberá introducir el usuario cada vez que se use dicho equipamiento. El sistema debe estar abierto a poder extender a nuevos equipamientos si aparece una nueva demanda. Solo se pueden reservar aquellos espacios que aparezcan en el sistema. De la reserva se debe registrar el nombre del cliente que hizo la reserva, su teléfono, la fecha del evento, el código del espacio que se reserva y la lista de consumiciones que se hayan hecho en total. De una consumición se debe registrar el producto que se ha consumido y la cantidad. Las consumiciones las prepara la cocina que dispone el centro de convenciones. La cocina dispone de su propia carta de productos que se organiza por secciones. Así se puede encontrar una sección de menús, otra con platos individuales, y otra de bebidas o cócteles. De cada producto que se oferte para su consumición se debe registrar un código, su descripción y un listado (histórico) con coste del producto para cada año desde que está disponible. El sistema debe estar abierto a poder añadir nuevos tipos de productos u oferta a su carta.
Tanto los espacios como productos dados de alta en el sistema no se eliminan. En caso de no estar disponible por la causa que fuere, se deberá registrar su no disponibilidad para que no se pueda hacer uso de él. En el caso de que volviera a estar disponible, solo haría falta actualizar su disponibilidad para poder acceder al recurso.
La primera vez que arranque el sistema deberá crear el objeto carta del cual dependerán jerárquicamente las secciones y, de estas, los productos disponibles para su preparación en la cocina del Centro de Convenciones.

Gestión de espacios
• Dar de alta un nuevo espacio. Se le añade un precio para el año en curso.
• Añadir un nuevo precio a todos los espacios para un año dado. Para ello se solicitará el año que se quiere registrar y el porcentaje de incremento sobre el precio del año anterior. Si para un espacio ya existe precio para ese año o no existe para el año anterior entonces no se llevará a cabo acción alguna sobre ese espacio.
• Hacer disponible un espacio ya existente
• Hacer no disponible un espacio ya existente
• Listar la información de todos los espacios disponibles.

Gestión de Reservas
• Dar de alta. Para ello, se mostrará un listado con todos los espacios disponibles para la fecha seleccionada y que tenga la capacidad adecuada para albergar el número de personas que van a participar en el evento que se desea organizar. En caso de que no haya espacios que cumplan esas condiciones, se terminará el
proceso sin dar de alta la reserva. En caso contrario, se seleccionará un espacio y, a continuación, se solicitará al usuario si el espacio reservado requiere de algún equipamiento especial. El equipamiento así asignado no se puede cambiar para dicha reserva. Cualquier cambio implicaría cancelar la reserva y reiniciar el proceso. Por último, se consignarán aquellas peticiones de consumición que se desea realizar a priori. • Dar de baja una reserva. La elimina del sistema. Sólo se puede dar de baja una reserva si la fecha de la reserva todavía no ha vencido.
• Añadir una nueva consumición a una reserva. Se contempla la posibilidad de añadir nuevas consumiciones a una reserva con anterioridad o durante la celebración del evento.
• Eliminar una consumición de una reserva.
• Listar la información de todas las reservas.
• Mostrar la información de una reserva concreta.

Gestión de la Carta de Productos
• Dar de alta una sección de la carta. A la hora de dar de alta una nueva sección se ha de indicar el nombre de la nueva sección de la cuál dependerán nuevos productos.
• Dar de alta un nuevo producto. Un nuevo producto puede ser desde un menú ya predefinido, a un plato o coctel concreto. Para dar de alta un nuevo producto se debe seleccionar la sección donde se le quiere incluir. Para ello el sistema mostrará el listado de secciones existente. Se le añade un precio para el año en curso.
• Añadir un nuevo precio a todos los productos de la carta para un año dado. Para ello se solicitará el año que se quiere registrar y el porcentaje de incremento sobre el precio del año anterior. Si para un espacio ya existe precio para ese año o no existe para el año anterior entonces no se llevará a cabo acción alguna sobre ese espacio.
• Hacer disponible un producto ya existente
• Mostrar la información de una sección con los productos disponibles.

Gestión económica
• Mostrar los ingresos totales obtenidos por un espacio en un periodo concreto. Este periodo debe ser anterior a la fecha actual.
• Mostrar los ingresos totales obtenidos del centro de convenciones en un periodo concreto. Este periodo debe ser anterior a la fecha actual.

2
Hola a todos, he empezado hace relativamente poco con la programación y en particular con el programa Java, así que disculpen mi ignorancia en algunos aspectos ;)

Llevo unos días con un proyecto pero me he atascado a la hora de realizar los Menus y en la opción de guardar los datos en un fichero.

Todas aquellas clases que ya tengo implementadas las publico al final.

El enunciado del proyecto es el siguiente:

Citar
Una compañía de software necesita de un sistema de gestión de sus recursos humanos. En la compañía existen dos tipos de Contratos: Consultores y Empleados Técnicos. A la compañía le interesa saber de los consultores su ID, nombre, fecha de inicio de su contrato, fecha final de su contrato, su salario, y la labor que desempeñan. Por otra parte, los Empleados Técnicos pueden ser Programadores, aunque no se descarta que un futuro se pueda ampliar a otro tipo de trabajadores. De los programadores interesa conocer: ID, nombre, fecha de inicio de su contrato, fecha final de su contrato, su salario mensual y el lenguaje de Programación en el cual es experto. Si un programador utiliza el lenguaje de programación Java recibe un 20% más, respecto de su salario como bonificación. A la compañía de software también le interesa gestionar la información de los líderes de Proyecto. Un líder de proyecto es un empleado técnico que es responsable de un equipo de empleados técnicos. La compañía posee una estructura jerárquica de responsabilidades en forma de árbol, es decir, existe un líder del que dependen otros lideres de proyecto, de los que, a su vez, dependen los programadores. De esta forma el Líder principal asigna los proyectos a los lideres que tiene a su cargo, y estos se hacen cargo del proyecto con los programadores que conforman su equipo. A un trabajador técnico se le añade un 5 % de su salario por cada proyecto dirigido. Los lideres de proyecto se asignan según las necesidades de la empresa, por lo que un trabajador técnico (en nuestro caso un programador) puede ser, o dejar de ser, un líder de proyecto según se necesite. Sin embargo, el Líder que lidera a los otros líderes del proyecto no cambia una vez se le asigne ese puesto ya que es el Director General de la empresa. Todo líder de proyecto depende de un proyecto (salvo el Director General). Un líder no puede liderar más de un proyecto a la vez. Un programador no puede estar en más de un proyecto a la vez. El sistema también deberá llevar un registro de los proyectos realizados. De un proyecto se necesita conocer, Su ID, nombre y que programador lo lidera.

El sistema de gestión debe permitir realizar las siguientes operaciones:

La primera acción, antes de empezar con el resto de las posibles gestiones sería dar de alta al Director General. Esta operación implica dar de alta a un programador, asignárselo a un objeto de tipo líder y, por último, registrarlo como el Director General. Esta operación no debe volver a aparecer en el menú principal si el Director General ya ha sido asignado.

Gestión de los contratos:
• Dar de alta y baja nuevos contratos. A la hora de dar de baja un contrato no se elimina; se asigna la fecha de cese a la fecha de fin de contrato.
• Listar la información de todos los contratos activos de la empresa.
• Listar la información de todos los contratos finalizados de la empresa.
• Listar la estructura jerárquica de la empresa.
• Mostrar los datos de un Líder y el equipo de programadores que dependen de él.

Gestión de nóminas.
• Calcular el salario mensual total producto de los todos contratos de los Consultores que están en activo.
• Calcular el salario mensual total producto de los todos contratos de los Programadores que están en activo.
• Mostrar el Informe de nómina de un empleado: Se detallará toda la información relativa del empleado distinguiendo si es consultor o programador. En este último caso se detallarán las bonificaciones que posea (ser experto en Java o por ser Líder de Proyecto).

Gestión de Proyectos.
• Dar de alta un nuevo proyecto. Al dar de alta un proyecto se le debe asignar un líder. Esta operación consiste en elegir un líder de entre los trabajadores técnicos disponibles, registrarlo tanto en el proyecto como en la estructura jerárquica de la compañía y, por último, asignarle el equipo de programadores que estará a su cargo.
• Dar de baja un proyecto. A la hora de dar de baja un proyecto se le asigna la fecha de finalización a la fecha de fin de proyecto y se elimina la referencia del líder de proyecto de la estructura jerárquica de la empresa que depende del D.G.
• Mostrar la información de un proyecto concreto.
• Listar la información de todos los proyectos activos de la empresa.
• Listar la información de todos los proyectos finalizados de la empresa.

Salvar datos.
• Opción que guarda todos los datos en un fichero persistente. El sistema debe permitir almacenar de forma persistente la información de los contratos registrados en todo momento. En ese sentido, al iniciar el programa se debe cargar la información previa de todos los contratos.


A continuación adjunto las clases que ya tengo implementadas:


Consultor.java

Código: [Seleccionar]
public class Consultor extends Contrato {
    private String labor;

    public Consultor(String labor, String ID, String nombre, double salario) {
        super(ID, nombre, salario);
        this.labor = labor;
    }
   
    public String getLabor() {
        return labor;
    }
   
    public String toString() {
        return super.toString() + " Consultor: " + "labor=" + labor;
    }
   
    public void mostrarInfo(){
        System.out.println(toString());
    }

    public boolean serTecnico(){
        return false;
    }
}


Contrato.java

Código: [Seleccionar]
import Excepciones.FechaFinExcepcion;
import java.io.Serializable;
import java.time.LocalDate;

public abstract class Contrato implements Serializable {
    private final String ID;
    private final String nombre;
    private final double salario;
    private final LocalDate fecha_inicio;
    private LocalDate fecha_fin;
   
    public Contrato(String ID, String nombre, double salario){
        this.ID = ID;
        this.nombre = nombre;
        this.salario = salario;
        fecha_inicio = LocalDate.now();
    }
   
    public String getID() {
        return ID;
    }
   
    public String getNombre() {
        return nombre;
    }
   
    public double getSalario() {
        return salario;
    }

    public String toString() {
        String info = "Contrato:" + "ID=" + ID + ", nombre=" + nombre + ", salario=" + salario;
        if(fecha_fin==null)
            return info;
        else
            return info + ", fecha de fin=" + fecha_fin;
    }
   
    public boolean serActivo(){
        return fecha_fin==null;
    }
   
    public boolean serInactivo(){
        return fecha_fin!=null;
    }
   
    public void setFecha_Fin(LocalDate fecha) throws FechaFinExcepcion{
            if(fecha.isBefore(fecha_inicio))
                throw new FechaFinExcepcion("La fecha introducida ");
            else fecha_fin = fecha;
    }
   
    public void setFecha_Fin(){
        fecha_fin=LocalDate.now();
    }
   
    public abstract boolean serTecnico();
    public abstract void mostrarInfo();
}


Decorador_DirectorGen.java

Código: [Seleccionar]
public abstract class Decorador_DirectorGen extends EmpleadoTecnico {
    private final EmpleadoTecnico tecnico;
   
    public Decorador_DirectorGen(EmpleadoTecnico tecnico) {
        super("", "", 0.0);
        this.tecnico = tecnico;
    }
   
    public String getID() {
        return tecnico.getID();
    }
   
    public double getSalario() {
        return tecnico.getSalario();
    }
   
    public String toString(){
        return tecnico.toString();
    }
}


EmpleadoTecnico.java

Código: [Seleccionar]
public abstract class EmpleadoTecnico extends Contrato {
    private int ProyectosLidera = 0;
   
    public EmpleadoTecnico(String ID, String nombre, double salario) {
        super(ID, nombre, salario);
    }

    public int getProyectosLidera(){
        return ProyectosLidera;
    }
   
    public void añadeProyectoLidera(){
        ProyectosLidera = ProyectosLidera + 1;
    }
   
    public boolean serTecnico(){
        return true;
    }

    public String toString() {
        return super.toString() + ", Proyectos liderados=" + ProyectosLidera;
    }
   
    public abstract void mostrarInfo();
    public abstract void añadir(EmpleadoTecnico et);
    public abstract void eliminar(EmpleadoTecnico et);
    public abstract EmpleadoTecnico obtenerComponente(String id);
}


Lider.java

Código: [Seleccionar]
import java.util.ArrayList;

public class Lider extends Decorador_DirectorGen {
    private final ArrayList<EmpleadoTecnico> lista;
    String IDProyecto;

    public Lider(EmpleadoTecnico tecnico, String IDProyecto) {
        super(tecnico);
        lista=new ArrayList<>();
        this.IDProyecto=IDProyecto;
    }
   
    public String toString(){
        return super.toString()+", lidera el proyecto con ID: "+IDProyecto;
    }
   
    public void mostrarInfo(){
        System.out.println("Lider de Proyecto: "+toString());
        for(EmpleadoTecnico c:lista)
            c.mostrarInfo();
    }
   
    public double getSueldo(){
        double sumador=0;
        for (EmpleadoTecnico c: lista){
            sumador=sumador+c.getSalario();}
        return sumador;
    }
   
    public void añadir(EmpleadoTecnico e){
        lista.add(e);
        System.out.println("se agrega "+e.toString());
    }
   
    public void eliminar(EmpleadoTecnico e){
        if (lista.contains(e)) {
            lista.remove(e);
            System.out.println("se elimina "+toString());}
        else
            for(EmpleadoTecnico c:lista) 
                c.eliminar(e);
    }
   
    public EmpleadoTecnico obtenerComponente(String ID){
        if (getID().equals(ID))
            return this;
        else{
            for(EmpleadoTecnico c:lista)
                if (c.obtenerComponente(ID)!=null)
                    if(c.obtenerComponente(ID).getID().equals(ID))
                        return c.obtenerComponente(ID);
            return null;
        }
    }
   
    public EmpleadoTecnico obtenerLider(String ID){
        if (getID().equals(ID))
            return this;
        else{
            for (EmpleadoTecnico c:lista)
                if (c.getID().equals(ID))
                    return c;
            return null;
        }
    }
}


Menu_Principal.java

Código: [Seleccionar]
import Entrada.MyInput;
import java.util.ArrayList;

public class Menu_Principal extends Menus{
    private ArrayList<Menus> menus=new ArrayList<Menus>();
   
   
    public Menu_Principal(Empresa empresa){
        super(empresa);
        menus.add(new Menu_Contrato(empresa));
        menus.add(new Menu_Proyecto(empresa));
        menus.add(new Menu_Nomina(empresa));
        menus.add(new Salvar_Datos(empresa));
    }

    public void darAltaDirectorGeneral(){
        Menu_Contrato mc= (Menu_Contrato) menus.get(0);
        EmpleadoTecnico c=mc.crearContratoProgramador();
        getEmpresa().altaContrato(c);
        getEmpresa().setDirectorGeneral(new Lider((EmpleadoTecnico) c, ""));
    }
   
   
    public String ejecutarOpciones(){
        if(!getEmpresa().existeDirectorGeneral()){
            System.out.println("Dando de alta al Director General");
            darAltaDirectorGeneral();}
        System.out.println("");
        System.out.println("Menú Principal.");
        System.out.println("Seleccione una opción:");
        System.out.println("0. Salir del programa");
        System.out.println("1. Gestión Contratos");
        System.out.println("2. Gestión Proyectos");
        System.out.println("3. Gestión Nóminas");
        System.out.println("4. Salvar datos");
        String s=MyInput.readString();
        int i;
        try{
                i= Integer.parseInt(s);
        }catch(NumberFormatException ex){
                  System.out.println("La entrada no tiene formato de número. Inténtelo de nuevo");
                  return "s";
               }
        if((i>0)&&(i<=menus.size())){
                menus.get(i-1).ejecutar();
                return "s";}
        else if ((i<0)||(i>menus.size())){
            System.out.println("Opción no válida. Inténtelo de nuevo.");
            return "s";}
        else
            return "n";
    }
}


Menus.java

Código: [Seleccionar]
public abstract class Menus {
    private Empresa empresa;
   
    public Menus(Empresa empresa){
        this.empresa=empresa;
    }
   
    public Empresa getEmpresa(){
        return empresa;
    }
   
    public void ejecutar(){
        String respuesta="";
        do{
            respuesta= ejecutarOpciones();
        }while(respuesta.equals("s"));
    }
   
    public abstract String ejecutarOpciones();
}


Programador.java

Código: [Seleccionar]
public class Programador extends EmpleadoTecnico{
    private String lenguaje_prog;
    private double getNumProyectosLiderados;
   
    public Programador(String ID, String nombre, double salario, String lenguaje_prog) {
        super(ID, nombre, salario);
        this.lenguaje_prog=lenguaje_prog;
    }

    public double getSalario(){
        double modificador=0.0;
        if(lenguaje_prog.equalsIgnoreCase("java"))
            modificador=0.2;
        return super.getSalario()*(1+modificador+getNumProyectosLiderados);
    }
   
    public void mostrarInfo(){
          System.out.println(toString());}
   
    public void añadir(EmpleadoTecnico e){
      System.out.println("no se le puede añadir empleados"); }
   
    public void eliminar (EmpleadoTecnico e){ }
   
    public EmpleadoTecnico obtenerComponente(String ID){
        return this;
    }
   
}


Proyecto.java En esta clase me faltaría sólo el método "getLiderProyecto()".

Código: [Seleccionar]
import Excepciones.FechaFinExcepcion;
import java.time.LocalDate;

public abstract class Proyecto {
    private final String ID;
    private final String nombre;
    private final LocalDate fecha_inicio;
    private LocalDate fecha_fin;
   
    public Proyecto(String ID, String nombre){
        this.ID = ID;
        this.nombre = nombre;
        fecha_inicio = LocalDate.now();
    }
   
    public String getID(){
        return ID;
    }
   
    public String getNombre() {
        return nombre;
    }
   
    public boolean serActivo(){
        return fecha_fin==null;
    }
   
    public boolean serInactivo(){
        return fecha_fin!=null;
    }
   
    public void setFecha_Fin(LocalDate fecha) throws FechaFinExcepcion{
            if(fecha.isBefore(fecha_inicio))
                throw new FechaFinExcepcion("La fecha introducida ");
            else fecha_fin = fecha;
    }
   
    public void setFecha_Fin(){
        fecha_fin=LocalDate.now();
    }

    public abstract void mostrarInfo();

    Lider getLiderProyecto() {}
   
}


main.java

Código: [Seleccionar]
import Entrada.MyInput;
import Practica_Final.Menu_Principal;
import Practica_Final.Menus;
import Practica_Final.Empresa;

public class GestionRRHH {
    public static void main(String[] args) {
        Empresa empresa= MyInput.deserialize("datos.dat");
        if(empresa==null)
            empresa= Empresa.getInstancia();
        Menu_Principal mp= new Menu_Principal(empresa);
        mp.ejecutar();
        MyInput.serialize(empresa, "datos.dat");
    }
}

Páginas: [1]

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

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".