009. Ejercicios de lógica de programación en Javascript

En este último ejercicio vamos a trabajar con clases en Javascript, para ello vamos a crear una clase denominada Peliculas, que englobará tanto propiedades como métodos, y será una pequeña aplicación para mostrar información acerca de películas. Veamos lo que va a contener dicha clase:

  • La clase recibirá un objeto al momento de instanciarse con los siguientes datos:
    • id de la película en IMDB
    • Título
    • Director
    • Año de estreno
    • País de origen
    • Género
    • Calificación
  • Todos los datos del objeto son obligatorios
  • Hay que validar que el IMDB tenga 9 caracteres, los 2 primeros son letras y el resto números
  • El título no debe rebasar los 100 caracteres
  • El director no debe rebasar los 50 caracteres
  • El año de estreno es un número entero de 4 dígitos
  • El país o países son introducidos en forma de array
  • Los géneros, igualmente introducidos en forma de array
  • Dichos géneros deben estar dentro de los géneros aceptados
  • Crear método estático que devuelva los géneros aceptados
  • La calificación sea un número entre 1 y 10, pudiendo ser decimal de una posición
  • Método que devuelva toda la ficha técnica de la película
  • A partir de un array con la información de 3 películas, generar 3 instancias de la clase de forma automatizada, e imprimir la ficha técnica de cada película

Los géneros aceptados son los siguientes: Action, Adult, Adventure, Animation, Biography, Comedy, Crime, Documentary, Drama, Family, Fantasy, Film Noir, Game-Show, History, Horror, Musical, Music, Mystery, News, Reality-TV, Romance, Sci-Fi, Short, Sport, Talk-Show, Thriller, War, Western

Este es el ejm completo

Ejm

