Pildorita de POO y Java: Gestor Universitario I

Como ya adelantamos en la anterior pildorita, en los próximos posts afianzaremos todo lo visto hasta ahora desarrollando por completo el ejemplo que hemos utilizado sobre Profesores, Alumnos y Asignaturas. Para ello, vamos a crear un Gestor Universitario.

Comenzaremos por enunciar el programa de Gestión Universitaria, desde una vista completamente funcional, que es como siempre nos definirán los desarrollos inicialmente:

Se quiere desarrollar una aplicación de Gestión Universitaria que contenga la información relativa a todos los alumnos, profesores y asignatura disponibles.

De los alumnos y profesores almacenaremos su nombre y apellidos, DNI, edad y sexo. También tendremos un código de alumno o profesor, dependiendo del caso, para su identificación interna.

De las asignaturas almacenaremos el nombre, curso y profesor asociado, así como la nota obtenida por cada alumno. Estas asignaturas serán contenidas, o no, por los alumnos. Asimismo, los alumnos podrán tener una o más asignaturas. Las asignaturas también tendrán un profesor que la imparte.

Nuestra aplicación será capaz de dar de alta profesores, alumnos y asignaturas, gestionar las asignaturas y consultar las notas medias del alumno.

¿En que se traduce esto?

Las entidades principales de nuestro problema son tres: Alumno, Profesor y Asignatura.

Alumno y Profesor contendrán mucha funcionalidad común, por lo que puede ser interesante crear una clase padre de la que heredarán ambos: La clase Persona.

La clase Asignatura contendrá un atributo Profesor, y la clase Alumno tendrá una Lista de Asignaturas.

Aunque aún están pendientes las pildoritas de UML (con las que espero comenzar pronto) el Diagrama de Clases puede servirnos de ayuda para visualizar como quedará todo lo que acabamos de definir:

Sabiendo todo esto, ya podemos definir las clases modelo del problema:

Persona

package model.persona;

/**
 * Clase Persona
 * @author mar.millan
 * @version 1.0
 * @since 2014
 */
public class Persona {
	 
    private String nombre;
    private String apellidos;
    private String dni;
    private Integer edad;
    private String sexo;
    
    Persona() {
    	super();
    }
    
    public Persona(String nombre, String apellidos, String dni, Integer edad, String sexo) {
    	super();
    	this.nombre = nombre;
    	this.apellidos = apellidos;
    	this.dni = dni;
    	this.edad = edad;
    	this.sexo = sexo;
    }
    
    public String getNombre() {
        return nombre;
    }
 
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
 
    public String getApellidos() {
        return apellidos;
    }
 
    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }
 
    public String getDni() {
        return dni;
    }
 
    public void setDni(String dni) {
        this.dni = dni;
    }
 
    public Integer getEdad() {
        return edad;
    }
 
    public void setEdad(Integer edad) {
        this.edad = edad;
    }
 
    public String getSexo() {
        return sexo;
    }
 
    public void setSexo(String sexo) {
        this.sexo = sexo;
    }
    
    @Override 
    public String toString() {
        String nuevalinea = System.getProperty("line.separator");
        String resultado = 
                "Nombre: " + this.getNombre() + nuevalinea + 
                "Apellidos: " + this.getApellidos() + nuevalinea + 
                "DNI: " + this.getDni() + nuevalinea +
                "Edad: " + this.getEdad() + nuevalinea +
                "Sexo: " + this.getSexo() + nuevalinea;
        return resultado;
    }
    
	@Override
	public boolean equals(Object object) {
		final Persona aux = (Persona) object;
		if (this == object)
	           return true;
		else if (object == null)
	           return false;
		else if (getClass() != object.getClass())
	           return false;
		else if (this.dni.equals(aux.getDni())) {
			return true;
		} else {
			return false;
		}
	}
}

Profesor

package model.persona;

/**
 * Clase Profesor
 * @author mar.millan
 * @version 2.0
 * @since 2014
 */
public class Profesor extends Persona {
	private String codProfesor;
	
	public Profesor (String codProfesor, String nombre, String apellidos, String dni, Integer edad, String sexo) {
		super(nombre, apellidos, dni, edad, sexo);
		this.codProfesor = codProfesor;
	}
	
	public Profesor(Persona p) {
		super(p.getNombre(), p.getApellidos(), p.getDni(), p.getEdad(), p.getSexo());
	}
	
	public void setCodProfesor(String codProfesor) {
		this.codProfesor = codProfesor;
	}

	public String getCodProfesor() {
		return codProfesor;
	}
	
	@Override
	public String toString() {
        String nuevalinea = System.getProperty("line.separator");
        return "Código Profesor: " + this.getCodProfesor() + nuevalinea + super.toString();
    }
}

Alumno

package model.persona;

import java.util.ArrayList;
import java.util.List;

import exception.UniversidadException;
import model.asignatura.Asignatura;

/**
 * Clase Profesor
 * @author mar.millan
 * @version 2.0
 * @since 2014
 */
public class Alumno extends Persona {
	private String codAlumno;
	private List<Asignatura> asignaturas;
	
	public Alumno (String codAlumno, String nombre, String apellidos, String dni, Integer edad, String sexo) {
		super(nombre, apellidos, dni, edad, sexo);
		this.codAlumno = codAlumno;
		this.asignaturas = new ArrayList<Asignatura>();
	}
	
	public Alumno (Persona p) {
		super(p.getNombre(), p.getApellidos(), p.getDni(), p.getEdad(), p.getSexo());
	}
	
