Libri e iscritti
Fa parte della sezione Programmazione orientata agli oggetti del percorso Ruby di Coddy. Lezione 50 di 57.
In questo progetto costruisci il nucleo di un sistema bibliotecario. Un oggetto Library riceve comandi, uno per riga, e risponde a ciascuno. In cinque passaggi imparerà 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
REPORTIl modello dei dati usa ciò che insegna 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 solo i suoi metodi modificano:
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) suddivide il comando e dirama l’esecuzione in base alla sua prima parola con case. Ogni ramo restituisce le sue risposte come array, quindi un comando come REPORT può rispondere con diverse righe, mentre return termina prima con una risposta di errore. Il titolo di un libro può contenere spazi, quindi comprende tutto ciò che segue l'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 singole in minuscolo, gli ID dei libri sono numeri interi e l'input contiene solo i comandi descritti finora. Per qualsiasi altro comando, rispondi unknown command.
Il tuo codice va 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