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.