Testando o Sistema
Agora vamos criar uma função de demonstração que testa todas as funcionalidades:
/**
* Função de demonstração que testa o sistema completo
*/
function demonstrarSistema() {
console.log("=".repeat(60));
console.log("📚 SISTEMA DE GERENCIAMENTO DE BIBLIOTECA");
console.log("=".repeat(60));
ss
// 1. ADICIONANDO LIVROS
console.log("\n📝 1. ADICIONANDO LIVROS AO ACERVO");
console.log("-".repeat(60));
const livros = [
{
titulo: "Dom Casmurro",
autor: "Machado de Assis",
categoria: "Romance",
isbn: "9788535911664",
ano: 1899
},
{
titulo: "1984",
autor: "George Orwell",
categoria: "Ficção",
isbn: "9780451524935",
ano: 1949
},
{
titulo: "O Cortiço",
autor: "Aluísio Azevedo",
categoria: "Romance",
isbn: "9788508040629",
ano: 1890
},
{
titulo: "Clean Code",
autor: "Robert C. Martin",
categoria: "Técnico",
isbn: "9780132350884",
ano: 2008
}
];
livros.forEach(livro => {
const resultado = adicionarLivro(livro);
console.log(resultado.sucesso ? "✅" : "❌", resultado.mensagem);
});
// 2. BUSCANDO LIVROS
console.log("\n🔍 2. BUSCANDO LIVROS");
console.log("-".repeat(60));
console.log("\nBusca por título 'Dom':");
const buscaTitulo = buscarPorTitulo("Dom");
buscaTitulo.forEach(livro => {
console.log(` - ${livro.titulo} (${livro.autor})`);
});
console.log("\nLivros de George Orwell:");
const buscaAutor = buscarPorAutor("Orwell");
buscaAutor.forEach(livro => {
console.log(` - ${livro.titulo}`);
});
console.log("\nLivros de Romance:");
const filtroCategoria = filtrarPorCategoria("Romance");
console.log(` Encontrados: ${filtroCategoria.length} livros`);
// 3. EMPRÉSTIMOS
console.log("\n📤 3. GERENCIANDO EMPRÉSTIMOS");
console.log("-".repeat(60));
let resultado = emprestarLivro(1, "Maria Silva");
console.log(resultado.sucesso ? "✅" : "❌", resultado.mensagem);
resultado = emprestarLivro(2, "João Santos");
console.log(resultado.sucesso ? "✅" : "❌", resultado.mensagem);
console.log("\nLivros emprestados:");
const emprestados = listarEmprestados();
emprestados.forEach(livro => {
console.log(` - ${livro.titulo} → ${livro.emprestadoPara}`);
});
// 4. DEVOLUÇÕES
console.log("\n📥 4. DEVOLUÇÕES");
console.log("-".repeat(60));
resultado = devolverLivro(1);
console.log(resultado.sucesso ? "✅" : "❌", resultado.mensagem);
// 5. RELATÓRIOS
console.log("\n📊 5. RELATÓRIOS E ESTATÍSTICAS");
console.log("-".repeat(60));
console.log(`\nTotal de livros: ${contarTotal()}`);
console.log("\nLivros por categoria:");
const porCategoria = contarPorCategoria();
for (let categoria in porCategoria) {
console.log(` ${categoria}: ${porCategoria[categoria]}`);
}
const stats = calcularDisponibilidade();
console.log("\nDisponibilidade:");
console.log(` Total: ${stats.total}`);
console.log(` Disponíveis: ${stats.disponiveis}`);
console.log(` Emprestados: ${stats.emprestados}`);
console.log(` Taxa de disponibilidade: ${stats.taxaDisponibilidade}`);
console.log("\nAutores no acervo:");
const autores = listarAutores();
autores.forEach(autor => console.log(` - ${autor}`));
// 6. PERSISTÊNCIA
console.log("\n💾 6. SALVANDO E CARREGANDO DADOS");
console.log("-".repeat(60));
const dadosJson = salvarAcervo();
console.log("✅ Acervo salvo em formato JSON");
console.log("Tamanho do backup:", dadosJson.length, "caracteres");
console.log("\n" + "=".repeat(60));
console.log("✨ DEMONSTRAÇÃO CONCLUÍDA COM SUCESSO!");
console.log("=".repeat(60));
}
// Executar demonstração
demonstrarSistema();
Conceitos-Chave Aplicados
Vamos revisar os conceitos que você aplicou neste projeto:
Variáveis e Tipos de Dados
let acervo = []; // Array para lista de livros
let proximoId = 1; // Number para controle de IDs
const livro = { // Object para estruturar dados
titulo: "Dom Casmurro", // String
ano: 1899, // Number
disponivel: true // Boolean
};
Aprendizado: Diferentes tipos de dados servem propósitos específicos. Arrays para listas, objetos para estruturas complexas, booleanos para estados.
Operadores
// Comparação estrita
if (livro.id === id) { ... }
// Operadores lógicos
if (livro.disponivel && nomeUsuario) { ... }
// Operador de coalescência
const isbn = dadosLivro.isbn || null;
// Incremento
proximoId++;
Aprendizado: Operadores são ferramentas fundamentais para comparação, decisão e manipulação de valores.
Estruturas Condicionais
if (!livro) {
return { sucesso: false, mensagem: "Livro não encontrado" };
}
if (!livro.disponivel) {
return { sucesso: false, mensagem: "Livro já emprestado" };
}
Aprendizado: Condicionais permitem que o programa tome decisões baseadas em diferentes situações.
Loops e Iteração
// forEach para executar ação em cada elemento
livros.forEach(livro => {
const resultado = adicionarLivro(livro);
console.log(resultado.mensagem);
});
// for...in para percorrer propriedades de objeto
for (let categoria in porCategoria) {
console.log(`${categoria}: ${porCategoria[categoria]}`);
}
Aprendizado: Loops permitem processar coleções de dados de forma eficiente.
Arrays e Métodos
// filter - seleciona elementos
acervo.filter(livro => livro.disponivel)
// find - encontra primeiro elemento
acervo.find(livro => livro.id === id)
// findIndex - encontra posição
acervo.findIndex(livro => livro.id === id)
// map - transforma elementos
acervo.map(livro => livro.titulo)
// reduce - agrega dados
acervo.reduce((contador, livro) => {
contador[livro.categoria] = (contador[livro.categoria] || 0) + 1;
return contador;
}, {})
// push - adiciona ao final
acervo.push(novoLivro)
// splice - remove elemento específico
acervo.splice(indice, 1)
Aprendizado: Métodos de array são poderosas ferramentas para manipular listas de dados sem precisar escrever loops complexos.
Objetos
// Criação de objeto
const livro = {
id: 1,
titulo: "Dom Casmurro",
autor: "Machado de Assis"
};
// Acesso a propriedades
console.log(livro.titulo);
console.log(livro["autor"]);
// Spread operator para mesclar objetos
const atualizado = { ...livro, ...novosData };
// Verificar existência de propriedade
if (novosData.hasOwnProperty("titulo")) { ... }
Aprendizado: Objetos são ideais para representar entidades com múltiplas propriedades relacionadas.
Funções
// Função declarativa
function adicionarLivro(dadosLivro) {
// código
return resultado;
}
// Arrow function
const buscarPorTitulo = (titulo) => {
return acervo.filter(livro =>
livro.titulo.toLowerCase().includes(titulo.toLowerCase())
);
};
// Arrow function concisa
const contarTotal = () => acervo.length;
// Callback function
acervo.filter(livro => livro.disponivel)
Aprendizado: Funções organizam código em blocos reutilizáveis, melhoram legibilidade e facilitam manutenção.
Strings
// Template literals
`Livro "${livro.titulo}" emprestado para ${nomeUsuario}`
// Métodos de string
titulo.toLowerCase()
titulo.trim()
titulo.includes(termoBusca)
// Concatenação
"Erro: " + erro.message
Aprendizado: Strings têm métodos poderosos para manipulação e formatação de texto.
Tratamento de Erros
try {
const dados = JSON.parse(jsonString);
// processar dados
} catch (erro) {
return {
sucesso: false,
mensagem: "Erro: " + erro.message
};
}
Aprendizado: Try-catch protege o programa de erros inesperados e permite tratamento adequado de falhas.