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
REPORTEl 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:
falsehandle(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 HobbitDesafío
FácilCompleta Library#handle para los dos primeros comandos:
ADD_BOOK id title: almacena un libro nuevo disponible y respondeadded book 1: Dune; cuando el id ya está ocupado, respondebook 1 exists.JOIN name: añade un miembro y respondewelcome ada; cuando el nombre ya existe, respondeada 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
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
1Clases y objetos
Trabajar con archivosDefinir clasesVariables de instanciaMétodos y selfto_s e inspectRepaso: tarjeta de biblioteca4Encapsulación
Métodos privadosMétodos protegidosAsignadores privadosProtección del estadoRepaso: máquina expendedora7Polimorfismo y tipado pato
PolimorfismoTipado patoMétodos abstractoscase y clasesRepaso: métodos de pago2Accesores y self
Lectores y escritoresSetters personalizadosself en los métodosIdentidad e igualdadRepaso: lista de contactos5Herencia
SubclasesSobrescritura de métodosLlamar a superis_a? y ancestrosRepaso - Nómina del personal8Métodos especiales
Igualdad y hashMétodos de operadoresIndexación y adiciónColecciones personalizadasRepaso: fracciones11Proyecto: Gestión de biblioteca
Libros y miembrosPréstamo de librosPractica por tu cuenta: Compilador de Ruby online