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 di essi. In cinque passaggi imparerai ad aggiungere libri e membri, prestare e riprendere i libri, cercare nel catalogo e stampare un report:
ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORTIl modello dei dati utilizza ciò che hai imparato in questa sezione. Book e Member risiedono ciascuno nel proprio file. Il borrower di un libro può essere letto ovunque, ma può essere modificato solo tramite lendTo e giveBack, e un membro espone gli ID dei propri 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 adahandle(line) suddivide il comando e usa un when sulla sua prima parola. Ogni ramo restituisce le proprie risposte come List<String>, quindi un comando come REPORT può rispondere con più righe, mentre un return anticipato restituisce un rifiuto. Il titolo di un libro può contenere spazi, quindi è 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 HobbitSfida
FacileCompleta Library.handle(line) per i primi due comandi:
ADD_BOOK <id> <title>: memorizza un nuovo libro disponibile e rispondiadded book 1: Dune; se l’id è già occupato, rispondibook 1 exists.JOIN <name>: aggiungi un membro e rispondiwelcome ada; se il nome esiste già, rispondiada 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 composte da lettere minuscole, 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 fornito per l’input/output 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)
}
}
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
1Classi e oggetti
Lavorare con i fileDefinire le classiCostruttori primariBlocchi init e convalidaCostruttori secondariRiepilogo - Tessera della biblioteca4Ereditarietà
Classi aperte e sottoclassiRidefinizione dei membrisuper e costruttoriClassi astratteRiepilogo - Elenco del personale2Proprietà e incapsulamento
Accessor personalizzatiModificatori di visibilitàSetter privatilazy e lateinitRipasso - Conto bancario5Interfacce
Dichiarare le interfacceMetodi predefinitiInterfacce multipleLe interfacce come tipiRiepilogo - Metodi di pagamento8Tipi generici
Funzioni genericheClassi genericheVincoli sui tipiVarianza con in e outRiepilogo - Coda con priorità11Progetto: Gestione della biblioteca
Libri e sociPrendere in prestito i libriEsercitati da solo: Playground Kotlin