Menu
Coddy logo textTech

Interface do Administrador

Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy. Lição 81 de 87.

challenge icon

Desafio

Fácil

Vamos expandir seu Sistema de Gerenciamento de Biblioteca com uma interface de administração! Uma biblioteca real precisa de recursos administrativos: adicionar novos livros à coleção, remover livros desatualizados e cadastrar novos membros. Você criará uma interface que define essas operações administrativas e as implementará em uma classe de administração dedicada.

Você continuará desenvolvendo seu código existente em cinco arquivos:

  • Book.java: Mantenha sua classe Book com todas as funcionalidades existentes: isbn, title, author, isAvailable, borrowedBy, getDetails() e os getters/setters apropriados.
  • User.java: Mantenha sua classe User inalterada, com id, name, o ArrayList borrowedBooks, borrowBook(), returnBook(), getBorrowedCount() e toString().
  • Library.java: Mantenha sua classe Library com todos os métodos existentes. Adicione um novo método removeBook(String isbn) que encontre e remova um livro da coleção pelo seu ISBN. O método deve retornar true se o livro for encontrado e removido, e false caso contrário. Um livro só pode ser removido se estiver disponível no momento (não emprestado).
  • LibraryAdmin.java: Crie uma interface chamada LibraryAdmin que defina o contrato para operações administrativas. Sua interface deve declarar três métodos:
    • addBook(String isbn, String title, String author) - retorna um booleano indicando sucesso
    • removeBook(String isbn) - retorna um booleano indicando sucesso
    • registerUser(String id, String name) - retorna um booleano indicando sucesso

    Em seguida, crie uma classe chamada AdminService que implemente essa interface. O AdminService deve manter uma referência a uma Library (passada por meio de seu construtor) e implementar os três métodos delegando as operações à Library enquanto adiciona feedback apropriado. Ao adicionar um livro, crie um novo Book e adicione-o à biblioteca. Ao cadastrar um usuário, crie um novo User e cadastre-o.

  • Main.java: Demonstre seu sistema de administração! Você receberá uma série de comandos administrativos como uma única string separada por vírgulas. Cada comando segue um destes formatos:
    • ADD_BOOK:isbn:title:author
    • REMOVE_BOOK:isbn
    • REGISTER_USER:id:name
    • BORROW:userId:isbn

    Crie uma Library e um AdminService. Processe cada comando e imprima o resultado:

    • Para ADD_BOOK: imprima Added: [title] em caso de sucesso
    • Para REMOVE_BOOK: imprima Removed: [isbn] em caso de sucesso ou Cannot remove: [isbn] se o livro não existir ou estiver emprestado
    • Para REGISTER_USER: imprima Registered: [name]
    • Para BORROW: use a funcionalidade existente de empréstimo da biblioteca

    Depois de processar todos os comandos, imprima Library status:, seguido pelos detalhes e pelo status de disponibilidade de cada livro no formato [details] - [Available/Borrowed].

Você receberá uma entrada: uma string de comandos separados por vírgulas.

Por exemplo, com a entrada REGISTER_USER:U001:Alice,ADD_BOOK:ISBN-001:Clean Code:Robert Martin,ADD_BOOK:ISBN-002:Design Patterns:Gang of Four,BORROW:U001:ISBN-001,REMOVE_BOOK:ISBN-001,REMOVE_BOOK:ISBN-002, sua saída seria:

Registered: Alice
Added: Clean Code
Added: Design Patterns
Alice borrowed Clean Code
Cannot remove: ISBN-001
Removed: ISBN-002
Library status:
[ISBN-001] Clean Code by Robert Martin - Borrowed

Observe como a interface de administração fornece um contrato claro para as operações administrativas, enquanto a implementação de AdminService trata da lógica efetiva. O sistema impede corretamente a remoção de um livro emprestado, ao mesmo tempo que permite a remoção de livros disponíveis. Essa separação entre interface e implementação é um princípio fundamental de OOP que torna seu código mais fácil de manter e testar!

Experimente você mesmo

import java.util.Scanner;
import java.util.ArrayList;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Ler os comandos separados por vírgula
        String input = scanner.nextLine();
        String[] commands = input.split(",");
        
        // Criar Library e AdminService
        Library library = new Library();
        AdminService adminService = new AdminService(library);
        
        // Processar cada comando
        for (String command : commands) {
            String[] parts = command.split(":");
            String operation = parts[0];
            
            if (operation.equals("ADD_BOOK")) {
                String isbn = parts[1];
                String title = parts[2];
                String author = parts[3];
                if (adminService.addBook(isbn, title, author)) {
                    System.out.println("Added: " + title);
                }
            } else if (operation.equals("REMOVE_BOOK")) {
                String isbn = parts[1];
                if (adminService.removeBook(isbn)) {
                    System.out.println("Removed: " + isbn);
                } else {
                    System.out.println("Cannot remove: " + isbn);
                }
            } else if (operation.equals("REGISTER_USER")) {
                String id = parts[1];
                String name = parts[2];
                if (adminService.registerUser(id, name)) {
                    System.out.println("Registered: " + name);
                }
            } else if (operation.equals("BORROW")) {
                String userId = parts[1];
                String isbn = parts[2];
                library.borrowBook(userId, isbn);
            }
        }
        
        // Print library status
        System.out.println("Library status:");
        ArrayList<Book> allBooks = library.getAllBooks();
        for (Book book : allBooks) {
            String status = book.isAvailable() ? "Available" : "Borrowed";
            System.out.println(book.getDetails() + " - " + status);
        }
    }
}

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de Java online