	public void setCodAlumno(String codAlumno) {
		this.codAlumno = codAlumno;
	}
	public String getCodAlumno() {
		return codAlumno;
	}
	public void setAsignaturas(List<Asignatura> asignaturas) {
		this.asignaturas = asignaturas;
	}
	public List<Asignatura> getAsignaturas() {
		return asignaturas;
	}
	
	public void asignarAsignatura(Asignatura asignatura) {
		asignaturas.add(asignatura);
	}

	public double getNotaMedia() throws UniversidadException {
		double resultado = 0;
		
		if (asignaturas == null || asignaturas.size() == 0) {
			throw new UniversidadException("El alumno no puede estar matriculado a 0 asignaturas");
		} else {
			for (Asignatura asig: asignaturas) 
				resultado += asig.getNota();
		}
		return (resultado != 0 ? resultado / asignaturas.size(): 0);
	}
	
	public static void main(String[] args) {
		Alumno alumno = new Alumno("1234", "Mar", "Millan", "44444444K", 30, "F");
		try {
			alumno.getNotaMedia();
		} catch (UniversidadException e) {
			e.printStackTrace();
		}
	}
	
	@Override
	public String toString() {
        String nuevalinea = System.getProperty("line.separator");
        return "Código Alumno: " + this.getCodAlumno() + nuevalinea + super.toString();
    }
}

Asignatura

package model.asignatura;

import model.persona.Profesor;

/**
 * Clase Asignatura
 * @author marmillan
 * @version 2.0
 * @since 2014
 */
public class Asignatura {
	private String nombre;
	private int curso;
	private Profesor profesor;
	private double nota = 0;
	
	public Asignatura(String nombre, int curso, Profesor profesor) {
		super();
		this.nombre = nombre;
		this.curso = curso;
		this.profesor = profesor;
	}
	
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public int getCurso() {
		return curso;
	}
	public void setCurso(int curso) {
		this.curso = curso;
	}
	public Profesor getProfesor() {
		return profesor;
	}
	public void setProfesor(Profesor profesor) {
		this.profesor = profesor;
	}
	public double getNota() {
		return nota;
	}
	public void setNota(double nota) {
		this.nota = nota;
	}

	@Override
	public String toString() {
        String nuevalinea = System.getProperty("line.separator");
        String resultado = "DATOS DE LA ASIGNATURA: " + nuevalinea + 
                "Nombre: " + this.getNombre() + nuevalinea + 
                "Curso: " + this.getCurso() + nuevalinea + 
                "Profesor: " + this.getProfesor() + nuevalinea +
                "Nota: " + this.getNota() + nuevalinea;
          
        return resultado;
    }
	
	@Override
	public boolean equals(Object object) {
		final Asignatura aux = (Asignatura) object;
		if (this == object)
	           return true;
		else if (object == null)
	           return false;
		else if (getClass() != object.getClass())
	           return false;
		else if (this.nombre.equals(aux.getNombre())) {
			return true;
		} else {
			return false;
		}
	}
}

A parte de los atributos que definen cada entidad y sus métodos set y get, hay que destacar los métodos toString y equals. Estos dos métodos se heredan de la clase Object, pero al usar la anotación @Override los redefinimos según nuestro criterio. Además, las clases hijas de Persona, Alumno y Profesor, hacen una segunda reimplementación del toString que se apoya en la definición de su padre a partir de la palabra reservada super.

También son destacables los constructores de las clases Profesor y Alumno que reciben como parámetro una Persona e invocan al constructor super() para rellenar los datos compartidos con Persona.

Por último, la clase Alumno tiene un método que calcula la nota media del alumno. Para ello, se recorre la lista de asignaturas, se suman todas las notas, y tras esto, se divide por el número de asignaturas total. Además, si no hay asignaturas asociada al alumno se lanzará una excepción funcional.

Es interesante destacar que se ha creado un paquete, model, donde estarán las clases que definen las entidades del modelo. A su vez, hemos separado en el subpaquete persona la clase Persona y derivadas – Profesor y Alumno – y otro para asignatura. Se ha creado así para que a la hora de explorar el proyecto desde un sistema de carpetas tengamos nuestras clases clasificadas de una manera organizada.

¿Cómo creamos, añadimos y relacionamos asignaturas, profesores y alumnos?

Podríamos hacer una clase Test, que es lo que he hecho en el trascurso de las pildoritas de POO. En ella se podrían crear un par de objetos de tipo Asignatura, otros tantos Profesor y otros cuantos Alumno. Se setearían sus atributos, se asignarían profesores a asignaturas y asignaturas a alumnos, se obtendrían las notas medias…En definitiva, se podrían ejecutar todas las funcionalidades que nos placiera.

Por ejemplo, una clase de este tipo sería la vista en la pildorita de introducción a la orientación a objetos:

package model.persona;
/**
 * Clase Test para probar la clase Persona
 * @version 1.0
 * @since 2014
 */
public class PruebaPersona {
	 
    public static void main(String[] args) {
         
        Persona mar = new Persona();
               
        mar.setNombre("Mar");
        mar.setApellidos("Millan");
        mar.setEdad(27);
        mar.setSexo("F");
        mar.setDni("01168899Q");
         
         
        System.out.println(mar.toString());
         
    }
}

No obstante, nosotros no deseamos un programa que siempre cree los mismos objetos con los mismos estados. Cualquier aplicación de gestión que se precie tendrá una o varias clases que implementen las funcionalidades de gestión, así como una interfaz de usuario que permita ejecutar todas estas funcionalidades de forma dinámica.

Pero eso tendrá que esperar a las próximas pildoritas 😉

Índice de Pildoritas

Share