Este proyecto, desarrollado en Java utilizando el entorno NetBeans, es una simulación de un sistema escolar para la Escuela de Informática Río Grande. La aplicación está diseñada aplicando los principios del paradigma de programación orientada a objetos (POO) y se centra en el manejo de tres tipos de usuarios: Maestro, Alumno y Tutor. Cada uno de estos roles cuenta con características y funcionalidades específicas, permitiendo practicar conceptos fundamentales como herencia, encapsulamiento, clases abstractas, interfaces y métodos.
- Clases y jerarquía de usuarios
- Usuario (Clase abstracta): Define los atributos básicos comunes a todos los usuarios, como id, nombre, apellido y correo electrónico. También implementa un método para imprimir el perfil de usuario.
- Perfil (Interfaz):
Especifica el método
mostrarPerfil(), que es implementado por las clases derivadas para mostrar la información básica del usuario. - Alumno:
Extiende de
Usuarioy agrega la funcionalidad de gestionar una calificación. Incluye métodos para guardar y mostrar la calificación, validando que ésta se encuentre entre 0 y 10. - Maestro:
También extiende de
Usuarioy, aunque inicialmente posee funcionalidades básicas, se muestra la capacidad de actualizar información (por ejemplo, el nombre) y realizar operaciones CRUD simuladas. - Tutor:
Además de extender de
Usuario, la claseTutorse asocia a un objetoAlumno. Su función principal es imprimir su perfil junto con el perfil del alumno asignado y mostrar la calificación del alumno.
- Clase principal y simulación de base de datos
La clase
Principales el punto de entrada de la aplicación y se encarga de:- Inicializar instancias de cada tipo de usuario.
- Simular operaciones CRUD (Crear, Leer, Actualizar, Eliminar) para Maestros, Alumnos y Tutores.
- Solicitar y guardar calificaciones para los alumnos a través de la entrada por consola.
- Mostrar los perfiles y calificaciones, simulando así la interacción con una base de datos, pero mediante impresión en la consola.
- Lenguaje de programación: Java Se aprovechan características avanzadas de Java, como clases abstractas, interfaces y manejo de excepciones.
- Entorno de desarrollo: NetBeans Este IDE facilitó la organización del proyecto y la simulación de operaciones de base de datos mediante colecciones en memoria.
- Conceptos de Programación Orientada a Objetos:
- Herencia: Uso de clases derivadas (
Alumno,Maestro,Tutor) que extienden de la clase abstractaUsuario. - Encapsulamiento: Manejo de atributos privados y métodos públicos para garantizar la integridad de los datos.
- Abstracción y polimorfismo: A través de la clase abstracta
Usuarioy la interfazPerfil, se implementa un diseño modular y flexible. - CRUD simulado: Se realizan operaciones de inserción, consulta, actualización y eliminación sobre listas, emulando la interacción con una base de datos.
- Herencia: Uso de clases derivadas (
La aplicación está pensada para mejorar la eficiencia del sistema escolar, ofreciendo:
- Gestión de usuarios: Permite la creación y mantenimiento de perfiles de maestros, alumnos y tutores.
- Interacción dinámica: A través de la consola, se solicita la calificación de cada alumno, asegurando que se cumpla con la validación necesaria.
- Operaciones CRUD: Se simulan acciones comunes de bases de datos, como insertar nuevos registros, consultar usuarios por su ID, actualizar información y eliminar registros.
- Impresión de perfiles y calificaciones: Cada usuario puede ver sus datos básicos y, en el caso de alumnos y tutores, se muestra la calificación asociada al alumno.
- Experiencia de usuario amigable: La aplicación utiliza mensajes claros y estructurados, brindando una experiencia interactiva y comprensible incluso para quienes no están familiarizados con el código.
package Reto5;
public class Alumno extends Usuario {
private float calificacion;
public Alumno(int id, String nombre, String apellido, String correo) {
super(id, nombre, apellido, correo);
}
public void guardarCalificacion(float calificacion){
if(calificacion >= 0 && calificacion <= 10) {
this.calificacion = calificacion;
} else {
System.out.println("La calificación debe estar en el rango de 0 a 10.");
}
}
public float getCalificacion() {
return calificacion;
}
public String getNombre() {
return nombre;
}
public String getApellido() {
return apellido;
}
@Override
public void mostrarPerfil() {
System.out.println("ID: " + id + "\nNombre: " + nombre + "\nApellido: " + apellido + "\nCorreo electrónico: " + correo + "\n");
}
public void mostrarCalificacion() {
System.out.println("Calificacion: " + calificacion + "\n");
}
}- Herencia de
Usuario: La claseAlumnoextiende de la clase abstractaUsuario, lo que significa que hereda atributos y métodos comunes a todos los usuarios (comoid,nombre,apellidoycorreo). Esto permite reutilizar el código y mantener un diseño modular y organizado. Ejemplo: Al crear un alumno, se inicializan sus datos básicos a través del constructor deUsuario. - Paquete:
El código se encuentra en el paquete
Reto5, lo cual organiza el proyecto y facilita la gestión de clases relacionadas.
private float calificacion;Este atributo almacena la calificación del alumno. Se declara comoprivatepara asegurar el principio de encapsulamiento, es decir, que solo pueda modificarse a través de métodos específicos.
public Alumno(int id, String nombre, String apellido, String correo)El constructor inicializa un objetoAlumnousando los parámetros proporcionados.super(...): Llama al constructor de la claseUsuariopara asignar los valores básicos.- Objetivo: Garantizar que cada objeto alumno tenga una identidad única (ID), nombre, apellido y correo electrónico desde el inicio.
public void guardarCalificacion(float calificacion)- Funcionalidad: Permite asignar una calificación al alumno.
- Validación: Se verifica que la calificación esté dentro del rango de 0 a 10. Si la calificación es válida, se guarda; de lo contrario, se muestra un mensaje de error.
- Importancia: Garantiza la integridad de los datos, asegurándose que los valores fuera de rango no sean asignados.
public float getCalificacion()- Funcionalidad: Retorna el valor de la calificación almacenada.
- Uso: Permite acceder a la calificación sin modificarla, siguiendo el principio de encapsulamiento.
public String getNombre()ypublic String getApellido()- Propósito: Facilitan el acceso a los atributos
nombreyapellidoheredados deUsuario. - Ventaja: Estos métodos permiten obtener la información personal del alumno de forma controlada.
- Propósito: Facilitan el acceso a los atributos
@Override public void mostrarPerfil()- Funcionalidad: Imprime en consola los datos básicos del alumno: ID, nombre, apellido y correo electrónico.
- Sobreescritura: Al estar anotado con
@Override, se indica que este método modifica o complementa la implementación demostrarPerfil()definida en la clase padre o en la interfazPerfil. - Objetivo: Ofrecer una forma rápida y legible de revisar la información del alumno.
public void mostrarCalificacion()- Funcionalidad: Muestra la calificación del alumno en la consola.
- Importancia: Permite verificar visualmente el rendimiento académico del alumno en la aplicación.
- Encapsulamiento y seguridad de datos:
La declaración de atributos como
calificacionen modoprivatey el uso de métodosgetysetgarantizan que la información se manipule de manera controlada, lo cual es una práctica esencial en la programación orientada a objetos. - Validaciones:
La validación dentro del método
guardarCalificaciones fundamental para evitar la entrada de datos erróneos o fuera de los límites permitidos. Esto es crucial en sistemas reales donde la integridad de la información afecta el rendimiento del sistema. - Herencia y reutilización de código:
Al extender de la clase
Usuario, la claseAlumnono necesita redefinir atributos y comportamientos comunes, lo que reduce la redundancia y facilita el mantenimiento del código. - Interfaz y polimorfismo:
Al implementar el método
mostrarPerfil()de la interfazPerfil, se asegura que cada clase derivada (comoAlumno) presente la información de forma consistente, permitiendo el polimorfismo en el manejo de diferentes tipos de usuarios. - Estilo de programación y legibilidad: El código está escrito de manera clara y estructurada, lo que facilita la comprensión y el mantenimiento, incluso para usuarios generales o desarrolladores que se acerquen al proyecto por primera vez. Además, se puede complementar con emojis o comentarios adicionales para hacerlo más amigable en el portafolio.
package Reto5;
public class Maestro extends Usuario{
public Maestro(int id, String nombre, String apellido, String correo) {
super(id, nombre, apellido, correo);
}
public void setNombre(String nombre) {
super.setNombre(nombre);
}
}- Herencia de
Usuario: La claseMaestroextiende de la clase abstractaUsuario, lo que significa que hereda atributos comunes como id, nombre, apellido y correo. Esto permite reutilizar el código y mantener un diseño coherente en el sistema, ya que todos los tipos de usuarios comparten ciertas características básicas. - Paquete:
El código se encuentra en el paquete
Reto5, lo que ayuda a organizar las clases relacionadas con el reto y facilita la gestión del proyecto.
public Maestro(int id, String nombre, String apellido, String correo)- Función:
El constructor se encarga de inicializar un objeto
Maestrocon los datos básicos del usuario, utilizando el constructor de la claseUsuariomediante la llamada asuper(...). - Ventaja: Garantiza que cada maestro cuente con un identificador único y la información necesaria para ser reconocido dentro del sistema.
- Función:
El constructor se encarga de inicializar un objeto
public void setNombre(String nombre)- Funcionalidad:
Este método permite modificar el nombre del maestro. Se utiliza la implementación del método
setNombredefinido en la claseUsuariopara actualizar este atributo. - Propósito: Facilita la actualización de la información del maestro en caso de que se requiera un cambio, manteniendo el principio de encapsulamiento y reutilización de código.
- Funcionalidad:
Este método permite modificar el nombre del maestro. Se utiliza la implementación del método
- Simplicidad:
La clase
Maestroestá diseñada de forma simple, delegando gran parte de la funcionalidad a la clase padreUsuario. Esto no solo reduce la redundancia del código, sino que también permite que futuras mejoras o modificaciones en la estructura de usuario se reflejen automáticamente en todas las clases derivadas. - Encapsulamiento:
Aunque en este caso el método
setNombresolo actúa como una interfaz para la modificación del nombre, se mantiene el control sobre cómo y cuándo se realizan estos cambios, asegurando que los datos sean actualizados de manera controlada.
package Reto5;
public interface Perfil {
void mostrarPerfil();
}- Definición: Una interfaz en Java define un contrato que las clases deben cumplir, especificando métodos que deben implementarse. No contiene implementación de métodos (salvo que se usen métodos por defecto), lo que permite garantizar que diferentes clases ofrezcan una funcionalidad común.
void mostrarPerfil();- Propósito:
Este método obliga a cualquier clase que implemente la interfaz
Perfila definir su propio comportamiento para mostrar la información del perfil. - Uso en el sistema:
Al implementar
mostrarPerfil(), las clases comoAlumno,MaestroyTutoraseguran que puedan presentar de manera consistente los datos básicos de un usuario, aunque cada uno pueda tener detalles adicionales propios.
- Propósito:
Este método obliga a cualquier clase que implemente la interfaz
- Polimorfismo:
La interfaz permite tratar a diferentes tipos de usuarios de manera uniforme. Por ejemplo, en el método
mostrarPerfiles()de la clasePrincipal, se puede invocarmostrarPerfil()en cada objeto sin preocuparse por la clase concreta, ya que todas implementan la misma interfaz. - Flexibilidad:
Al definir un contrato claro, la interfaz facilita futuras expansiones del sistema. Nuevas clases de usuarios o roles solo deben implementar
mostrarPerfil()para integrarse con el resto del sistema, promoviendo un diseño modular y extensible. - Conceptos: La interfaz ayuda a separar la definición de la funcionalidad (qué se espera que haga) de su implementación (cómo se hace), lo que mejora la claridad y organización del código.
- Listas de Objetos:
Se crean listas estáticas para almacenar instancias de Maestro, Alumno y Tutor. Estas listas actúan como una "base de datos" en memoria para simular operaciones CRUD.
private static List<Maestro> maestrosprivate static List<Alumno> alumnosprivate static List<Tutor> tutores
- Scanner para entrada de datos:
Se utiliza un objeto
Scanner(definido comostatic final) para leer datos desde la consola, lo que permite la interacción del usuario.private static final Scanner entrada = new Scanner(System.in);Esto permite la entrada dinámica de calificaciones por parte del usuario.
- Secuencia de ejecución:
El método
maines el punto de entrada de la aplicación y ejecuta el programa:- Inicialización: Llama a
inicializarObjetos()para poblar las listas con instancias predeterminadas de maestros, alumnos y tutores. - Visualización: Llama a
mostrarPerfiles()para imprimir en consola la información de cada usuario. - Interacción: Ejecuta
solicitarYGuardarCalificaciones()para pedir al usuario calificaciones para cada alumno y, posteriormente,mostrarCalificacionesTutores()para visualizar las calificaciones asociadas a cada tutor. - Operaciones CRUD:
- Insertar: Se añade un nuevo maestro.
- Consultar y Actualizar: Se busca un maestro por su ID y se actualiza su nombre.
- Eliminar: Se elimina un maestro específico por su ID.
- Cierre del Scanner: Finalmente, se cierra el objeto
Scannerpara liberar recursos.
- Inicialización: Llama a
- Método
inicializarObjetos():- Se crean instancias predeterminadas para cada tipo de usuario y se añaden a sus respectivas listas.
- Ejemplo:
maestros.add(new Maestro(1, "Susana", "Vivanco", "susanavivanco@mail.com"));
- Permite simular un entorno con datos ya existentes, facilitando la demostración de las funcionalidades del sistema.
- Maestro, Alumno y Tutor:
La clase implementa métodos específicos para cada tipo de usuario, permitiendo:
- Insertar: Añadir nuevos objetos a las listas.
- Obtener por ID: Buscar un objeto dentro de la lista usando una expresión lambda con streams.
- Actualizar: Modificar el objeto encontrado en la lista.
- Eliminar: Remover un objeto de la lista según su ID. Estas operaciones demuestran la capacidad de la aplicación para gestionar dinámicamente los datos, simulando interacciones con una base de datos real.
- Método
mostrarPerfiles():- Imprime la información de los maestros, alumnos y tutores.
- Cada usuario utiliza el método
mostrarPerfil()(definido en la claseUsuarioo implementado por cada subclase), lo que garantiza consistencia en la salida de datos. - Esta funcionalidad es crucial para validar la correcta inicialización y manipulación de los objetos.
- Método
solicitarYGuardarCalificaciones():- Recorre la lista de alumnos solicitando una calificación para cada uno.
- Implementa un bucle
do-whileque se asegura de que la calificación ingresada se encuentre en el rango permitido (0 a 10). - Si la entrada es inválida, se solicita nuevamente el dato, reforzando la integridad de la información.
- Método
mostrarCalificacionesTutores():- Para cada tutor, se muestra el nombre y la calificación del alumno asociado, facilitando la verificación visual del proceso de asignación de calificaciones.
- Modularidad y reutilización: Cada funcionalidad se encapsula en métodos bien definidos, lo que permite una fácil extensión y mantenimiento del código.
- Uso de streams: La utilización de streams para filtrar y buscar objetos en las listas es una práctica en Java, que hace el código más limpio.
- Simulación de base de datos: Aunque la aplicación utiliza colecciones en memoria, la estructura de los métodos CRUD es similar a la que se emplearía con una base de datos real, lo que facilita la escalabilidad del proyecto.
- Interacción usuario-programa: La lectura desde consola y la validación de datos aseguran que la aplicación es interactiva y robusta ante entradas erróneas.
En síntesis
- El método
maincoordina la inicialización, visualización, interacción y manipulación de datos. - Se utilizan listas para almacenar y gestionar maestros, alumnos y tutores, simulando un entorno de base de datos.
- Se implementan métodos para insertar, consultar, actualizar y eliminar datos, demostrando la aplicabilidad del patrón CRUD en POO.
- La aplicación solicita calificaciones a través de la consola, valida la información y muestra los resultados, garantizando una experiencia de usuario interactiva.
- Extensión de
Usuario: La claseTutorhereda de la clase abstractaUsuario, lo que le proporciona atributos comunes (id, nombre, apellido, correo) y la obligación de implementar el métodomostrarPerfil()de la interfazPerfil. Esto garantiza uniformidad en la presentación de datos entre los distintos tipos de usuarios.
private Alumno alumno;- Función:
Este atributo establece una relación de asociación entre el tutor y un alumno. Es decir, cada tutor está vinculado a un objeto
Alumno, lo cual permite acceder a la información y calificación de dicho alumno. - Ventaja: Facilita la gestión y seguimiento académico, permitiendo que el tutor pueda revisar y mostrar la calificación del alumno asignado.
- Función:
Este atributo establece una relación de asociación entre el tutor y un alumno. Es decir, cada tutor está vinculado a un objeto
public Tutor(Alumno alumno, int id, String nombre, String apellido, String correo)- Objetivo:
Inicializa un objeto
Tutorasignándole tanto los datos heredados deUsuariocomo el alumno que supervisa. - Uso de
super: Llama al constructor de la clase padre (Usuario) para establecer los atributos básicos y, a continuación, asigna el alumno a su atributo local.
- Objetivo:
Inicializa un objeto
- Getters y Setters para
alumno:public Alumno getAlumno()ypublic void setAlumno(Alumno alumno)Permiten obtener y modificar el alumno asociado al tutor, siguiendo el principio de encapsulamiento.
- Getters para
nombreyapellido:public String getNombre()ypublic String getApellido()Aunque ya se heredan deUsuario, se proporcionan para acceder directamente a estos atributos desde el contexto de un tutor. Nota: La implementación accede directamente asuper.nombreysuper.apellido, aprovechando la herencia.
mostrarCalificacion()- Función:
Este método imprime en consola el nombre del estudiante y su calificación, obteniendo los datos a través de los métodos del objeto
Alumno. - Importancia: Permite que el tutor muestre de manera clara y rápida el rendimiento académico del alumno asignado, lo que es vital para el seguimiento y asesoramiento educativo.
- Función:
Este método imprime en consola el nombre del estudiante y su calificación, obteniendo los datos a través de los métodos del objeto
mostrarPerfil()- Sobrescritura del método:
Al estar anotado con
@Override, este método redefine la forma en la que se muestra el perfil del tutor. - Contenido:
Imprime la información del tutor (ID, nombre, apellido, correo) y, adicionalmente, llama al método
mostrarPerfil()del alumno asociado para mostrar sus datos. - Ventaja: Proporciona una vista completa y relacionada de la información, integrando datos del tutor y del alumno bajo su supervisión.
- Sobrescritura del método:
Al estar anotado con
En síntesis
- La clase
Tutorcombina la herencia deUsuariocon una asociación directa a un objetoAlumno, facilitando el seguimiento académico. - El constructor establece de manera clara la relación entre tutor y alumno, mientras que los getters y setters aseguran un acceso controlado a los datos.
- Los métodos de visualización:
mostrarCalificacion(): Se enfoca en detallar la información académica del alumno.mostrarPerfil(): Ofrece una vista integral del perfil del tutor junto con los datos del alumno asignado.
- Clase Abstracta:
Usuarioes una clase abstracta, lo que significa que no puede ser instanciada directamente. Se utiliza como base para que otras clases (como Alumno, Maestro y Tutor) hereden atributos y comportamientos comunes.- Ventaja: Facilita la reutilización de código y garantiza consistencia en la representación de los datos básicos de cualquier usuario en el sistema.
- Implementación de la interfaz
Perfil: Al implementar la interfazPerfil, la clase se compromete a definir el métodomostrarPerfil(), lo cual asegura que todas las clases derivadas tendrán una manera estándar de mostrar la información del usuario.
protected int id;protected String nombre;protected String apellido;protected String correo;Estos atributos representan la información básica que comparten todos los usuarios:id: Identificador único para cada usuario.nombreyapellido: Datos personales que permiten identificar al usuario.correo: Información de contacto. Se declaran como protected para permitir que las clases derivadas puedan acceder directamente a ellos, manteniendo al mismo tiempo el principio de encapsulamiento al no ser públicos.
public Usuario(int id, String nombre, String apellido, String correo)- Función: Inicializa los atributos básicos del usuario con los valores proporcionados.
- Uso: Al ser invocado desde las clases hijas, garantiza que cada objeto derivado tenga correctamente inicializados sus datos fundamentales.
public int getId()- Propósito: Devuelve el identificador del usuario.
- Importancia: Permite la consulta del ID sin exponer directamente el atributo.
public void setNombre(String nombre)- Función: Permite actualizar el nombre del usuario.
- Beneficio: Facilita la modificación de datos de forma controlada, asegurando que cambios en el nombre se realicen de manera segura.
public void mostrarPerfil()- Funcionalidad: Imprime en consola la información básica del usuario, incluyendo el ID, nombre, apellido y correo electrónico.
- Implementación: Al no ser un método abstracto en esta clase, proporciona una implementación por defecto que puede ser sobrescrita en las clases derivadas si se requiere personalizar la presentación de la información.
- Beneficio: Permite una visualización homogénea y estandarizada del perfil de cualquier usuario, lo que es útil para depuración, informes o demostraciones.
En síntesis:
- La clase
Usuarioactúa como el cimiento para todas las demás clases de usuario en el sistema. Al centralizar la información básica y las funciones comunes, se promueve un diseño limpio y modular. - Con atributos protegidos y métodos públicos, se asegura que las clases hijas puedan heredar y extender la funcionalidad sin duplicar código, facilitando el mantenimiento y la escalabilidad del proyecto.
- La implementación del método
mostrarPerfil()establece un formato uniforme para la presentación de los datos, lo que se vuelve esencial al integrar y visualizar información de diferentes tipos de usuarios.
Esta clase es fundamental para el proyecto, ya que define la estructura básica y el comportamiento que comparten todos los usuarios, garantizando un diseño coherente y fácil de mantener en el contexto de la programación orientada a objetos.
✨¡Gracias por visitar este repositorio!✨