Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

[Sugerencia] aplicacion al encapsulamiento a la clase Película

package com.alura.screenmatch.modelos;

import java.time.Year;

/**
 * Representa una película con datos básicos y sistema de evaluaciones.
 * Aplica encapsulamiento, validaciones y formato profesional.
 */
public class Pelicula {

    private String nombre;
    private int fechaDeLanzamiento;
    private int duracionEnMinutos;
    private boolean incluidoEnPlan;
    private double sumaEvaluaciones = 0.0;
    private int totalEvaluaciones = 0;

    /** Constructor por defecto */
    public Pelicula() { }

    // ——— Getters ——————————————————————————————————————————————

    /**
     * @return el título de la película
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @return el año de estreno
     */
    public int getFechaDeLanzamiento() {
        return fechaDeLanzamiento;
    }

    /**
     * @return la duración en minutos
     */
    public int getDuracionEnMinutos() {
        return duracionEnMinutos;
    }

    /**
     * @return true si la película está incluida en el plan
     */
    public boolean isIncluidoEnPlan() {
        return incluidoEnPlan;
    }

    /**
     * @return la cantidad total de evaluaciones recibidas
     */
    public int getTotalEvaluaciones() {
        return totalEvaluaciones;
    }

    // ——— Setters con validación ——————————————————————————————————

    /**
     * Asigna el nombre de la película.
     * @param nombre no puede ser null o vacío
     * @throws IllegalArgumentException si el nombre es inválido
     */
    public void setNombre(String nombre) {
        if (nombre == null || nombre.isBlank()) {
            throw new IllegalArgumentException("El nombre no puede quedar vacío.");
        }
        this.nombre = nombre;
    }

    /**
     * Asigna el año de lanzamiento.
     * @param fechaDeLanzamiento entre 1888 y el año actual
     * @throws IllegalArgumentException si el año es inválido
     */
    public void setFechaDeLanzamiento(int fechaDeLanzamiento) {
        int añoActual = Year.now().getValue();
        if (fechaDeLanzamiento < 1888 || fechaDeLanzamiento > añoActual) {
            throw new IllegalArgumentException("Año de lanzamiento inválido: " + fechaDeLanzamiento);
        }
        this.fechaDeLanzamiento = fechaDeLanzamiento;
    }

    /**
     * Asigna la duración en minutos.
     * @param duracionEnMinutos mayor que 0
     * @throws IllegalArgumentException si la duración no es positiva
     */
    public void setDuracionEnMinutos(int duracionEnMinutos) {
        if (duracionEnMinutos <= 0) {
            throw new IllegalArgumentException("La duración debe ser mayor a cero.");
        }
        this.duracionEnMinutos = duracionEnMinutos;
    }

    /**
     * Marca si la película está incluida en el plan.
     */
    public void setIncluidoEnPlan(boolean incluidoEnPlan) {
        this.incluidoEnPlan = incluidoEnPlan;
    }

    // ——— Métodos de negocio ————————————————————————————————————

    /**
     * Imprime por consola la ficha técnica de la película
     * (incluye nombre, año, duración, plan y calificación media).
     */
    public void MuestraFichaTecnica() {
        System.out.println("===== FICHA TÉCNICA =====");
        System.out.println("Nombre:              " + nombre);
        System.out.println("Año de lanzamiento:  " + fechaDeLanzamiento);
        System.out.println("Duración (min):      " + duracionEnMinutos);
        System.out.println("Incluida en plan:    " + (incluidoEnPlan ? "Sí" : "No"));
        System.out.printf ("Calif. media:         %.2f (%d evaluaciones)%n",
                           CalcularMedia(), totalEvaluaciones);
        System.out.println("========================");
    }

    /**
     * Agrega una nueva nota al acumulado de evaluaciones.
     * @param nota valor entre 0.0 y 10.0
     * @throws IllegalArgumentException si la nota está fuera de rango
     */
    public void Evalua(double nota) {
        if (nota < 0.0 || nota > 10.0) {
            throw new IllegalArgumentException("La nota debe estar entre 0 y 10.");
        }
        sumaEvaluaciones += nota;
        totalEvaluaciones++;
    }

    /**
     * Calcula el promedio de todas las evaluaciones.
     * @return promedio (0.0 si no hay evaluaciones)
     */
    public double CalcularMedia() {
        return totalEvaluaciones == 0
            ? 0.0
            : sumaEvaluaciones / totalEvaluaciones;
    }

    @Override
    public String toString() {
        return String.format("%s (%d) – %d min – Plan: %s – ★ %.1f",
                nombre,
                fechaDeLanzamiento,
                duracionEnMinutos,
                incluidoEnPlan ? "Sí" : "No",
                CalcularMedia());
    }
}
1 respuesta

Hola Cristian, espero que estés bien

¡Gracias por compartir tu código! Parece que ya has hecho un gran trabajo aplicando el encapsulamiento en tu clase Pelicula. Has protegido los atributos de la clase haciéndolos privados y proporcionaste métodos getters y setters para acceder y modificar estos atributos, lo cual es una práctica esencial de encapsulamiento en programación orientada a objetos.

Aquí hay algunas sugerencias adicionales para asegurar que el encapsulamiento esté bien implementado:

  1. Validaciones en Setters: Ya has implementado validaciones en los métodos set para asegurar que los valores asignados sean válidos. Esto protege la integridad de los datos de tu objeto Pelicula.

  2. Métodos de Negocio: Tienes métodos como Evalua y CalcularMedia que encapsulan la lógica de negocio relacionada con las evaluaciones de las películas. Esto es excelente porque mantiene la lógica centralizada y fácil de mantener.

  3. Consistencia en Nombres de Métodos: Asegúrate de que los nombres de los métodos sigan una convención consistente. Por ejemplo, en Java, es común que los métodos sigan el formato camelCase, por lo que podrías considerar cambiar MuestraFichaTecnica a muestraFichaTecnica.

  4. Uso de toString: Has sobrescrito el método toString, lo cual es útil para representar tu objeto como una cadena de texto. Esto es particularmente útil para depuración y registro de información.

  5. Comentarios y Documentación: Continúa documentando tu código como lo has hecho. Los comentarios y la documentación son útiles para cualquier persona (incluyéndote a ti mismo en el futuro) que necesite entender el propósito y funcionamiento de tu código.

En resumen, parece que estás en el camino correcto con el encapsulamiento en tu clase Pelicula. Sigue practicando y refinando tus habilidades de programación orientada a objetos.

Espero haber ayudado y buenos estudios!