Menu
Coddy logo textTech

Libri e soci

Fa parte della sezione Programmazione orientata agli oggetti del percorso Kotlin di Coddy. Lezione 50 di 57.

In questo progetto costruisci il nucleo di un sistema bibliotecario. Una classe Library riceve comandi, uno per riga, e risponde a ciascuno. In cinque passaggi impara ad aggiungere libri e membri, prestare e riprendere libri, cercare nel catalogo e stampare un rapporto:

ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORT

Il modello dei dati usa ciò che questa sezione ha insegnato. Book e Member risiedono ciascuno nel proprio file. Il borrower di un libro può essere letto ovunque, ma viene modificato solo tramite lendTo e giveBack, e un membro espone gli ID dei suoi prestiti come List di sola lettura. La biblioteca li conserva entrambi in mappe private, quindi solo i suoi metodi possono modificarli:

class Book(val id: Int, val title: String) {
    var borrower: String? = null
        private set
    val isAvailable: Boolean
        get() = borrower == null
    fun lendTo(name: String) { borrower = name }
}

All'interno di main:

val books = mutableMapOf<Int, Book>()
books[1] = Book(1, "Dune")
books.getValue(1).lendTo("ada")
println("${books.getValue(1).isAvailable} ${books.getValue(1).borrower}")

Output:

false ada

handle(line) suddivide il comando e usa un when sulla sua prima parola. Ogni ramo restituisce le risposte come List<String>, così un comando come REPORT può rispondere con diverse righe e un return anticipato restituisce un rifiuto. Il titolo di un libro può contenere spazi, quindi comprende tutto ciò che segue l'id:

Dentro main:

val p = "ADD_BOOK 7 The Hobbit".split(" ")
val id = p[1].toInt()
val title = p.drop(2).joinToString(" ")
println("$id: $title")

Output:

7: The Hobbit
challenge icon

Sfida

Facile

Completa Library.handle(line) per i primi due comandi:

  • ADD_BOOK <id> <title>: memorizza un nuovo libro disponibile e rispondi added book 1: Dune; se l'id è già occupato, rispondi book 1 exists.
  • JOIN <name>: aggiungi un membro e rispondi welcome ada; se il nome esiste già, rispondi ada is already a member.

Il codice fornito passa ogni riga di input a library.handle(line) e stampa ogni risposta restituita su una riga separata. I nomi dei membri sono parole singole in minuscolo, gli ID dei libri sono numeri interi e l'input contiene solo i comandi descritti finora. Qualsiasi altro comando restituisce unknown command.

Il tuo codice va inserito in Book.kt, Member.kt e Library.kt. Main.kt contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

fun main() {
    // Codice di input/output fornito: lascialo così com'è
    val input = generateSequence(::readLine).toList()
    val library = Library()
    for (line in input) {
        for (reply in library.handle(line)) println(reply)
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Playground Kotlin