Menu
Coddy logo textTech

Libros y miembros

Parte de la sección Programación orientada a objetos del Journey de Ruby de Coddy. Lección 50 de 57.

En este proyecto construirás el núcleo de un sistema de biblioteca. Un objeto Library recibe comandos, uno por línea, y responde a cada uno. A lo largo de cinco pasos aprenderás a añadir libros y miembros, prestar y devolver libros, buscar en el catálogo e imprimir un informe.

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

El modelo de datos utiliza lo que se enseñó en esta sección. Book expone id y title como propiedades de solo lectura, y borrower mediante un accesor, con el predicado available?. Member mantiene los identificadores de sus préstamos en un array. Cada clase reside en su propio archivo, book.rb, member.rb y library.rb, y la biblioteca mantiene ambos tipos de objetos en hashes que solo sus propios métodos modifican:

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?

Salida:

false

handle(line) divide el comando y ramifica según su primera palabra con case. Cada rama devuelve sus respuestas como un arreglo, por lo que un comando como REPORT puede responder con varias líneas, y return sale antes con una respuesta de error. El título de un libro puede contener espacios, así que es todo lo que aparece después del id:

parts = "ADD_BOOK 7 The Hobbit".split
id = parts[1].to_i
title = parts[2..].join(" ")
puts "#{id}: #{title}"

Salida:

7: The Hobbit
challenge icon

Desafío

Fácil

Completa Library#handle para los dos primeros comandos:

  • ADD_BOOK id title: almacena un libro nuevo disponible y responde added book 1: Dune; cuando el id ya está ocupado, responde book 1 exists.
  • JOIN name: añade un miembro y responde welcome ada; cuando el nombre ya existe, responde ada is already a member.

El código proporcionado pasa cada línea de entrada a library.handle(line) e imprime cada respuesta devuelta en su propia línea. Los nombres de los miembros son palabras individuales en minúsculas, los ids de los libros son números enteros y la entrada contiene únicamente los comandos descritos hasta ahora. Cualquier otro comando responde unknown command.

Tu código debe estar en book.rb, member.rb y library.rb. main.rb contiene el código proporcionado de entrada/salida y no se puede editar.

Pruébalo tú mismo

require_relative 'book'
require_relative 'member'
require_relative 'library'

# Código de entrada/salida suministrado: déjalo como está
input = []
while (line = gets)
  input << line.chomp
end
library = Library.new
input.each do |line|
  library.handle(line).each { |reply| puts reply }
end
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de Ruby online