Libri e iscritti
Fa parte della sezione Programmazione orientata agli oggetti del percorso Ruby di Coddy. Lezione 50 di 57.
In questo progetto costruirai il nucleo di un sistema bibliotecario. Un oggetto Library riceve comandi, uno per riga, e risponde a ciascuno di essi. In cinque passaggi imparerà ad aggiungere libri e membri, prestare e riprendere i libri, cercare nel catalogo e stampare un rapporto.
ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORTIl modello dei dati usa ciò che hai imparato in questa sezione. Book espone id e title in sola lettura e borrower tramite un accessor, con il predicato available?. Member conserva gli ID dei suoi prestiti in un array. Ogni classe si trova nel proprio file, book.rb, member.rb e library.rb, e la biblioteca conserva entrambi i tipi di oggetti in hash che vengono modificati solo dai suoi metodi:
class Book
attr_reader :id, :title
attr_accessor :borrower
def initialize(id, title)
@id = id
@title = title
@borrower = nil
end
def available?
borrower.nil?
end
end
books = { 1 => Book.new(1, "Dune") }
books[1].borrower = "ada"
puts books[1].available?Output:
falsehandle(line) divide il comando e dirama in base alla sua prima parola con case. Ogni ramo restituisce le proprie risposte come array, quindi un comando come REPORT può rispondere con più righe, mentre return esce in anticipo restituendo una risposta di errore. Il titolo di un libro può contenere spazi, quindi corrisponde a tutto ciò che viene dopo id:
parts = "ADD_BOOK 7 The Hobbit".split
id = parts[1].to_i
title = parts[2..].join(" ")
puts "#{id}: #{title}"Output:
7: The HobbitSfida
FacileCompleta Library#handle 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 distinta. I nomi dei membri sono parole minuscole singole, 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.rb, member.rb e library.rb. main.rb contiene il codice fornito per l'input/output e non può essere modificato.
Provalo tu
require_relative 'book'
require_relative 'member'
require_relative 'library'
# Codice di input/output fornito: lascialo così com'è
input = []
while (line = gets)
input << line.chomp
end
library = Library.new
input.each do |line|
library.handle(line).each { |reply| puts reply }
end
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 classiVariabili d'istanzaMetodi e selfto_s e inspectRipasso - Tessera della biblioteca4Incapsulamento
Metodi privatiMetodi protettiSetter privatiProteggere lo statoRiepilogo - Distributore automatico7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMetodi astratticase e classiRiepilogo - Metodi di pagamento10Pattern di progettazione Parte 2
Delegazione con ForwardablePattern DecoratorPattern BuilderPattern State2Metodi di accesso e self
Metodi di lettura e scritturaSetter personalizzatiself nei metodiIdentità e uguaglianzaRiepilogo - Elenco contatti5Ereditarietà
SottoclassiRidefinizione dei metodiChiamare superis_a? e antenatiRiepilogo - Paghe del personale8Metodi speciali
Uguaglianza e hashMetodi degli operatoriIndicizzazione e appendCollezioni personalizzateRiepilogo - Frazioni11Progetto: Gestione della biblioteca
Libri e iscrittiPrendere in prestito i libriEsercitati da solo: Compilatore Ruby online