Menu
Coddy logo textTech

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
REPORT

Il 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:

false

handle(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 Hobbit
challenge icon

Sfida

Facile

Completa Library#handle 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 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
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: Compilatore Ruby online