Diseño de Clases para Gestión de Colección de Discos en JavaScript
Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones
Escrito el en español con un tamaño de 5,08 KB
Este documento presenta un diseño de clases en JavaScript para la gestión de una colección de discos. Se definen las clases Autor, Disco y Coleccion, junto con métodos para agregar, listar, eliminar, prestar y buscar discos. Además, se incluye un ejemplo de uso con precarga de datos.
Clase Autor
La clase Autor representa al autor de un disco.
// Clase Autor
class Autor {
constructor(nombre, fechanac) {
this.nombre = nombre;
this.fechanac = fechanac;
this.discosPublicados = [];
}
agregarDisco(disco) {
this.discosPublicados.push(disco);
}
}
Clase Disco
La clase Disco representa un disco individual.
// Clase Disco
class Disco {
constructor(nombre, autor, fechaPublicacion, tipo, localizacion, estado = "disponible") {
this.nombre = nombre;
this.autor = autor;
this.fechaPublicacion = fechaPublicacion;
this.tipo = tipo;
this.localizacion = localizacion; // Ejemplo: "Estantería 1, Posición 3"
this.estado = estado; // "disponible" o "prestado"
}
}
Clase Coleccion
La clase Coleccion gestiona la colección de discos, organizándolos en estanterías.
// Clase Coleccion
class Coleccion {
constructor() {
this.estanterias = []; // Cada estantería es un array de discos
}
agregarDisco(disco) {
// Buscar o crear una estantería con espacio
let estanteria = this.estanterias.find(e => e.length < 10);
if (!estanteria) {
estanteria = [];
this.estanterias.push(estanteria);
}
estanteria.push(disco);
disco.localizacion = `Estantería ${this.estanterias.indexOf(estanteria) + 1}, Posición ${estanteria.length}`;
}
listarDiscos(criterio = null, orden = "ascendente") {
let discos = this.estanterias.flat();
switch (criterio) {
case "tipo":
discos.sort((a, b) => a.tipo.localeCompare(b.tipo));
break;
case "fecha":
discos.sort((a, b) =>
orden === "ascendente"
? a.fechaPublicacion - b.fechaPublicacion
: b.fechaPublicacion - a.fechaPublicacion
);
break;
default:
break;
}
// Mostrar en consola (puede adaptarse a HTML)
console.log(discos.map(d => `${d.nombre} - ${d.autor.nombre} (${d.fechaPublicacion})`));
return discos;
}
eliminarDisco(nombreDisco) {
// Usar filter para eliminar el disco
this.estanterias = this.estanterias.map(estanteria =>
estanteria.filter(disco => disco.nombre !== nombreDisco)
);
// Filtrar estanterías vacías
this.estanterias = this.estanterias.filter(estanteria => estanteria.length > 0);
console.log(`Disco "${nombreDisco}" eliminado.`);
}
prestarDisco(nombreDisco) {
const disco = this.buscarDisco(nombreDisco);
if (disco && disco.estado === "disponible") {
disco.estado = "prestado";
console.log(`Disco "${nombreDisco}" prestado con éxito.`);
return true;
}
console.log(`Disco "${nombreDisco}" no disponible para préstamo.`);
return false;
}
buscarDisco(nombreDisco) {
return this.estanterias.flat().find(d => d.nombre === nombreDisco);
}
listarAutores() {
const autores = new Set(this.estanterias.flat().map(d => d.autor.nombre));
console.log("Autores en la colección:");
autores.forEach(autor => console.log(autor));
}
}
Ejemplo de Uso
A continuación, se muestra un ejemplo de cómo utilizar las clases definidas.
// Precargar 20 discos
function precargarDiscos(coleccion) {
const autores = [
new Autor("Autor 1", "1980-05-12"),
new Autor("Autor 2", "1975-11-08"),
new Autor("Autor 3", "1990-03-22")
];
for (let i = 1; i <= 20; i++) {
const autor = autores[i % autores.length];
const disco = new Disco(`Disco ${i}`, autor, 2000 + i, `Tipo ${i % 5}`, "Pendiente");
autor.agregarDisco(disco);
coleccion.agregarDisco(disco);
}
}
// Crear la colección y precargar discos
const coleccion = new Coleccion();
precargarDiscos(coleccion);
// Ejemplo de uso
console.log("Lista inicial de discos:");
coleccion.listarDiscos();
// Agregar un nuevo disco
const nuevoDisco = new Disco("Disco 21", new Autor("Nuevo Autor", "1985-09-15"), 2024, "Rock", "Pendiente");
coleccion.agregarDisco(nuevoDisco);
console.log("\nDisco agregado: Disco 21");
coleccion.listarDiscos();
// Eliminar un disco
coleccion.eliminarDisco("Disco 5");
console.log("\nLista de discos después de eliminar 'Disco 5':");
coleccion.listarDiscos();
// Listar autores
coleccion.listarAutores();
// Prestar un disco
coleccion.prestarDisco("Disco 3");