Livros e Membros
Parte da seção Programação orientada a objetos do Journey de Ruby da Coddy. Lição 50 de 57.
Neste projeto, você construirá o núcleo de um sistema de biblioteca. Um objeto Library recebe comandos, um por linha, e responde a cada um deles. Ao longo de cinco etapas, ele aprende a adicionar livros e membros, emprestar e devolver livros, pesquisar o catálogo e imprimir um relatório.
ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORTO modelo de dados usa o que esta seção ensinou. Book expõe id e title somente para leitura e borrower por meio de um acessor, com o predicado available?. Member mantém os IDs de seus empréstimos em um array. Cada classe fica em seu próprio arquivo, book.rb, member.rb e library.rb, e a biblioteca mantém os dois tipos de objetos em hashes que somente seus próprios métodos acessam:
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?Saída:
falsehandle(line) divide o comando e ramifica com base em sua primeira palavra usando case. Cada ramificação retorna suas respostas como um array, portanto um comando como REPORT pode responder com várias linhas, e return sai antecipadamente com uma resposta de erro. O título de um livro pode conter espaços, então ele corresponde a tudo depois do id:
parts = "ADD_BOOK 7 The Hobbit".split
id = parts[1].to_i
title = parts[2..].join(" ")
puts "#{id}: #{title}"Saída:
7: The HobbitDesafio
FácilComplete Library#handle para os dois primeiros comandos:
ADD_BOOK id title: armazene um novo livro disponível e respondaadded book 1: Dune; quando o id já estiver em uso, respondabook 1 exists.JOIN name: adicione um membro e respondawelcome ada; quando o nome já existir, respondaada is already a member.
O código fornecido passa cada linha de entrada para library.handle(line) e imprime cada resposta retornada em sua própria linha. Os nomes dos membros são palavras únicas em letras minúsculas, os ids dos livros são números inteiros, e a entrada contém apenas os comandos descritos até agora. Qualquer outro comando responde unknown command.
Seu código deve estar em book.rb, member.rb e library.rb. main.rb contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
require_relative 'book'
require_relative 'member'
require_relative 'library'
# Código de entrada/saída fornecido: mantenha-o 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 lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação orientada a objetos
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesVariáveis de InstânciaMétodos e selfto_s e inspectRevisão - Cartão da Biblioteca4Encapsulamento
Métodos privadosMétodos protegidosSetters privadosProtegendo o estadoRevisão - Máquina de venda automática7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMétodos Abstratoscase e ClassesRevisão - Métodos de Pagamento2Acessores e self
Leitores e GravadoresSetters Personalizadosself nos MétodosIdentidade e IgualdadeRecapitulação - Lista de Contatos5Herança
SubclassesSobrescrita de métodosChamando superis_a? e ancestraisRevisão - Folha de pagamento da equipe8Métodos Especiais
Igualdade e hashMétodos de OperadoresIndexação e AdiçãoColeções PersonalizadasRevisão - Frações11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Compilador de Ruby online