Menu
Coddy logo textTech

Książki i czytelnicy

Część sekcji Programowanie obiektowe ścieżki Ruby w Coddy. Lekcja 50 z 57.

W tym projekcie zbudujesz podstawowe elementy systemu bibliotecznego. Obiekt Library odbiera polecenia, po jednym w każdym wierszu, i odpowiada na każde z nich. W ciągu pięciu kroków nauczy się dodawać książki i członków, wypożyczać i zwracać książki, przeszukiwać katalog oraz drukować raport.

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

Model danych wykorzystuje to, czego uczy ta sekcja. Book udostępnia tylko do odczytu id i title, a borrower za pomocą akcesora, oraz predykat available?. Member przechowuje identyfikatory swoich wypożyczeń w tablicy. Każda klasa znajduje się we własnym pliku: book.rb, member.rb i library.rb, a biblioteka przechowuje oba rodzaje obiektów w hashach, do których dostęp mają wyłącznie jej własne metody:

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?

Wynik:

false

handle(line) dzieli polecenie i wybiera gałąź na podstawie jego pierwszego słowa za pomocą case. Każda gałąź zwraca swoje odpowiedzi jako tablicę, więc polecenie takie jak REPORT może zwrócić kilka wierszy, a return kończy działanie wcześniej, zwracając odpowiedź z błędem. Tytuł książki może zawierać spacje, więc obejmuje wszystko po id:

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

Wynik:

7: The Hobbit
challenge icon

Wyzwanie

Łatwy

Uzupełnij Library#handle dla dwóch pierwszych poleceń:

  • ADD_BOOK id title: zapisz nową dostępną książkę i odpowiedz added book 1: Dune; jeśli identyfikator jest zajęty, odpowiedz book 1 exists.
  • JOIN name: dodaj członka i odpowiedz welcome ada; jeśli taka nazwa już istnieje, odpowiedz ada is already a member.

Dostarczony kod przekazuje każdy wiersz wejściowy do library.handle(line) i wyświetla każdą zwróconą odpowiedź w osobnym wierszu. Nazwy członków składają się z pojedynczych słów pisanych małymi literami, identyfikatory książek są liczbami całkowitymi, a wejście zawiera tylko opisane dotychczas polecenia. Na każde inne polecenie odpowiedz unknown command.

Umieść kod w plikach book.rb, member.rb i library.rb. Plik main.rb zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

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

# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
input = []
while (line = gets)
  input << line.chomp
end
library = Library.new
input.each do |line|
  library.handle(line).each { |reply| puts reply }
end
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Ruby online