Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
0
respuestas

[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());
    }
}