<!DOCTYPE html>
<html lang="es">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Clase Películas</title>
  </head>

  <body>
    <h1>Clase Películas</h1>

    <script>
      class Pelicula {
        constructor({
          id,
          titulo,
          director,
          estreno,
          pais,
          generos,
          calificacion,
        }) {
          this.id = id;
          this.titulo = titulo;
          this.director = director;
          this.estreno = estreno;
          this.pais = pais;
          this.generos = generos;
          this.calificacion = calificacion;
          this.validarIMDB(id);
          this.validarTitulo(titulo);
          this.validarDirector(director);
          this.validarEstreno(estreno);
          this.validarPais(pais);
          this.validarGeneros(generos);
          this.validarCalificacion(calificacion);
        }

        // Atributo estático obtenedor
        static get listaGeneros() {
          return [
            "Action",
            "Adult",
            "Adventure",
            "Animation",
            "Biography",
            "Comedy",
            "Crime",
            "Documentary",
            "Drama",
            "Family",
            "Fantasy",
            "Film Noir",
            "Game-Show",
            "History",
            "Horror",
            "Musical",
            "Music",
            "Mystery",
            "News",
            "Reality-TV",
            "Romance",
            "Sci-Fi",
            "Short",
            "Sport",
            "Talk-Show",
            "Thriller",
            "War",
            "Western",
          ];
        }

        // Método estático que consume el atributo estático listaGeneros
        static generosAceptados() {
          return console.log(
            `Los géneros aceptados son: ${Pelicula.listaGeneros.join(", ")}`
          );
        }

        // Función que valida cadenas
        validarCadena(propiedad, valor) {
          if (!valor) return console.log(`${propiedad} "${valor}" está vacío`);

          if (typeof valor !== "string")
            return console.log(
              `${propiedad} "${valor}" ingresado no es una cadena de texto`
            );

          // Si todo va bien le decimos que es true (todo ok)
          return true;
        }

        // Función que valida cadena y longitud de la misma
        validarLongitudCadena(propiedad, valor, longitud) {
          if (valor.length > longitud)
            return console.log(
              `${propiedad} "${valor}" excede el número de caracteres permitidos (${longitud}).`
            );

          // Si todo va bien le decimos que es true (todo ok)
          return true;
        }

        // Función para validar número
        validarNumero(propiedad, valor) {
          if (!valor) return console.log(`${propiedad} "${valor}" está vacío`);

          if (typeof valor !== "number")
            return console.log(
              `${propiedad} "${valor}" ingresado no es un número`
            );

          // Si todo ok, devuelve true
          return true;
        }

        // Función que valida arrays
        validarArray(propiedad, valor) {
          if (!valor) return console.log(`${propiedad} "${valor}" está vacío`);

          if (!(valor instanceof Array))
            return console.log(
              `${propiedad} "${valor}" ingresado no es un array`
            );

          if (valor.length === 0)
            return console.log(`${propiedad} "${valor}" no tiene datos`);

          for (let cadena of valor) {
            if (typeof cadena !== "string")
              return console.log(
                `El valor "${cadena}" ingresado no es una cadena de texto`
              );
          }

          // Si todo ok, devuelve true
          return true;
        }

        // Función que valida el IMDB
        validarIMDB(id) {
          if (this.validarCadena("IMDB id", id)) {
            if (!/^([a-z]){2}([0-9]){7}$/.test(id)) {
              return console.log(`IMDB id "${id}" no es válido, debe tener 9 caracteres
              , los 2 primeros letras minúsculas, los 7 restantes números`);
            }
          }
        }

        // Función que valida el título
        validarTitulo(titulo) {
          if (this.validarCadena("Título", titulo)) {
            this.validarLongitudCadena("Título", titulo, 100);
          }
        }

        // Función que valida el director
        validarDirector(director) {
          if (this.validarCadena("Director", director)) {
            this.validarLongitudCadena("Director", director, 50);
          }
        }

        // Función que valida un dígito de 4 dígitos
        validarEstreno(estreno) {
          if (this.validarNumero("Año de estreno", estreno)) {
            if (!/^([0-9]){4}$/.test(estreno)) {
              return console.log(
                `Año de estreno "${estreno}" no es válido, debe tener 4 dígitos.`
              );
            }
          }
        }

        // Función que valida el país
        validarPais(pais) {
          this.validarArray("País", pais);
        }

        // Función que valida los géneros
        validarGeneros(generos) {
          if (this.validarArray("Géneros", generos)) {
            for (let genero of generos) {
              // console.log(genero, Pelicula.listaGeneros.includes(genero));
              if (!Pelicula.listaGeneros.includes(genero)) {
                console.log(`Género(s) incorrecto(s) "${generos.join(", ")}"`);
                Pelicula.generosAceptados();
              }
            }
          }
        }
        // Función que valida la calificación
        validarCalificacion(calificacion) {
          if (this.validarNumero("Calificación", calificacion)) {
            return calificacion < 0 || calificacion > 10
              ? console.log(
                  "La calificación tiene que estar en un rango entre 0 y 10"
                )
              : (this.calificacion = calificacion.toFixed(1));
          }
        }

        // Función que muestra la ficha técnica de una película
        fichaTecnica() {
          console.log(
            `Ficha técnica:\nTítulo: ${this.titulo}\nDirector: ${
              this.director
            }\nAño: ${this.estreno}\nPaís: ${this.pais.join(
              " - "
            )}\nGéneros: ${this.generos.join(", ")}\nCalificación: ${
              this.calificacion
            }\nIMDB id: ${this.id}`
          );
        }
      }

      // Pelicula.generosAceptados();

      const pelicula = new Pelicula({
        id: "tt1234567",
        titulo: "Título de la película",
        director: "Director de la película",
        estreno: 1987,
        pais: ["España", "Francia"],
        generos: ["Sport", "Comedy"],
        calificacion: 9,
      });

      pelicula.fichaTecnica();

      const misPeliculas = [
        {
          id: "tt01234567",
          titulo: "Mazapan",
          director: "Almodovar",
          estreno: 1984,
          pais: ["España"],
          generos: ["Horror"],
          calificacion: 2,
          id: "tt1234567",
        },
        {
          id: "tt01234567",
          titulo: "Hola",
          director: "Almodovar",
          estreno: 1984,
          pais: ["España"],
          generos: ["Horror"],
          calificacion: 2,
          id: "tt1234567",
        },
        {
          id: "tt01234567",
          titulo: "Adios",
          director: "Almodovar",
          estreno: 1984,
          pais: ["España"],
          generos: ["Horror"],
          calificacion: 2,
          id: "tt1234567",
        },
      ];

      misPeliculas.forEach((el) => new Pelicula(el).fichaTecnica());
    </script>
  </body>
</html>
Scroll al inicio